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