| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ui/events/ozone/evdev/gamepad_event_converter_evdev.h" |
| 6 |
| 7 #include <errno.h> |
| 8 #include <fcntl.h> |
| 9 #include <linux/input.h> |
| 10 #include <unistd.h> |
| 11 |
| 12 #include <memory> |
| 13 #include <queue> |
| 14 #include <utility> |
| 15 #include <vector> |
| 16 |
| 17 #include "base/bind.h" |
| 18 #include "base/files/file_util.h" |
| 19 #include "base/macros.h" |
| 20 #include "base/memory/ptr_util.h" |
| 21 #include "base/posix/eintr_wrapper.h" |
| 22 #include "base/run_loop.h" |
| 23 #include "base/time/time.h" |
| 24 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "ui/events/event.h" |
| 27 #include "ui/events/ozone/device/device_manager.h" |
| 28 #include "ui/events/ozone/evdev/event_converter_test_util.h" |
| 29 #include "ui/events/ozone/evdev/event_device_test_util.h" |
| 30 #include "ui/events/ozone/evdev/event_factory_evdev.h" |
| 31 #include "ui/events/ozone/gamepad/gamepad_event.h" |
| 32 #include "ui/events/ozone/gamepad/gamepad_observer.h" |
| 33 #include "ui/events/ozone/gamepad/gamepad_provider_ozone.h" |
| 34 #include "ui/events/ozone/gamepad/webgamepad_constants.h" |
| 35 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" |
| 36 #include "ui/events/platform/platform_event_dispatcher.h" |
| 37 #include "ui/events/platform/platform_event_source.h" |
| 38 |
| 39 namespace { |
| 40 |
| 41 const char kTestDevicePath[] = "/dev/input/test-device"; |
| 42 |
| 43 class TestGamepadObserver : public ui::GamepadObserver { |
| 44 public: |
| 45 TestGamepadObserver() { |
| 46 ui::GamepadProviderOzone::GetInstance()->AddGamepadObserver(this); |
| 47 } |
| 48 |
| 49 ~TestGamepadObserver() override { |
| 50 ui::GamepadProviderOzone::GetInstance()->RemoveGamepadObserver(this); |
| 51 } |
| 52 void OnGamepadEvent(const ui::GamepadEvent& event) override { |
| 53 events.push_back(event); |
| 54 } |
| 55 |
| 56 std::vector<ui::GamepadEvent> events; |
| 57 }; |
| 58 |
| 59 } // namespace |
| 60 |
| 61 namespace ui { |
| 62 class GamepadEventConverterEvdevTest : public testing::Test { |
| 63 public: |
| 64 GamepadEventConverterEvdevTest() {} |
| 65 |
| 66 // Overriden from testing::Test: |
| 67 void SetUp() override { |
| 68 device_manager_ = ui::CreateDeviceManagerForTest(); |
| 69 event_factory_ = ui::CreateEventFactoryEvdevForTest( |
| 70 nullptr, device_manager_.get(), |
| 71 ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine(), |
| 72 base::Bind(&GamepadEventConverterEvdevTest::DispatchEventForTest, |
| 73 base::Unretained(this))); |
| 74 dispatcher_ = |
| 75 ui::CreateDeviceEventDispatcherEvdevForTest(event_factory_.get()); |
| 76 } |
| 77 |
| 78 ui::GamepadEventConverterEvdev* CreateDevice( |
| 79 const ui::DeviceCapabilities& caps) { |
| 80 int evdev_io[2]; |
| 81 if (pipe(evdev_io)) |
| 82 PLOG(FATAL) << "failed pipe"; |
| 83 ui::ScopedInputDevice events_in(evdev_io[0]); |
| 84 ui::ScopedInputDevice events_out(evdev_io[1]); |
| 85 |
| 86 ui::EventDeviceInfo devinfo; |
| 87 CapabilitiesToDeviceInfo(caps, &devinfo); |
| 88 return new ui::GamepadEventConverterEvdev(std::move(events_in), |
| 89 base::FilePath(kTestDevicePath), |
| 90 1, devinfo, dispatcher_.get()); |
| 91 } |
| 92 |
| 93 private: |
| 94 void DispatchEventForTest(ui::Event* event) {} |
| 95 |
| 96 std::unique_ptr<ui::GamepadEventConverterEvdev> gamepad_evdev_; |
| 97 std::unique_ptr<ui::DeviceManager> device_manager_; |
| 98 std::unique_ptr<ui::EventFactoryEvdev> event_factory_; |
| 99 std::unique_ptr<ui::DeviceEventDispatcherEvdev> dispatcher_; |
| 100 |
| 101 DISALLOW_COPY_AND_ASSIGN(GamepadEventConverterEvdevTest); |
| 102 }; |
| 103 |
| 104 struct ExpectedEvent { |
| 105 GamepadEventType type; |
| 106 uint16_t code; |
| 107 double value; |
| 108 }; |
| 109 |
| 110 // Double value within this range will be considered equal. |
| 111 const double axis_delta = 0.00001; |
| 112 |
| 113 TEST_F(GamepadEventConverterEvdevTest, XboxGamepadEvents) { |
| 114 TestGamepadObserver observer; |
| 115 std::unique_ptr<ui::GamepadEventConverterEvdev> dev = |
| 116 base::WrapUnique(CreateDevice(kXboxGamepad)); |
| 117 |
| 118 struct input_event mock_kernel_queue[] = { |
| 119 {{1493076826, 766851}, EV_ABS, 0, 19105}, |
| 120 {{1493076826, 766851}, EV_SYN, SYN_REPORT}, |
| 121 {{1493076826, 774849}, EV_ABS, 0, 17931}, |
| 122 {{1493076826, 774849}, EV_SYN, SYN_REPORT}, |
| 123 {{1493076826, 782849}, EV_ABS, 0, 17398}, |
| 124 {{1493076826, 782849}, EV_SYN, SYN_REPORT}, |
| 125 {{1493076829, 670856}, EV_MSC, 4, 90007}, |
| 126 {{1493076829, 670856}, EV_KEY, 310, 1}, |
| 127 {{1493076829, 670856}, EV_SYN, SYN_REPORT}, |
| 128 {{1493076829, 870828}, EV_MSC, 4, 90007}, |
| 129 {{1493076829, 870828}, EV_KEY, 310, 0}, |
| 130 {{1493076829, 870828}, EV_SYN, SYN_REPORT}, |
| 131 {{1493076830, 974859}, EV_MSC, 4, 90005}, |
| 132 {{1493076830, 974859}, EV_KEY, 308, 1}, |
| 133 {{1493076830, 974859}, EV_SYN, SYN_REPORT}, |
| 134 {{1493076831, 158857}, EV_MSC, 4, 90005}, |
| 135 {{1493076831, 158857}, EV_KEY, 308, 0}, |
| 136 {{1493076831, 158857}, EV_SYN, SYN_REPORT}, |
| 137 {{1493076832, 62859}, EV_MSC, 4, 90002}, |
| 138 {{1493076832, 62859}, EV_KEY, 305, 1}, |
| 139 {{1493076832, 62859}, EV_SYN, SYN_REPORT}, |
| 140 {{1493076832, 206859}, EV_MSC, 4, 90002}, |
| 141 {{1493076832, 206859}, EV_KEY, 305, 0}, |
| 142 {{1493076832, 206859}, EV_SYN, SYN_REPORT}, |
| 143 {{1493076832, 406860}, EV_MSC, 4, 90003}, |
| 144 {{1493076832, 406860}, EV_KEY, 306, 1}, |
| 145 {{1493076832, 406860}, EV_SYN, SYN_REPORT}, |
| 146 {{1493076832, 526871}, EV_MSC, 4, 90003}, |
| 147 {{1493076832, 526871}, EV_KEY, 306, 0}, |
| 148 {{1493076832, 526871}, EV_SYN, SYN_REPORT}, |
| 149 {{1493076832, 750860}, EV_MSC, 4, 90004}, |
| 150 {{1493076832, 750860}, EV_KEY, 307, 1}, |
| 151 {{1493076832, 750860}, EV_SYN, SYN_REPORT}}; |
| 152 |
| 153 struct ExpectedEvent expected_events[] = { |
| 154 {GamepadEventType::AXIS, 0, 0.583062}, {GamepadEventType::FRAME, 0, 0}, |
| 155 {GamepadEventType::AXIS, 0, 0.547234}, {GamepadEventType::FRAME, 0, 0}, |
| 156 {GamepadEventType::AXIS, 0, 0.530968}, {GamepadEventType::FRAME, 0, 0}, |
| 157 {GamepadEventType::BUTTON, 4, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 158 {GamepadEventType::BUTTON, 4, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 159 {GamepadEventType::BUTTON, 3, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 160 {GamepadEventType::BUTTON, 3, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 161 {GamepadEventType::BUTTON, 1, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 162 {GamepadEventType::BUTTON, 1, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 163 {GamepadEventType::BUTTON, 2, 1}, {GamepadEventType::FRAME, 0, 0}}; |
| 164 |
| 165 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) { |
| 166 dev->ProcessEvent(mock_kernel_queue[i]); |
| 167 } |
| 168 |
| 169 for (unsigned i = 0; i < observer.events.size(); ++i) { |
| 170 EXPECT_EQ(observer.events[i].type(), expected_events[i].type); |
| 171 EXPECT_EQ(observer.events[i].code(), expected_events[i].code); |
| 172 double d = observer.events[i].value() - expected_events[i].value; |
| 173 d = d > 0 ? d : -d; |
| 174 EXPECT_LT(d, axis_delta); |
| 175 } |
| 176 } |
| 177 |
| 178 TEST_F(GamepadEventConverterEvdevTest, iBuffaloGamepadEvents) { |
| 179 TestGamepadObserver observer; |
| 180 std::unique_ptr<ui::GamepadEventConverterEvdev> dev = |
| 181 base::WrapUnique(CreateDevice(kiBuffaloGamepad)); |
| 182 |
| 183 struct input_event mock_kernel_queue[] = { |
| 184 {{1493141044, 176725}, EV_MSC, 4, 90002}, |
| 185 {{1493141044, 176725}, EV_KEY, 289, 1}, |
| 186 {{1493141044, 176725}, EV_SYN, SYN_REPORT}, |
| 187 {{1493141044, 256722}, EV_MSC, 4, 90002}, |
| 188 {{1493141044, 256722}, EV_KEY, 289, 0}, |
| 189 {{1493141044, 256722}, EV_SYN, SYN_REPORT}, |
| 190 {{1493141044, 400713}, EV_MSC, 4, 90001}, |
| 191 {{1493141044, 400713}, EV_KEY, 288, 1}, |
| 192 {{1493141044, 400713}, EV_SYN, SYN_REPORT}, |
| 193 {{1493141044, 480725}, EV_MSC, 4, 90001}, |
| 194 {{1493141044, 480725}, EV_KEY, 288, 0}, |
| 195 {{1493141044, 480725}, EV_SYN, SYN_REPORT}, |
| 196 {{1493141044, 704716}, EV_MSC, 4, 90003}, |
| 197 {{1493141044, 704716}, EV_KEY, 290, 1}, |
| 198 {{1493141044, 704716}, EV_SYN, SYN_REPORT}, |
| 199 {{1493141044, 768721}, EV_MSC, 4, 90003}, |
| 200 {{1493141044, 768721}, EV_KEY, 290, 0}, |
| 201 {{1493141044, 768721}, EV_SYN, SYN_REPORT}, |
| 202 {{1493141044, 960715}, EV_MSC, 4, 90004}, |
| 203 {{1493141044, 960715}, EV_KEY, 291, 1}, |
| 204 {{1493141044, 960715}, EV_SYN, SYN_REPORT}, |
| 205 {{1493141045, 48714}, EV_MSC, 4, 90004}, |
| 206 {{1493141045, 48714}, EV_KEY, 291, 0}, |
| 207 {{1493141045, 48714}, EV_SYN, SYN_REPORT}, |
| 208 {{1493141046, 520730}, EV_ABS, 1, 255}, |
| 209 {{1493141046, 520730}, EV_SYN, SYN_REPORT}, |
| 210 {{1493141046, 648727}, EV_ABS, 1, 128}, |
| 211 {{1493141046, 648727}, EV_SYN, SYN_REPORT}, |
| 212 {{1493141046, 848730}, EV_ABS, 1, 0}, |
| 213 {{1493141046, 848730}, EV_SYN, SYN_REPORT}, |
| 214 {{1493141046, 992726}, EV_ABS, 1, 128}, |
| 215 {{1493141046, 992726}, EV_SYN, SYN_REPORT}, |
| 216 {{1493141047, 224727}, EV_ABS, 0, 0}, |
| 217 {{1493141047, 224727}, EV_SYN, SYN_REPORT}, |
| 218 {{1493141047, 344724}, EV_ABS, 0, 128}, |
| 219 {{1493141047, 344724}, EV_SYN, SYN_REPORT}, |
| 220 {{1493141047, 552720}, EV_ABS, 0, 255}, |
| 221 {{1493141047, 552720}, EV_SYN, SYN_REPORT}, |
| 222 {{1493141047, 696726}, EV_ABS, 0, 128}, |
| 223 {{1493141047, 696726}, EV_SYN, SYN_REPORT}, |
| 224 {{1493141047, 920727}, EV_MSC, 4, 90006}, |
| 225 {{1493141047, 920727}, EV_KEY, 293, 1}, |
| 226 {{1493141047, 920727}, EV_SYN, SYN_REPORT}, |
| 227 }; |
| 228 |
| 229 struct ExpectedEvent expected_events[] = { |
| 230 {GamepadEventType::BUTTON, 1, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 231 {GamepadEventType::BUTTON, 1, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 232 {GamepadEventType::BUTTON, 0, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 233 {GamepadEventType::BUTTON, 0, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 234 {GamepadEventType::BUTTON, 2, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 235 {GamepadEventType::BUTTON, 2, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 236 {GamepadEventType::BUTTON, 3, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 237 {GamepadEventType::BUTTON, 3, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 238 {GamepadEventType::BUTTON, 13, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 239 {GamepadEventType::BUTTON, 13, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 240 {GamepadEventType::BUTTON, 12, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 241 {GamepadEventType::BUTTON, 12, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 242 {GamepadEventType::BUTTON, 14, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 243 {GamepadEventType::BUTTON, 14, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 244 {GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::FRAME, 0, 0}, |
| 245 {GamepadEventType::BUTTON, 15, 0}, {GamepadEventType::FRAME, 0, 0}, |
| 246 {GamepadEventType::BUTTON, 7, 1}, {GamepadEventType::FRAME, 0, 0}}; |
| 247 |
| 248 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) { |
| 249 dev->ProcessEvent(mock_kernel_queue[i]); |
| 250 } |
| 251 |
| 252 for (unsigned i = 0; i < observer.events.size(); ++i) { |
| 253 EXPECT_EQ(observer.events[i].type(), expected_events[i].type); |
| 254 EXPECT_EQ(observer.events[i].code(), expected_events[i].code); |
| 255 double d = observer.events[i].value() - expected_events[i].value; |
| 256 d = d > 0 ? d : -d; |
| 257 EXPECT_LT(d, axis_delta); |
| 258 } |
| 259 } |
| 260 } // namespace ui |
| OLD | NEW |