OLD | NEW |
| (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 <linux/input.h> | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/memory/scoped_ptr.h" | |
9 #include "base/memory/scoped_vector.h" | |
10 #include "base/message_loop/message_loop.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 #include "ui/events/event.h" | |
13 #include "ui/events/keycodes/keyboard_codes.h" | |
14 #include "ui/events/ozone/evdev/event_converter_evdev_impl.h" | |
15 #include "ui/events/ozone/evdev/keyboard_evdev.h" | |
16 | |
17 namespace ui { | |
18 | |
19 const char kTestDevicePath[] = "/dev/input/test-device"; | |
20 | |
21 class MockEventConverterEvdevImpl : public EventConverterEvdevImpl { | |
22 public: | |
23 MockEventConverterEvdevImpl(int fd, KeyboardEvdev* keyboard) | |
24 : EventConverterEvdevImpl(fd, | |
25 base::FilePath(kTestDevicePath), | |
26 1, | |
27 keyboard) { | |
28 Start(); | |
29 } | |
30 virtual ~MockEventConverterEvdevImpl() {} | |
31 | |
32 private: | |
33 DISALLOW_COPY_AND_ASSIGN(MockEventConverterEvdevImpl); | |
34 }; | |
35 | |
36 } // namespace ui | |
37 | |
38 // Test fixture. | |
39 class EventConverterEvdevImplTest : public testing::Test { | |
40 public: | |
41 EventConverterEvdevImplTest() {} | |
42 | |
43 // Overridden from testing::Test: | |
44 void SetUp() override { | |
45 // Set up pipe to satisfy message pump (unused). | |
46 int evdev_io[2]; | |
47 if (pipe(evdev_io)) | |
48 PLOG(FATAL) << "failed pipe"; | |
49 events_in_ = evdev_io[0]; | |
50 events_out_ = evdev_io[1]; | |
51 | |
52 modifiers_.reset(new ui::EventModifiersEvdev()); | |
53 keyboard_.reset(new ui::KeyboardEvdev( | |
54 modifiers_.get(), | |
55 base::Bind(&EventConverterEvdevImplTest::DispatchEventForTest, | |
56 base::Unretained(this)))); | |
57 device_.reset( | |
58 new ui::MockEventConverterEvdevImpl(events_in_, keyboard_.get())); | |
59 } | |
60 void TearDown() override { | |
61 device_.reset(); | |
62 keyboard_.reset(); | |
63 modifiers_.reset(); | |
64 close(events_in_); | |
65 close(events_out_); | |
66 } | |
67 | |
68 ui::MockEventConverterEvdevImpl* device() { return device_.get(); } | |
69 ui::EventModifiersEvdev* modifiers() { return modifiers_.get(); } | |
70 | |
71 unsigned size() { return dispatched_events_.size(); } | |
72 ui::KeyEvent* dispatched_event(unsigned index) { | |
73 DCHECK_GT(dispatched_events_.size(), index); | |
74 ui::Event* ev = dispatched_events_[index]; | |
75 DCHECK(ev->IsKeyEvent()); | |
76 return static_cast<ui::KeyEvent*>(ev); | |
77 } | |
78 | |
79 private: | |
80 void DispatchEventForTest(scoped_ptr<ui::Event> event) { | |
81 dispatched_events_.push_back(event.release()); | |
82 } | |
83 | |
84 base::MessageLoopForUI ui_loop_; | |
85 | |
86 scoped_ptr<ui::EventModifiersEvdev> modifiers_; | |
87 scoped_ptr<ui::KeyboardEvdev> keyboard_; | |
88 scoped_ptr<ui::MockEventConverterEvdevImpl> device_; | |
89 | |
90 ScopedVector<ui::Event> dispatched_events_; | |
91 | |
92 int events_out_; | |
93 int events_in_; | |
94 | |
95 DISALLOW_COPY_AND_ASSIGN(EventConverterEvdevImplTest); | |
96 }; | |
97 | |
98 TEST_F(EventConverterEvdevImplTest, KeyPress) { | |
99 ui::MockEventConverterEvdevImpl* dev = device(); | |
100 | |
101 struct input_event mock_kernel_queue[] = { | |
102 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, | |
103 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1}, | |
104 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
105 | |
106 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, | |
107 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0}, | |
108 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
109 }; | |
110 | |
111 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); | |
112 EXPECT_EQ(2u, size()); | |
113 | |
114 ui::KeyEvent* event; | |
115 | |
116 event = dispatched_event(0); | |
117 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
118 EXPECT_EQ(ui::VKEY_BACK, event->key_code()); | |
119 EXPECT_EQ(0, event->flags()); | |
120 | |
121 event = dispatched_event(1); | |
122 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
123 EXPECT_EQ(ui::VKEY_BACK, event->key_code()); | |
124 EXPECT_EQ(0, event->flags()); | |
125 } | |
126 | |
127 TEST_F(EventConverterEvdevImplTest, KeyRepeat) { | |
128 ui::MockEventConverterEvdevImpl* dev = device(); | |
129 | |
130 struct input_event mock_kernel_queue[] = { | |
131 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, | |
132 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1}, | |
133 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
134 | |
135 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, | |
136 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2}, | |
137 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
138 | |
139 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, | |
140 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2}, | |
141 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
142 | |
143 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, | |
144 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0}, | |
145 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
146 }; | |
147 | |
148 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); | |
149 EXPECT_EQ(4u, size()); | |
150 | |
151 ui::KeyEvent* event; | |
152 | |
153 event = dispatched_event(0); | |
154 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
155 EXPECT_EQ(ui::VKEY_BACK, event->key_code()); | |
156 EXPECT_EQ(0, event->flags()); | |
157 | |
158 event = dispatched_event(1); | |
159 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
160 EXPECT_EQ(ui::VKEY_BACK, event->key_code()); | |
161 EXPECT_EQ(0, event->flags()); | |
162 | |
163 event = dispatched_event(2); | |
164 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
165 EXPECT_EQ(ui::VKEY_BACK, event->key_code()); | |
166 EXPECT_EQ(0, event->flags()); | |
167 | |
168 event = dispatched_event(3); | |
169 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
170 EXPECT_EQ(ui::VKEY_BACK, event->key_code()); | |
171 EXPECT_EQ(0, event->flags()); | |
172 } | |
173 | |
174 TEST_F(EventConverterEvdevImplTest, NoEvents) { | |
175 ui::MockEventConverterEvdevImpl* dev = device(); | |
176 dev->ProcessEvents(NULL, 0); | |
177 EXPECT_EQ(0u, size()); | |
178 } | |
179 | |
180 TEST_F(EventConverterEvdevImplTest, KeyWithModifier) { | |
181 ui::MockEventConverterEvdevImpl* dev = device(); | |
182 | |
183 struct input_event mock_kernel_queue[] = { | |
184 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, | |
185 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 1}, | |
186 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
187 | |
188 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004}, | |
189 {{0, 0}, EV_KEY, KEY_A, 1}, | |
190 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
191 | |
192 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004}, | |
193 {{0, 0}, EV_KEY, KEY_A, 0}, | |
194 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
195 | |
196 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, | |
197 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 0}, | |
198 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
199 }; | |
200 | |
201 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); | |
202 EXPECT_EQ(4u, size()); | |
203 | |
204 ui::KeyEvent* event; | |
205 | |
206 event = dispatched_event(0); | |
207 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
208 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code()); | |
209 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); | |
210 | |
211 event = dispatched_event(1); | |
212 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
213 EXPECT_EQ(ui::VKEY_A, event->key_code()); | |
214 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); | |
215 | |
216 event = dispatched_event(2); | |
217 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
218 EXPECT_EQ(ui::VKEY_A, event->key_code()); | |
219 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); | |
220 | |
221 event = dispatched_event(3); | |
222 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
223 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code()); | |
224 EXPECT_EQ(0, event->flags()); | |
225 } | |
226 | |
227 TEST_F(EventConverterEvdevImplTest, KeyWithDuplicateModifier) { | |
228 ui::MockEventConverterEvdevImpl* dev = device(); | |
229 | |
230 struct input_event mock_kernel_queue[] = { | |
231 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, | |
232 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 1}, | |
233 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
234 | |
235 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5}, | |
236 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 1}, | |
237 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
238 | |
239 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d}, | |
240 {{0, 0}, EV_KEY, KEY_Z, 1}, | |
241 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
242 | |
243 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d}, | |
244 {{0, 0}, EV_KEY, KEY_Z, 0}, | |
245 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
246 | |
247 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, | |
248 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 0}, | |
249 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
250 | |
251 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5}, | |
252 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 0}, | |
253 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
254 }; | |
255 | |
256 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); | |
257 EXPECT_EQ(6u, size()); | |
258 | |
259 ui::KeyEvent* event; | |
260 | |
261 event = dispatched_event(0); | |
262 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
263 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); | |
264 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); | |
265 | |
266 event = dispatched_event(1); | |
267 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
268 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); | |
269 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); | |
270 | |
271 event = dispatched_event(2); | |
272 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
273 EXPECT_EQ(ui::VKEY_Z, event->key_code()); | |
274 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); | |
275 | |
276 event = dispatched_event(3); | |
277 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
278 EXPECT_EQ(ui::VKEY_Z, event->key_code()); | |
279 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); | |
280 | |
281 event = dispatched_event(4); | |
282 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
283 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); | |
284 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); | |
285 | |
286 event = dispatched_event(5); | |
287 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
288 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); | |
289 EXPECT_EQ(0, event->flags()); | |
290 } | |
291 | |
292 TEST_F(EventConverterEvdevImplTest, KeyWithLock) { | |
293 ui::MockEventConverterEvdevImpl* dev = device(); | |
294 | |
295 struct input_event mock_kernel_queue[] = { | |
296 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, | |
297 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1}, | |
298 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
299 | |
300 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, | |
301 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0}, | |
302 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
303 | |
304 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014}, | |
305 {{0, 0}, EV_KEY, KEY_Q, 1}, | |
306 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
307 | |
308 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014}, | |
309 {{0, 0}, EV_KEY, KEY_Q, 0}, | |
310 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
311 | |
312 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, | |
313 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1}, | |
314 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
315 | |
316 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, | |
317 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0}, | |
318 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
319 }; | |
320 | |
321 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); | |
322 EXPECT_EQ(6u, size()); | |
323 | |
324 ui::KeyEvent* event; | |
325 | |
326 event = dispatched_event(0); | |
327 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
328 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); | |
329 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); | |
330 | |
331 event = dispatched_event(1); | |
332 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
333 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); | |
334 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); | |
335 | |
336 event = dispatched_event(2); | |
337 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
338 EXPECT_EQ(ui::VKEY_Q, event->key_code()); | |
339 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); | |
340 | |
341 event = dispatched_event(3); | |
342 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
343 EXPECT_EQ(ui::VKEY_Q, event->key_code()); | |
344 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); | |
345 | |
346 event = dispatched_event(4); | |
347 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); | |
348 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); | |
349 EXPECT_EQ(0, event->flags()); | |
350 | |
351 event = dispatched_event(5); | |
352 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); | |
353 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); | |
354 EXPECT_EQ(0, event->flags()); | |
355 } | |
356 | |
357 TEST_F(EventConverterEvdevImplTest, UnmappedKeyPress) { | |
358 ui::MockEventConverterEvdevImpl* dev = device(); | |
359 | |
360 struct input_event mock_kernel_queue[] = { | |
361 {{0, 0}, EV_KEY, BTN_TOUCH, 1}, | |
362 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
363 | |
364 {{0, 0}, EV_KEY, BTN_TOUCH, 0}, | |
365 {{0, 0}, EV_SYN, SYN_REPORT, 0}, | |
366 }; | |
367 | |
368 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); | |
369 EXPECT_EQ(0u, size()); | |
370 } | |
OLD | NEW |