Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(743)

Side by Side Diff: ui/events/ozone/evdev/gamepad_event_converter_evdev_unittest.cc

Issue 2805793002: ozone: evdev: Add gamepad support (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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/gtest/include/gtest/gtest.h"
25 #include "ui/events/event.h"
26 #include "ui/events/ozone/device/device_manager.h"
27 #include "ui/events/ozone/evdev/event_converter_test_util.h"
28 #include "ui/events/ozone/evdev/event_device_test_util.h"
29 #include "ui/events/ozone/evdev/event_factory_evdev.h"
30 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
31 #include "ui/events/platform/platform_event_dispatcher.h"
32 #include "ui/events/platform/platform_event_source.h"
33 #include "ui/events/webgamepad_constants.h"
34
35 namespace {
36
37 const char kTestDevicePath[] = "/dev/input/test-device";
38
39 // xbox controller with wrong abs_info.
spang 2017/04/13 00:52:20 What does "wrong" mean here?
jkwang 2017/04/19 19:42:23 Done.
40 const ui::DeviceAbsoluteAxis kWrongAbsGamepadAbsAxes[] = {
41 {ABS_X, {127, 0, 255, 0, 255}},
42 {ABS_Y, {0, 0, 255, 0, 10}},
43 {ABS_Z, {0, 0, 255, 0, 0}},
44 {ABS_RX, {0, -32768, 32767, 16, 128}},
45 {ABS_RY, {0, -32768, 32767, 16, 128}},
46 {ABS_RZ, {0, 0, 255, 0, 0}},
47 {ABS_HAT0X, {0, -1, 1, 0, 0}},
48 {ABS_HAT0Y, {0, -1, 1, 0, 0}}};
49
50 const ui::DeviceCapabilities kWrongAbsGamepad = {
51 /* path */
52 "/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0/"
53 "input/input38/event11",
54 /* name */ "Microsoft X-Box 360 pad",
55 /* phys */ "usb-0000:00:14.0-2.2/input0",
56 /* uniq */ "",
57 /* bustype */ "0011",
58 /* vendor */ "045e",
59 /* product */ "028e",
60 /* version */ "0114",
61 /* prop */ "0",
62 /* ev */ "20000b",
63 /* key */ "7cdb000000000000 0 0 0 0",
64 /* rel */ "0",
65 /* abs */ "3003f",
66 /* msc */ "0",
67 /* sw */ "0",
68 /* led */ "0",
69 /* ff */ "0",
70 kWrongAbsGamepadAbsAxes,
71 arraysize(kWrongAbsGamepadAbsAxes),
72 };
73
74 } // namespace
75
76 namespace ui {
77 class GamepadEventConverterEvdevTest : public testing::Test {
78 public:
79 GamepadEventConverterEvdevTest() {}
80
81 // Overriden from testing::Test:
82 void SetUp() override {
83 device_manager_ = ui::CreateDeviceManagerForTest();
84 event_factory_ = ui::CreateEventFactoryEvdevForTest(
85 nullptr, device_manager_.get(),
86 ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine(),
87 base::Bind(&GamepadEventConverterEvdevTest::DispatchEventForTest,
88 base::Unretained(this)));
89 dispatcher_ =
90 ui::CreateDeviceEventDispatcherEvdevForTest(event_factory_.get());
91 }
92
93 ui::GamepadEventConverterEvdev* CreateDevice(
94 const ui::DeviceCapabilities& caps) {
95 int evdev_io[2];
96 if (pipe(evdev_io))
97 PLOG(FATAL) << "failed pipe";
98 ui::ScopedInputDevice events_in(evdev_io[0]);
99 ui::ScopedInputDevice events_out(evdev_io[1]);
100
101 ui::EventDeviceInfo devinfo;
102 CapabilitiesToDeviceInfo(caps, &devinfo);
103 return new ui::GamepadEventConverterEvdev(std::move(events_in),
104 base::FilePath(kTestDevicePath),
105 1, devinfo, dispatcher_.get());
106 }
107
108 unsigned DispatchedEventSize() { return dispatched_events_.size(); }
109
110 std::unique_ptr<ui::GamepadEvent> GetNextEventAndPop() {
111 auto* event = dispatched_events_.front();
112 EXPECT_TRUE(event->IsGamepadEvent());
113 dispatched_events_.pop();
114 return base::WrapUnique<GamepadEvent>(event->AsGamepadEvent());
115 }
116
117 private:
118 void DispatchEventForTest(ui::Event* event) {
119 ui::Event* cloned_event = ui::Event::Clone(*event).release();
120 dispatched_events_.push(cloned_event);
121 }
122
123 std::unique_ptr<ui::GamepadEventConverterEvdev> gamepad_evdev_;
124 std::unique_ptr<ui::DeviceManager> device_manager_;
125 std::unique_ptr<ui::EventFactoryEvdev> event_factory_;
126 std::unique_ptr<ui::DeviceEventDispatcherEvdev> dispatcher_;
127
128 std::queue<ui::Event*> dispatched_events_;
129
130 DISALLOW_COPY_AND_ASSIGN(GamepadEventConverterEvdevTest);
131 };
132
133 TEST_F(GamepadEventConverterEvdevTest, GamepadButton) {
134 std::unique_ptr<ui::GamepadEventConverterEvdev> dev =
135 base::WrapUnique(CreateDevice(kLinkGamepad));
136
137 // Generial key mapping test.
138 struct input_event mock_kernel_queue[] = {
139 {{0, 0}, EV_KEY, BTN_A, 1}, {{0, 0}, EV_KEY, BTN_B, 1},
140 {{0, 0}, EV_KEY, BTN_X, 1}, {{0, 0}, EV_KEY, BTN_Y, 1},
141 {{0, 0}, EV_KEY, BTN_TL, 1}, {{0, 0}, EV_KEY, BTN_TR, 1},
142 {{0, 0}, EV_KEY, BTN_TL2, 1}, {{0, 0}, EV_KEY, BTN_TR2, 1},
143 {{0, 0}, EV_KEY, BTN_SELECT, 1}, {{0, 0}, EV_KEY, BTN_START, 1},
144 {{0, 0}, EV_KEY, BTN_THUMBL, 1}, {{0, 0}, EV_KEY, BTN_THUMBR, 1},
145 {{0, 0}, EV_ABS, ABS_HAT0Y, -1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 1},
146 {{0, 0}, EV_ABS, ABS_HAT0X, -1}, {{0, 0}, EV_ABS, ABS_HAT0X, 1},
147 {{0, 0}, EV_KEY, BTN_MODE, 1},
148 };
149
150 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) {
151 dev->ProcessEvent(mock_kernel_queue[i]);
152 }
153 EXPECT_EQ(arraysize(mock_kernel_queue), DispatchedEventSize());
154 for (uint16_t i = 0; i < ui::kWebGamepadBtnCnt; ++i) {
155 EXPECT_EQ(GetNextEventAndPop()->get_code(), i);
156 }
157 }
158
159 TEST_F(GamepadEventConverterEvdevTest, GamepadAbs) {
160 std::unique_ptr<ui::GamepadEventConverterEvdev> dev =
161 base::WrapUnique(CreateDevice(kLinkGamepad));
162
163 struct input_event mock_kernel_queue[] = {
164 {{0, 0}, EV_ABS, ABS_HAT0X, -1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
165 {{0, 0}, EV_ABS, ABS_HAT0X, 1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
166 {{0, 0}, EV_ABS, ABS_HAT0Y, -1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
167 {{0, 0}, EV_ABS, ABS_HAT0Y, 1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
168 {{0, 0}, EV_ABS, ABS_X, -32767}, {{0, 0}, EV_ABS, ABS_X, 32767},
169 {{0, 0}, EV_ABS, ABS_X, -3},
170 };
171
172 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) {
173 dev->ProcessEvent(mock_kernel_queue[i]);
174 }
175 EXPECT_EQ(11u, DispatchedEventSize());
176 {
177 auto event = GetNextEventAndPop();
178 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
179 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_LEFT);
180 EXPECT_EQ(event->get_value(), -1);
181 }
182 {
183 auto event = GetNextEventAndPop();
184 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
185 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_LEFT);
186 EXPECT_EQ(event->get_value(), 0);
187 }
188 {
189 auto event = GetNextEventAndPop();
190 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
191 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_RIGHT);
192 EXPECT_EQ(event->get_value(), 1);
193 }
194 {
195 auto event = GetNextEventAndPop();
196 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
197 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_RIGHT);
198 EXPECT_EQ(event->get_value(), 0);
199 }
200 {
201 auto event = GetNextEventAndPop();
202 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
203 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_UP);
204 EXPECT_EQ(event->get_value(), -1);
205 }
206 {
207 auto event = GetNextEventAndPop();
208 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
209 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_UP);
210 EXPECT_EQ(event->get_value(), 0);
211 }
212 {
213 auto event = GetNextEventAndPop();
214 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
215 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_DOWN);
216 EXPECT_EQ(event->get_value(), 1);
217 }
218 {
219 auto event = GetNextEventAndPop();
220 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
221 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_DOWN);
222 EXPECT_EQ(event->get_value(), 0);
223 }
224 {
225 auto event = GetNextEventAndPop();
226 EXPECT_EQ(event->type(), ET_GAMEPAD_ABS_MOVED);
227 EXPECT_EQ(event->get_code(), WG_ABS_X);
228 EXPECT_EQ(event->get_value(), -1.0);
229 }
230 {
231 auto event = GetNextEventAndPop();
232 EXPECT_EQ(event->type(), ET_GAMEPAD_ABS_MOVED);
233 EXPECT_EQ(event->get_code(), WG_ABS_X);
234 EXPECT_EQ(event->get_value(), 1.0);
235 }
236 {
237 auto event = GetNextEventAndPop();
238 EXPECT_EQ(event->type(), ET_GAMEPAD_ABS_MOVED);
239 EXPECT_EQ(event->get_code(), WG_ABS_X);
240 EXPECT_EQ(event->get_value(), 0.0);
241 }
242 }
243
244 TEST_F(GamepadEventConverterEvdevTest, GamepadAbsWithWrongAbsInfo) {
245 std::unique_ptr<ui::GamepadEventConverterEvdev> dev =
246 base::WrapUnique(CreateDevice(kWrongAbsGamepad));
247
248 struct input_event mock_kernel_queue[] = {
249 {{0, 0}, EV_ABS, ABS_HAT0X, -1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
250 {{0, 0}, EV_ABS, ABS_HAT0X, 1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
251 {{0, 0}, EV_ABS, ABS_HAT0Y, -1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
252 {{0, 0}, EV_ABS, ABS_HAT0Y, 1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
253 {{0, 0}, EV_ABS, ABS_X, 1}, {{0, 0}, EV_ABS, ABS_X, 128},
254 {{0, 0}, EV_ABS, ABS_X, 255},
255 };
256
257 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) {
258 dev->ProcessEvent(mock_kernel_queue[i]);
259 }
260 EXPECT_EQ(11u, DispatchedEventSize());
261 {
262 auto event = GetNextEventAndPop();
263 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
264 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_LEFT);
265 EXPECT_EQ(event->get_value(), -1);
266 }
267 {
268 auto event = GetNextEventAndPop();
269 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
270 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_LEFT);
271 EXPECT_EQ(event->get_value(), 0);
272 }
273 {
274 auto event = GetNextEventAndPop();
275 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
276 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_RIGHT);
277 EXPECT_EQ(event->get_value(), 1);
278 }
279 {
280 auto event = GetNextEventAndPop();
281 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
282 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_RIGHT);
283 EXPECT_EQ(event->get_value(), 0);
284 }
285 {
286 auto event = GetNextEventAndPop();
287 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
288 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_UP);
289 EXPECT_EQ(event->get_value(), -1);
290 }
291 {
292 auto event = GetNextEventAndPop();
293 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
294 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_UP);
295 EXPECT_EQ(event->get_value(), 0);
296 }
297 {
298 auto event = GetNextEventAndPop();
299 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_PRESSED);
300 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_DOWN);
301 EXPECT_EQ(event->get_value(), 1);
302 }
303 {
304 auto event = GetNextEventAndPop();
305 EXPECT_EQ(event->type(), ET_GAMEPAD_BTN_RELEASED);
306 EXPECT_EQ(event->get_code(), WG_BUTTON_DPAD_DOWN);
307 EXPECT_EQ(event->get_value(), 0);
308 }
309 {
310 auto event = GetNextEventAndPop();
311 EXPECT_EQ(event->type(), ET_GAMEPAD_ABS_MOVED);
312 EXPECT_EQ(event->get_code(), WG_ABS_X);
313 EXPECT_EQ(event->get_value(), -1.0);
314 }
315 {
316 auto event = GetNextEventAndPop();
317 EXPECT_EQ(event->type(), ET_GAMEPAD_ABS_MOVED);
318 EXPECT_EQ(event->get_code(), WG_ABS_X);
319 EXPECT_EQ(event->get_value(), 0);
320 }
321 {
322 auto event = GetNextEventAndPop();
323 EXPECT_EQ(event->type(), ET_GAMEPAD_ABS_MOVED);
324 EXPECT_EQ(event->get_code(), WG_ABS_X);
325 EXPECT_EQ(event->get_value(), 1);
326 }
327 }
328
329 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698