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