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

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, 7 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 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
OLDNEW
« no previous file with comments | « ui/events/ozone/evdev/gamepad_event_converter_evdev.cc ('k') | ui/events/ozone/evdev/input_device_factory_evdev.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698