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