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 #include <gtest/gtest.h>
17 #include "accessibility_common_helper.h"
18 #include "accessibility_touchEvent_injector.h"
19 #include "accessibility_ut_helper.h"
20 #include "accessible_ability_client_proxy.h"
21 #include "mock_accessible_ability_client_stub_impl.h"
22 #include "mock_accessible_ability_manager_service.h"
23 
24 using namespace testing;
25 using namespace testing::ext;
26 
27 namespace OHOS {
28 namespace Accessibility {
29 namespace {
30     constexpr uint32_t SLEEP_TIME_1 = 1;
31     constexpr uint32_t SLEEP_TIME_2 = 2;
32 } // namespace
33 
34 class TouchEventInjectorTest : public testing::Test {
35 public:
TouchEventInjectorTest()36     TouchEventInjectorTest()
37     {}
~TouchEventInjectorTest()38     ~TouchEventInjectorTest()
39     {}
40 
41     static void SetUpTestCase();
42     static void TearDownTestCase();
43     void SetUp() override;
44     void TearDown() override;
45     sptr<TouchEventInjector> touchEventInjector_ = nullptr;
46     sptr<AccessibilityInputInterceptor> inputInterceptor_ = nullptr;
47 
48 protected:
49     MMI::PointerEvent CreateTouchEvent(int32_t action);
50     int32_t pointId_ = -1;
51     bool isDestroyEvents_ = false;
52 };
53 
SetUpTestCase()54 void TouchEventInjectorTest::SetUpTestCase()
55 {
56     GTEST_LOG_(INFO) << "TouchEventInjectorTest SetUpTestCase";
57     Singleton<AccessibleAbilityManagerService>::GetInstance().OnStart();
58 }
59 
TearDownTestCase()60 void TouchEventInjectorTest::TearDownTestCase()
61 {
62     GTEST_LOG_(INFO) << "TouchEventInjectorTest TearDownTestCase";
63     Singleton<AccessibleAbilityManagerService>::GetInstance().OnStop();
64 }
65 
SetUp()66 void TouchEventInjectorTest::SetUp()
67 {
68     GTEST_LOG_(INFO) << "TouchEventInjectorTest SetUp";
69     touchEventInjector_ = new TouchEventInjector();
70     sptr<MockAccessibleAbilityClientStubImpl> stub = new MockAccessibleAbilityClientStubImpl();
71     inputInterceptor_ = AccessibilityInputInterceptor::GetInstance();
72 }
73 
TearDown()74 void TouchEventInjectorTest::TearDown()
75 {
76     GTEST_LOG_(INFO) << "TouchEventInjectorTest TearDown";
77     inputInterceptor_ = nullptr;
78 }
79 
CreateTouchEvent(int32_t action)80 MMI::PointerEvent TouchEventInjectorTest::CreateTouchEvent(int32_t action)
81 {
82     std::shared_ptr<MMI::PointerEvent> pointerEvent = MMI::PointerEvent::Create();
83     MMI::PointerEvent::PointerItem item = {};
84 
85     pointerEvent->AddPointerItem(item);
86     pointerEvent->SetPointerId(pointId_++);
87     pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
88     pointerEvent->SetPointerAction(action);
89 
90     return *pointerEvent;
91 }
92 /**
93  * @tc.number: TouchEventInjector001
94  * @tc.name:TouchEventInjector
95  * @tc.desc: Check injected single tap event.
96  */
97 HWTEST_F(TouchEventInjectorTest, TouchEventInjector_Unittest_TouchEventInjector_001, TestSize.Level1)
98 {
99     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_001 start";
100     touchEventInjector_->SetNext(inputInterceptor_);
101 
102     AccessibilityGesturePosition point {10.0f, 10.0f};
103     std::shared_ptr<AccessibilityGestureInjectPath> gesturePath = std::make_shared<AccessibilityGestureInjectPath>();
104     gesturePath->AddPosition(point);
105     gesturePath->SetDurationTime(100);
106 
107     touchEventInjector_->InjectEvents(gesturePath);
108 
109     sleep(SLEEP_TIME_2);
110     int32_t touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(0);
111     int32_t expectValue = MMI::PointerEvent::POINTER_ACTION_DOWN;
112     EXPECT_EQ(touchAction, expectValue);
113 
114     expectValue = MMI::PointerEvent::POINTER_ACTION_UP;
115     touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(1);
116     EXPECT_EQ(touchAction, expectValue);
117     AccessibilityAbilityHelper::GetInstance().ClearTouchEventActionVector();
118 }
119 
120 /**
121  * @tc.number: TouchEventInjector004
122  * @tc.name:TouchEventInjector
123  * @tc.desc: Check Some functional interface.
124  */
125 HWTEST_F(TouchEventInjectorTest, TouchEventInjector_Unittest_TouchEventInjector_004, TestSize.Level1)
126 {
127     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_004 start";
128 
129     std::shared_ptr<MMI::PointerEvent> event = MMI::PointerEvent::Create();
130     event->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_MOUSE);
131     touchEventInjector_->SetNext(inputInterceptor_);
132     touchEventInjector_->OnPointerEvent(*event);
133     touchEventInjector_->DestroyEvents();
134     isDestroyEvents_ = AccessibilityAbilityHelper::GetInstance().GetDestroyState();
135     EXPECT_EQ(isDestroyEvents_, true);
136 
137     MMI::PointerEvent touchevent = CreateTouchEvent(MMI::PointerEvent::POINTER_ACTION_DOWN);
138     touchEventInjector_->OnPointerEvent(touchevent);
139     int32_t expectValue = MMI::PointerEvent::POINTER_ACTION_DOWN;
140     sleep(SLEEP_TIME_2);
141     int32_t touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(1);
142     AccessibilityAbilityHelper::GetInstance().ClearTouchEventActionVector();
143     EXPECT_EQ(touchAction, expectValue);
144 
145     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_004 end";
146 }
147 
148 /**
149  * @tc.number: TouchEventInjector005
150  * @tc.name:TouchEventInjector
151  * @tc.desc: Check destroy event before sendtouchevent.
152  */
153 HWTEST_F(TouchEventInjectorTest, TouchEventInjector_Unittest_TouchEventInjector_005, TestSize.Level1)
154 {
155     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_005 start";
156 
157     touchEventInjector_->SetNext(inputInterceptor_);
158 
159     AccessibilityGesturePosition point {10.0f, 10.0f};
160     std::shared_ptr<AccessibilityGestureInjectPath> gesturePath = std::make_shared<AccessibilityGestureInjectPath>();
161     gesturePath->AddPosition(point);
162     gesturePath->SetDurationTime(100000);
163 
164     touchEventInjector_->InjectEvents(gesturePath);
165     sleep(SLEEP_TIME_1);
166     int32_t touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(0);
167     AccessibilityAbilityHelper::GetInstance().ClearTouchEventActionVector();
168     touchEventInjector_->DestroyEvents();
169     isDestroyEvents_ = AccessibilityAbilityHelper::GetInstance().GetDestroyState();
170     EXPECT_EQ(isDestroyEvents_, true);
171     int32_t expectValue = MMI::PointerEvent::POINTER_ACTION_DOWN;
172     EXPECT_EQ(touchAction, expectValue);
173 
174     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_005 end";
175 }
176 
177 /**
178  * @tc.number: TouchEventInjector006
179  * @tc.name:TouchEventInjector
180  * @tc.desc: Check injected UP_THEN_RIGHT move event.
181  */
182 HWTEST_F(TouchEventInjectorTest, TouchEventInjector_Unittest_TouchEventInjector_006, TestSize.Level1)
183 {
184     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_006 start";
185 
186     touchEventInjector_->SetNext(inputInterceptor_);
187 
188     AccessibilityGesturePosition point1 {10.0f, 10.0f};
189     AccessibilityGesturePosition point2 {10.0f, 20.0f};
190     AccessibilityGesturePosition point3 {20.0f, 20.0f};
191     std::shared_ptr<AccessibilityGestureInjectPath> gesturePath = std::make_shared<AccessibilityGestureInjectPath>();
192     gesturePath->AddPosition(point1);
193     gesturePath->AddPosition(point2);
194     gesturePath->AddPosition(point3);
195     gesturePath->SetDurationTime(200);
196 
197     touchEventInjector_->InjectEvents(gesturePath);
198     sleep(SLEEP_TIME_2);
199     int32_t touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(0);
200     int32_t expectValue = MMI::PointerEvent::POINTER_ACTION_DOWN;
201     touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(1);
202     EXPECT_EQ(touchAction, expectValue);
203     expectValue = MMI::PointerEvent::POINTER_ACTION_MOVE;
204     touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(2);
205     EXPECT_EQ(touchAction, expectValue);
206     touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(3);
207     EXPECT_EQ(touchAction, expectValue);
208     expectValue = MMI::PointerEvent::POINTER_ACTION_UP;
209     touchAction = AccessibilityAbilityHelper::GetInstance().GetTouchEventActionOfTargetIndex(4);
210     EXPECT_EQ(touchAction, expectValue);
211     AccessibilityAbilityHelper::GetInstance().ClearTouchEventActionVector();
212 
213     GTEST_LOG_(INFO) << "TouchEventInjector_Unittest_TouchEventInjector_006 end";
214 }
215 } // namespace Accessibility
216 } // namespace OHOS