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