1 /*
2  * Copyright (c) 2023 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 <atomic>
17 #include <chrono>
18 #include <thread>
19 
20 #include <gmock/gmock.h>
21 #include <gtest/gtest.h>
22 
23 #include "input_manager.h"
24 #include "test_device.h"
25 
26 using namespace std::chrono_literals;
27 using ::testing::ext::TestSize;
28 namespace {
29 constexpr auto DEVICE_MAX_DELAY = 100ms;
30 constexpr auto DEVICE_DELAY_STEP = 10ms;
31 } // namespace
32 
33 class TestDeviceListener : public OHOS::MMI::IInputDeviceListener {
34 public:
35     ~TestDeviceListener() override = default;
OnDeviceAdded(int32_t deviceId,const std::string & type)36     void OnDeviceAdded(int32_t deviceId, const std::string& type)
37     {
38         added_ = true;
39         deviceId_ = deviceId;
40     }
OnDeviceRemoved(int32_t deviceId,const std::string & type)41     void OnDeviceRemoved(int32_t deviceId, const std::string& type)
42     {
43         removed_ = true;
44         deviceId_ = deviceId;
45     }
46 
Clear()47     void Clear()
48     {
49         added_ = false;
50         removed_ = false;
51         deviceId_ = -1;
52     }
53 
54     std::atomic<bool> added_ = false;
55     std::atomic<bool> removed_ = false;
56     std::atomic<int32_t> deviceId_ = -1;
57 };
58 
59 class E2eUdevTest : public ::testing::Test {
60 public:
SetUpTestSuite()61     static void SetUpTestSuite()
62     {
63         inputManager_->RegisterDevListener("change", listener_);
64     }
65 
TearDownTestSuite()66     static void TearDownTestSuite()
67     {
68         inputManager_->UnregisterDevListener("change", listener_);
69     }
70 
WaitAdded()71     bool WaitAdded()
72     {
73         auto till = std::chrono::steady_clock::now() + DEVICE_MAX_DELAY;
74         while (!listener_->added_ && std::chrono::steady_clock::now() < till) {
75             std::this_thread::sleep_for(DEVICE_DELAY_STEP);
76         }
77         return listener_->added_;
78     }
79 
SetUp()80     void SetUp() override
81     {
82         listener_->Clear();
83     }
84 
TearDown()85     void TearDown() override
86     {
87         if (!listener_->added_) {
88             return;
89         }
90         testDevice_.Destroy();
91         auto till = std::chrono::steady_clock::now() + DEVICE_MAX_DELAY;
92         while (!listener_->removed_ && std::chrono::steady_clock::now() < till) {
93             std::this_thread::sleep_for(DEVICE_DELAY_STEP);
94         }
95     }
96 
97     inline static OHOS::MMI::InputManager* inputManager_ = OHOS::MMI::InputManager::GetInstance();
98     inline static std::shared_ptr<TestDeviceListener> listener_ = std::make_shared<TestDeviceListener>();
99     TestDevice testDevice_;
100 };
101 
102 HWTEST_F(E2eUdevTest, TestUdevPropsDefault, TestSize.Level1)
103 {
104     ASSERT_NO_FATAL_FAILURE(testDevice_.Init());
105     ASSERT_TRUE(WaitAdded());
106     EXPECT_GE(listener_->deviceId_, 0);
107 
__anon982950e50202(std::shared_ptr<OHOS::MMI::InputDevice> dev) 108     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
109         EXPECT_EQ(dev->GetName(), TestDevice::TEST_NAME);
110         EXPECT_EQ(dev->GetBus(), TestDevice::TEST_BUS);
111         EXPECT_EQ(dev->GetVendor(), TestDevice::TEST_VENDOR);
112         EXPECT_EQ(dev->GetProduct(), TestDevice::TEST_PRODUCT);
113         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_POINTER);
114     });
115     EXPECT_EQ(res, 0);
116 }
117 
118 HWTEST_F(E2eUdevTest, TestUdevPropsKey, TestSize.Level1)
119 {
120     testDevice_.KeyboardSetup();
121     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
122     ASSERT_TRUE(WaitAdded());
123     EXPECT_GE(listener_->deviceId_, 0);
124 
__anon982950e50302(std::shared_ptr<OHOS::MMI::InputDevice> dev) 125     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
126         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_KEYBOARD);
127     });
128     EXPECT_EQ(res, 0);
129 }
130 
131 HWTEST_F(E2eUdevTest, TestUdevPropsSwitch, TestSize.Level1)
132 {
133     testDevice_.SwitchSetup();
134     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
135     ASSERT_TRUE(WaitAdded());
136     EXPECT_GE(listener_->deviceId_, 0);
137 
__anon982950e50402(std::shared_ptr<OHOS::MMI::InputDevice> dev) 138     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
139         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_SWITCH);
140     });
141     EXPECT_EQ(res, 0);
142 }
143 
144 HWTEST_F(E2eUdevTest, TestUdevPropsAccel, TestSize.Level1)
145 {
146     testDevice_.AccelerometerSetup();
147     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
148     ASSERT_FALSE(WaitAdded());
149 }
150 
151 HWTEST_F(E2eUdevTest, TestUdevPropsStick, TestSize.Level1)
152 {
153     testDevice_.StickSetup();
154     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
155     ASSERT_TRUE(WaitAdded());
156     EXPECT_GE(listener_->deviceId_, 0);
157 
__anon982950e50502(std::shared_ptr<OHOS::MMI::InputDevice> dev) 158     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
159         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_POINTER);
160     });
161     EXPECT_EQ(res, 0);
162 }
163 
164 HWTEST_F(E2eUdevTest, TestUdevPropsTouchpad, TestSize.Level1)
165 {
166     testDevice_.TouchpadSetup();
167     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
168     ASSERT_TRUE(WaitAdded());
169     EXPECT_GE(listener_->deviceId_, 0);
170 
__anon982950e50602(std::shared_ptr<OHOS::MMI::InputDevice> dev) 171     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
172         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_POINTER);
173     });
174     EXPECT_EQ(res, 0);
175 }
176 
177 HWTEST_F(E2eUdevTest, TestUdevPropsTouchscreen, TestSize.Level1)
178 {
179     testDevice_.TouchscreenSetup();
180     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
181     ASSERT_TRUE(WaitAdded());
182     EXPECT_GE(listener_->deviceId_, 0);
183 
__anon982950e50702(std::shared_ptr<OHOS::MMI::InputDevice> dev) 184     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
185         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_TOUCH);
186     });
187     EXPECT_EQ(res, 0);
188 }
189 
190 HWTEST_F(E2eUdevTest, TestUdevPropsJoystick, TestSize.Level1)
191 {
192     testDevice_.JoystickSetup();
193     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
194     ASSERT_TRUE(WaitAdded());
195     EXPECT_GE(listener_->deviceId_, 0);
196 
__anon982950e50802(std::shared_ptr<OHOS::MMI::InputDevice> dev) 197     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
198         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_JOYSTICK);
199     });
200     EXPECT_EQ(res, 0);
201 }
202 
203 HWTEST_F(E2eUdevTest, TestUdevPropsTablet, TestSize.Level1)
204 {
205     testDevice_.TabletSetup();
206     ASSERT_NO_FATAL_FAILURE(testDevice_.Init(false));
207     ASSERT_TRUE(WaitAdded());
208     EXPECT_GE(listener_->deviceId_, 0);
209 
__anon982950e50902(std::shared_ptr<OHOS::MMI::InputDevice> dev) 210     auto res = inputManager_->GetDevice(listener_->deviceId_, [](std::shared_ptr<OHOS::MMI::InputDevice> dev) {
211         EXPECT_EQ(dev->GetCapabilities(), 1ULL << OHOS::MMI::INPUT_DEV_CAP_TABLET_TOOL);
212     });
213     EXPECT_EQ(res, 0);
214 }
215