1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#ifndef EVENT_TEST_UTIL_H
17c29fa5a6Sopenharmony_ci#define EVENT_TEST_UTIL_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include <chrono>
20c29fa5a6Sopenharmony_ci#include <condition_variable>
21c29fa5a6Sopenharmony_ci#include <list>
22c29fa5a6Sopenharmony_ci#include <mutex>
23c29fa5a6Sopenharmony_ci#include <string>
24c29fa5a6Sopenharmony_ci#include <vector>
25c29fa5a6Sopenharmony_ci
26c29fa5a6Sopenharmony_ci#include <gtest/gtest.h>
27c29fa5a6Sopenharmony_ci
28c29fa5a6Sopenharmony_ci#include "accesstoken_kit.h"
29c29fa5a6Sopenharmony_ci#include "nativetoken_kit.h"
30c29fa5a6Sopenharmony_ci#include "token_setproc.h"
31c29fa5a6Sopenharmony_ci
32c29fa5a6Sopenharmony_ci#include "input_manager.h"
33c29fa5a6Sopenharmony_ci#include "singleton.h"
34c29fa5a6Sopenharmony_ci#include "window_utils_test.h"
35c29fa5a6Sopenharmony_ci#include "scene_board_judgement.h"
36c29fa5a6Sopenharmony_ci
37c29fa5a6Sopenharmony_cinamespace OHOS {
38c29fa5a6Sopenharmony_cinamespace MMI {
39c29fa5a6Sopenharmony_ciusing namespace Security::AccessToken;
40c29fa5a6Sopenharmony_ciusing Security::AccessToken::AccessTokenID;
41c29fa5a6Sopenharmony_cinamespace {
42c29fa5a6Sopenharmony_ciusing namespace testing::ext;
43c29fa5a6Sopenharmony_ciPermissionDef inputDispatchControlPermDef_ = {
44c29fa5a6Sopenharmony_ci    .permissionName = "ohos.permission.INPUT_CONTROL_DISPATCHING",
45c29fa5a6Sopenharmony_ci    .bundleName = "accesstoken_test",
46c29fa5a6Sopenharmony_ci    .grantMode = 1,
47c29fa5a6Sopenharmony_ci    .label = "label",
48c29fa5a6Sopenharmony_ci    .labelId = 1,
49c29fa5a6Sopenharmony_ci    .description = "test input agent",
50c29fa5a6Sopenharmony_ci    .availableLevel = APL_SYSTEM_CORE,
51c29fa5a6Sopenharmony_ci    .descriptionId = 1
52c29fa5a6Sopenharmony_ci};
53c29fa5a6Sopenharmony_ci
54c29fa5a6Sopenharmony_ciPermissionDef infoManagerTestPermDef_ = {
55c29fa5a6Sopenharmony_ci    .permissionName = "ohos.permission.INPUT_MONITORING",
56c29fa5a6Sopenharmony_ci    .bundleName = "accesstoken_test",
57c29fa5a6Sopenharmony_ci    .grantMode = 1,
58c29fa5a6Sopenharmony_ci    .label = "label",
59c29fa5a6Sopenharmony_ci    .labelId = 1,
60c29fa5a6Sopenharmony_ci    .description = "test input agent",
61c29fa5a6Sopenharmony_ci    .availableLevel = APL_SYSTEM_CORE,
62c29fa5a6Sopenharmony_ci    .descriptionId = 1,
63c29fa5a6Sopenharmony_ci};
64c29fa5a6Sopenharmony_ci
65c29fa5a6Sopenharmony_ciPermissionStateFull infoManagerTestState_ = {
66c29fa5a6Sopenharmony_ci    .permissionName = "ohos.permission.INPUT_MONITORING",
67c29fa5a6Sopenharmony_ci    .isGeneral = true,
68c29fa5a6Sopenharmony_ci    .grantStatus = { PermissionState::PERMISSION_GRANTED },
69c29fa5a6Sopenharmony_ci    .grantFlags = { 1 },
70c29fa5a6Sopenharmony_ci    .resDeviceID = { "local" }
71c29fa5a6Sopenharmony_ci};
72c29fa5a6Sopenharmony_ci
73c29fa5a6Sopenharmony_ciPermissionStateFull inputDispatchControlPermState_ = {
74c29fa5a6Sopenharmony_ci    .permissionName = "ohos.permission.INPUT_CONTROL_DISPATCHING",
75c29fa5a6Sopenharmony_ci    .isGeneral = true,
76c29fa5a6Sopenharmony_ci    .grantStatus = { PermissionState::PERMISSION_GRANTED },
77c29fa5a6Sopenharmony_ci    .grantFlags = { 1 },
78c29fa5a6Sopenharmony_ci    .resDeviceID = { "local" }
79c29fa5a6Sopenharmony_ci};
80c29fa5a6Sopenharmony_ci
81c29fa5a6Sopenharmony_ciHapPolicyParams infoManagerTestPolicyPrams_ = {
82c29fa5a6Sopenharmony_ci    .apl = APL_SYSTEM_CORE,
83c29fa5a6Sopenharmony_ci    .domain = "test.domain",
84c29fa5a6Sopenharmony_ci    .permList = { infoManagerTestPermDef_, infoManagerTestPermDef_},
85c29fa5a6Sopenharmony_ci    .permStateList = { infoManagerTestState_, inputDispatchControlPermState_}
86c29fa5a6Sopenharmony_ci};
87c29fa5a6Sopenharmony_ci
88c29fa5a6Sopenharmony_ciHapInfoParams infoManagerTestInfoParms_ = {
89c29fa5a6Sopenharmony_ci    .userID = 1,
90c29fa5a6Sopenharmony_ci    .bundleName = "inputManager_test",
91c29fa5a6Sopenharmony_ci    .instIndex = 0,
92c29fa5a6Sopenharmony_ci    .appIDDesc = "InputManagerTest",
93c29fa5a6Sopenharmony_ci    .isSystemApp = true
94c29fa5a6Sopenharmony_ci};
95c29fa5a6Sopenharmony_ci} // namespace
96c29fa5a6Sopenharmony_cienum class TestScene : int32_t {
97c29fa5a6Sopenharmony_ci    NORMAL_TEST = 0,
98c29fa5a6Sopenharmony_ci    EXCEPTION_TEST,
99c29fa5a6Sopenharmony_ci};
100c29fa5a6Sopenharmony_ci
101c29fa5a6Sopenharmony_cienum class RECV_FLAG : uint32_t {
102c29fa5a6Sopenharmony_ci    RECV_FOCUS = 0x00000000,
103c29fa5a6Sopenharmony_ci    RECV_MONITOR,
104c29fa5a6Sopenharmony_ci    RECV_INTERCEPT,
105c29fa5a6Sopenharmony_ci    RECV_MARK_CONSUMED,
106c29fa5a6Sopenharmony_ci};
107c29fa5a6Sopenharmony_ci
108c29fa5a6Sopenharmony_ciclass EventUtilTest final {
109c29fa5a6Sopenharmony_ci    DECLARE_DELAYED_SINGLETON(EventUtilTest);
110c29fa5a6Sopenharmony_cipublic:
111c29fa5a6Sopenharmony_ci    DISALLOW_COPY_AND_MOVE(EventUtilTest);
112c29fa5a6Sopenharmony_ci    bool Init();
113c29fa5a6Sopenharmony_ci    std::string GetEventDump();
114c29fa5a6Sopenharmony_ci    void AddEventDump(std::string eventDump);
115c29fa5a6Sopenharmony_ci    std::string DumpInputEvent(const std::shared_ptr<PointerEvent>& pointerEvent);
116c29fa5a6Sopenharmony_ci    std::string DumpInputEvent(const std::shared_ptr<KeyEvent>& keyEvent);
117c29fa5a6Sopenharmony_ci    bool CompareDump(const std::shared_ptr<PointerEvent>& pointerEvent);
118c29fa5a6Sopenharmony_ci    bool CompareDump(const std::shared_ptr<KeyEvent>& keyEvent);
119c29fa5a6Sopenharmony_cipublic:
120c29fa5a6Sopenharmony_ci    inline RECV_FLAG GetRecvFlag()
121c29fa5a6Sopenharmony_ci    {
122c29fa5a6Sopenharmony_ci        return recvFlag_;
123c29fa5a6Sopenharmony_ci    }
124c29fa5a6Sopenharmony_ci    inline void SetRecvFlag(RECV_FLAG flag)
125c29fa5a6Sopenharmony_ci    {
126c29fa5a6Sopenharmony_ci        recvFlag_ = flag;
127c29fa5a6Sopenharmony_ci    }
128c29fa5a6Sopenharmony_ciprivate:
129c29fa5a6Sopenharmony_ci    RECV_FLAG recvFlag_ { RECV_FLAG::RECV_FOCUS };
130c29fa5a6Sopenharmony_ci    std::mutex mutex_;
131c29fa5a6Sopenharmony_ci    std::list<std::string> strEventDump_;
132c29fa5a6Sopenharmony_ci    std::condition_variable conditionVariable_;
133c29fa5a6Sopenharmony_ci};
134c29fa5a6Sopenharmony_ci
135c29fa5a6Sopenharmony_ci#define TestUtil ::OHOS::DelayedSingleton<EventUtilTest>::GetInstance()
136c29fa5a6Sopenharmony_ci
137c29fa5a6Sopenharmony_ciclass InputEventConsumer : public IInputEventConsumer {
138c29fa5a6Sopenharmony_cipublic:
139c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const override;
140c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const override;
141c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const override {};
142c29fa5a6Sopenharmony_ci};
143c29fa5a6Sopenharmony_ci
144c29fa5a6Sopenharmony_ciclass PriorityMiddleCallback : public IInputEventConsumer {
145c29fa5a6Sopenharmony_cipublic:
146c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const override;
147c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const override;
148c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const override {};
149c29fa5a6Sopenharmony_ci};
150c29fa5a6Sopenharmony_ci
151c29fa5a6Sopenharmony_ciclass PriorityHighCallback : public IInputEventConsumer {
152c29fa5a6Sopenharmony_cipublic:
153c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const override;
154c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const override;
155c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const override {};
156c29fa5a6Sopenharmony_ci};
157c29fa5a6Sopenharmony_ci
158c29fa5a6Sopenharmony_ciclass InputEventCallback : public IInputEventConsumer {
159c29fa5a6Sopenharmony_cipublic:
160c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const override;
161c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const override;
162c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const override {};
163c29fa5a6Sopenharmony_ci    int32_t GetLastEventId() const;
164c29fa5a6Sopenharmony_ci
165c29fa5a6Sopenharmony_ciprivate:
166c29fa5a6Sopenharmony_ci    mutable int32_t lastPointerEventId_ { -1 };
167c29fa5a6Sopenharmony_ci};
168c29fa5a6Sopenharmony_ci
169c29fa5a6Sopenharmony_ciinline int32_t InputEventCallback::GetLastEventId() const
170c29fa5a6Sopenharmony_ci{
171c29fa5a6Sopenharmony_ci    return lastPointerEventId_;
172c29fa5a6Sopenharmony_ci}
173c29fa5a6Sopenharmony_ci
174c29fa5a6Sopenharmony_ciclass WindowEventConsumer : public IInputEventConsumer {
175c29fa5a6Sopenharmony_cipublic:
176c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<KeyEvent> keyEvent) const override;
177c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<PointerEvent> pointerEvent) const override;
178c29fa5a6Sopenharmony_ci    virtual void OnInputEvent(std::shared_ptr<AxisEvent> axisEvent) const override {};
179c29fa5a6Sopenharmony_ci    uint64_t GetConsumerThreadId();
180c29fa5a6Sopenharmony_ciprivate:
181c29fa5a6Sopenharmony_ci    mutable uint64_t threadId_ { 0 };
182c29fa5a6Sopenharmony_ci};
183c29fa5a6Sopenharmony_ci
184c29fa5a6Sopenharmony_ciint64_t GetNanoTime();
185c29fa5a6Sopenharmony_citemplate<typename sharedType>
186c29fa5a6Sopenharmony_cistd::shared_ptr<sharedType> GetPtr()
187c29fa5a6Sopenharmony_ci{
188c29fa5a6Sopenharmony_ci    return std::make_shared<sharedType>();
189c29fa5a6Sopenharmony_ci}
190c29fa5a6Sopenharmony_ci
191c29fa5a6Sopenharmony_citemplate<typename EventType>
192c29fa5a6Sopenharmony_civoid TestSimulateInputEvent(EventType& event, const TestScene& testScene = TestScene::NORMAL_TEST)
193c29fa5a6Sopenharmony_ci{
194c29fa5a6Sopenharmony_ci    EXPECT_TRUE((static_cast<int32_t>(testScene) ^ TestUtil->CompareDump(event)));
195c29fa5a6Sopenharmony_ci}
196c29fa5a6Sopenharmony_citemplate<typename EventType>
197c29fa5a6Sopenharmony_civoid SimulateInputEventUtilTest(EventType& event)
198c29fa5a6Sopenharmony_ci{
199c29fa5a6Sopenharmony_ci    TestSimulateInputEvent(event);
200c29fa5a6Sopenharmony_ci}
201c29fa5a6Sopenharmony_civoid DumpWindowData(const std::shared_ptr<PointerEvent>& pointerEvent);
202c29fa5a6Sopenharmony_ciclass AccessMonitor {
203c29fa5a6Sopenharmony_cipublic:
204c29fa5a6Sopenharmony_ci    AccessMonitor()
205c29fa5a6Sopenharmony_ci    {
206c29fa5a6Sopenharmony_ci        currentId_ = GetSelfTokenID();
207c29fa5a6Sopenharmony_ci        AccessTokenIDEx tokenIdEx = { 0 };
208c29fa5a6Sopenharmony_ci        tokenIdEx = AccessTokenKit::AllocHapToken(infoManagerTestInfoParms_, infoManagerTestPolicyPrams_);
209c29fa5a6Sopenharmony_ci        monitorId_ = tokenIdEx.tokenIDEx;
210c29fa5a6Sopenharmony_ci        SetSelfTokenID(monitorId_);
211c29fa5a6Sopenharmony_ci    }
212c29fa5a6Sopenharmony_ci    ~AccessMonitor()
213c29fa5a6Sopenharmony_ci    {
214c29fa5a6Sopenharmony_ci        AccessTokenKit::DeleteToken(monitorId_);
215c29fa5a6Sopenharmony_ci        SetSelfTokenID(currentId_);
216c29fa5a6Sopenharmony_ci    }
217c29fa5a6Sopenharmony_ciprivate:
218c29fa5a6Sopenharmony_ci    uint64_t currentId_ { 0 };
219c29fa5a6Sopenharmony_ci    uint64_t monitorId_ { 0 };
220c29fa5a6Sopenharmony_ci};
221c29fa5a6Sopenharmony_ci} // namespace MMI
222c29fa5a6Sopenharmony_ci} // namespace OHOS
223c29fa5a6Sopenharmony_ci#endif // EVENT_TEST_UTIL_H