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

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

Issue 2805793002: ozone: evdev: Add gamepad support (Closed)
Patch Set: Support Gamepad in Ozone. 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/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 // xbox controller with wrong abs_info.
60 const ui::DeviceAbsoluteAxis kWrongAbsGamepadAbsAxes[] = {
spang 2017/04/21 05:38:46 I'm confused by this - why is it different from th
jkwang 2017/04/25 21:16:41 Sure. I am removing this and will add some other g
61 {ABS_X, {127, 0, 255, 0, 255}},
62 {ABS_Y, {0, 0, 255, 0, 10}},
63 {ABS_Z, {0, 0, 255, 0, 0}},
64 {ABS_RX, {0, -32768, 32767, 16, 128}},
65 {ABS_RY, {0, -32768, 32767, 16, 128}},
66 {ABS_RZ, {0, 0, 255, 0, 0}},
67 {ABS_HAT0X, {0, -1, 1, 0, 0}},
68 {ABS_HAT0Y, {0, -1, 1, 0, 0}}};
69
70 const ui::DeviceCapabilities kWrongAbsGamepad = {
71 /* path */
72 "/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0/"
73 "input/input38/event11",
74 /* name */ "Microsoft X-Box 360 pad",
75 /* phys */ "usb-0000:00:14.0-2.2/input0",
76 /* uniq */ "",
77 /* bustype */ "0011",
78 /* vendor */ "045e",
79 /* product */ "028e",
80 /* version */ "0114",
81 /* prop */ "0",
82 /* ev */ "20000b",
83 /* key */ "7cdb000000000000 0 0 0 0",
84 /* rel */ "0",
85 /* abs */ "3003f",
86 /* msc */ "0",
87 /* sw */ "0",
88 /* led */ "0",
89 /* ff */ "0",
90 kWrongAbsGamepadAbsAxes,
91 arraysize(kWrongAbsGamepadAbsAxes),
92 };
93
94 } // namespace
95
96 namespace ui {
97 class GamepadEventConverterEvdevTest : public testing::Test {
98 public:
99 GamepadEventConverterEvdevTest() {}
100
101 // Overriden from testing::Test:
102 void SetUp() override {
103 device_manager_ = ui::CreateDeviceManagerForTest();
104 event_factory_ = ui::CreateEventFactoryEvdevForTest(
105 nullptr, device_manager_.get(),
106 ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine(),
107 base::Bind(&GamepadEventConverterEvdevTest::DispatchEventForTest,
108 base::Unretained(this)));
109 dispatcher_ =
110 ui::CreateDeviceEventDispatcherEvdevForTest(event_factory_.get());
111 }
112
113 ui::GamepadEventConverterEvdev* CreateDevice(
114 const ui::DeviceCapabilities& caps) {
115 int evdev_io[2];
116 if (pipe(evdev_io))
117 PLOG(FATAL) << "failed pipe";
118 ui::ScopedInputDevice events_in(evdev_io[0]);
119 ui::ScopedInputDevice events_out(evdev_io[1]);
120
121 ui::EventDeviceInfo devinfo;
122 CapabilitiesToDeviceInfo(caps, &devinfo);
123 return new ui::GamepadEventConverterEvdev(std::move(events_in),
124 base::FilePath(kTestDevicePath),
125 1, devinfo, dispatcher_.get());
126 }
127
128 private:
129 void DispatchEventForTest(ui::Event* event) {}
130
131 std::unique_ptr<ui::GamepadEventConverterEvdev> gamepad_evdev_;
132 std::unique_ptr<ui::DeviceManager> device_manager_;
133 std::unique_ptr<ui::EventFactoryEvdev> event_factory_;
134 std::unique_ptr<ui::DeviceEventDispatcherEvdev> dispatcher_;
135
136 DISALLOW_COPY_AND_ASSIGN(GamepadEventConverterEvdevTest);
137 };
138
139 TEST_F(GamepadEventConverterEvdevTest, GamepadButton) {
140 TestGamepadObserver observer;
141 std::unique_ptr<ui::GamepadEventConverterEvdev> dev =
142 base::WrapUnique(CreateDevice(kXboxGamepad));
143 // Generial key mapping test.
144 struct input_event mock_kernel_queue[] = {
145 {{0, 0}, EV_KEY, BTN_A, 1}, {{0, 0}, EV_KEY, BTN_B, 1},
spang 2017/04/21 05:38:46 Please prefer real data for tests. To capture data
146 {{0, 0}, EV_KEY, BTN_X, 1}, {{0, 0}, EV_KEY, BTN_Y, 1},
147 {{0, 0}, EV_KEY, BTN_TL, 1}, {{0, 0}, EV_KEY, BTN_TR, 1},
148 {{0, 0}, EV_KEY, BTN_TL2, 1}, {{0, 0}, EV_KEY, BTN_TR2, 1},
149 {{0, 0}, EV_KEY, BTN_SELECT, 1}, {{0, 0}, EV_KEY, BTN_START, 1},
150 {{0, 0}, EV_KEY, BTN_THUMBL, 1}, {{0, 0}, EV_KEY, BTN_THUMBR, 1},
151 {{0, 0}, EV_ABS, ABS_HAT0Y, -1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 1},
152 {{0, 0}, EV_ABS, ABS_HAT0X, -1}, {{0, 0}, EV_ABS, ABS_HAT0X, 1},
153 {{0, 0}, EV_KEY, BTN_MODE, 1},
154 };
155
156 size_t event_size = arraysize(mock_kernel_queue);
157 for (unsigned i = 0; i < event_size; ++i) {
158 dev->ProcessEvent(mock_kernel_queue[i]);
159 EXPECT_EQ(observer.events.size(), i + 1);
160 EXPECT_EQ(observer.events[i].get_type(), GamepadEventType::BUTTON);
161 EXPECT_EQ(observer.events[i].get_code(), i);
162 EXPECT_EQ(observer.events[i].get_value(), mock_kernel_queue[i].value);
163 }
164 }
165
166 struct ExpectedEvent {
167 GamepadEventType type;
168 uint16_t code;
169 double value;
170 };
171
172 TEST_F(GamepadEventConverterEvdevTest, GamepadAbs) {
173 TestGamepadObserver observer;
174 std::unique_ptr<ui::GamepadEventConverterEvdev> dev =
175 base::WrapUnique(CreateDevice(kXboxGamepad));
176
177 struct input_event mock_kernel_queue[] = {
178 {{0, 0}, EV_ABS, ABS_HAT0X, -1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
179 {{0, 0}, EV_ABS, ABS_HAT0X, 1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
180 {{0, 0}, EV_ABS, ABS_HAT0Y, -1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
181 {{0, 0}, EV_ABS, ABS_HAT0Y, 1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
182 {{0, 0}, EV_ABS, ABS_X, -32767}, {{0, 0}, EV_ABS, ABS_X, 32767},
183 {{0, 0}, EV_ABS, ABS_X, -3},
184 };
185
186 struct ExpectedEvent expected_events[] = {
187 {GamepadEventType::BUTTON, 14, -1}, {GamepadEventType::BUTTON, 14, 0},
188 {GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::BUTTON, 15, 0},
189 {GamepadEventType::BUTTON, 12, -1}, {GamepadEventType::BUTTON, 12, 0},
190 {GamepadEventType::BUTTON, 13, 1}, {GamepadEventType::BUTTON, 13, 0},
191 {GamepadEventType::AXIS, 0, -1}, {GamepadEventType::AXIS, 0, 1},
192 {GamepadEventType::AXIS, 0, 0}};
193
194 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) {
195 dev->ProcessEvent(mock_kernel_queue[i]);
196 EXPECT_EQ(observer.events.size(), i + 1);
197 EXPECT_EQ(observer.events[i].get_type(), expected_events[i].type);
198 EXPECT_EQ(observer.events[i].get_code(), expected_events[i].code);
199 EXPECT_EQ(observer.events[i].get_value(), expected_events[i].value);
200 }
201 }
202
203 TEST_F(GamepadEventConverterEvdevTest, GamepadAbsWithWrongAbsInfo) {
204 TestGamepadObserver observer;
205 std::unique_ptr<ui::GamepadEventConverterEvdev> dev =
206 base::WrapUnique(CreateDevice(kWrongAbsGamepad));
207
208 struct input_event mock_kernel_queue[] = {
209 {{0, 0}, EV_ABS, ABS_HAT0X, -1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
210 {{0, 0}, EV_ABS, ABS_HAT0X, 1}, {{0, 0}, EV_ABS, ABS_HAT0X, 0},
211 {{0, 0}, EV_ABS, ABS_HAT0Y, -1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
212 {{0, 0}, EV_ABS, ABS_HAT0Y, 1}, {{0, 0}, EV_ABS, ABS_HAT0Y, 0},
213 {{0, 0}, EV_ABS, ABS_X, 1}, {{0, 0}, EV_ABS, ABS_X, 128},
214 {{0, 0}, EV_ABS, ABS_X, 255},
215 };
216
217 struct ExpectedEvent expected_events[] = {
218 {GamepadEventType::BUTTON, 14, -1}, {GamepadEventType::BUTTON, 14, 0},
219 {GamepadEventType::BUTTON, 15, 1}, {GamepadEventType::BUTTON, 15, 0},
220 {GamepadEventType::BUTTON, 12, -1}, {GamepadEventType::BUTTON, 12, 0},
221 {GamepadEventType::BUTTON, 13, 1}, {GamepadEventType::BUTTON, 13, 0},
222 {GamepadEventType::AXIS, 0, -1}, {GamepadEventType::AXIS, 0, 0},
223 {GamepadEventType::AXIS, 0, 1}};
224
225 for (unsigned i = 0; i < arraysize(mock_kernel_queue); ++i) {
226 dev->ProcessEvent(mock_kernel_queue[i]);
227 EXPECT_EQ(observer.events.size(), i + 1);
228 EXPECT_EQ(observer.events[i].get_type(), expected_events[i].type);
229 EXPECT_EQ(observer.events[i].get_code(), expected_events[i].code);
230 EXPECT_EQ(observer.events[i].get_value(), expected_events[i].value);
231 }
232 }
233
234 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698