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.
5 #include <linux/input.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/key_event_converter_evdev.h"
18 const char kTestDevicePath[] = "/dev/input/test-device";
20 class MockKeyEventConverterEvdev : public KeyEventConverterEvdev {
22 MockKeyEventConverterEvdev(int fd, EventModifiersEvdev* modifiers)
23 : KeyEventConverterEvdev(
25 base::FilePath(kTestDevicePath),
27 base::Bind(&MockKeyEventConverterEvdev::DispatchEventForTest,
28 base::Unretained(this))) {
31 virtual ~MockKeyEventConverterEvdev() {};
33 unsigned size() { return dispatched_events_.size(); }
34 KeyEvent* event(unsigned index) {
35 DCHECK_GT(dispatched_events_.size(), index);
36 return dispatched_events_[index];
39 void DispatchEventForTest(Event* event);
42 ScopedVector<KeyEvent> dispatched_events_;
44 DISALLOW_COPY_AND_ASSIGN(MockKeyEventConverterEvdev);
47 void MockKeyEventConverterEvdev::DispatchEventForTest(Event* event) {
48 dispatched_events_.push_back(new KeyEvent(*static_cast<KeyEvent*>(event)));
54 class KeyEventConverterEvdevTest : public testing::Test {
56 KeyEventConverterEvdevTest() {}
58 // Overridden from testing::Test:
59 virtual void SetUp() OVERRIDE {
61 // Set up pipe to satisfy message pump (unused).
64 PLOG(FATAL) << "failed pipe";
65 events_in_ = evdev_io[0];
66 events_out_ = evdev_io[1];
68 modifiers_ = new ui::EventModifiersEvdev();
69 device_ = new ui::MockKeyEventConverterEvdev(events_in_, modifiers_);
71 virtual void TearDown() OVERRIDE {
78 ui::MockKeyEventConverterEvdev* device() { return device_; }
79 ui::EventModifiersEvdev* modifiers() { return modifiers_; }
82 base::MessageLoopForUI ui_loop_;
84 ui::EventModifiersEvdev* modifiers_;
85 ui::MockKeyEventConverterEvdev* device_;
90 DISALLOW_COPY_AND_ASSIGN(KeyEventConverterEvdevTest);
93 TEST_F(KeyEventConverterEvdevTest, KeyPress) {
94 ui::MockKeyEventConverterEvdev* dev = device();
96 struct input_event mock_kernel_queue[] = {
97 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
98 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1},
99 {{0, 0}, EV_SYN, SYN_REPORT, 0},
101 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
102 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0},
103 {{0, 0}, EV_SYN, SYN_REPORT, 0},
106 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
107 EXPECT_EQ(2u, dev->size());
111 event = dev->event(0);
112 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
113 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
114 EXPECT_EQ(0, event->flags());
116 event = dev->event(1);
117 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
118 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
119 EXPECT_EQ(0, event->flags());
122 TEST_F(KeyEventConverterEvdevTest, KeyRepeat) {
123 ui::MockKeyEventConverterEvdev* dev = device();
125 struct input_event mock_kernel_queue[] = {
126 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
127 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1},
128 {{0, 0}, EV_SYN, SYN_REPORT, 0},
130 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
131 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2},
132 {{0, 0}, EV_SYN, SYN_REPORT, 0},
134 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
135 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2},
136 {{0, 0}, EV_SYN, SYN_REPORT, 0},
138 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
139 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0},
140 {{0, 0}, EV_SYN, SYN_REPORT, 0},
143 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
144 EXPECT_EQ(4u, dev->size());
148 event = dev->event(0);
149 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
150 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
151 EXPECT_EQ(0, event->flags());
153 event = dev->event(1);
154 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
155 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
156 EXPECT_EQ(0, event->flags());
158 event = dev->event(2);
159 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
160 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
161 EXPECT_EQ(0, event->flags());
163 event = dev->event(3);
164 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
165 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
166 EXPECT_EQ(0, event->flags());
169 TEST_F(KeyEventConverterEvdevTest, NoEvents) {
170 ui::MockKeyEventConverterEvdev* dev = device();
171 dev->ProcessEvents(NULL, 0);
172 EXPECT_EQ(0u, dev->size());
175 TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) {
176 ui::MockKeyEventConverterEvdev* dev = device();
178 struct input_event mock_kernel_queue[] = {
179 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
180 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 1},
181 {{0, 0}, EV_SYN, SYN_REPORT, 0},
183 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004},
184 {{0, 0}, EV_KEY, KEY_A, 1},
185 {{0, 0}, EV_SYN, SYN_REPORT, 0},
187 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004},
188 {{0, 0}, EV_KEY, KEY_A, 0},
189 {{0, 0}, EV_SYN, SYN_REPORT, 0},
191 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
192 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 0},
193 {{0, 0}, EV_SYN, SYN_REPORT, 0},
196 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
197 EXPECT_EQ(4u, dev->size());
201 event = dev->event(0);
202 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
203 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
204 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
206 event = dev->event(1);
207 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
208 EXPECT_EQ(ui::VKEY_A, event->key_code());
209 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
211 event = dev->event(2);
212 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
213 EXPECT_EQ(ui::VKEY_A, event->key_code());
214 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
216 event = dev->event(3);
217 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
218 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
219 EXPECT_EQ(0, event->flags());
222 TEST_F(KeyEventConverterEvdevTest, KeyWithDuplicateModifier) {
223 ui::MockKeyEventConverterEvdev* dev = device();
225 struct input_event mock_kernel_queue[] = {
226 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
227 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 1},
228 {{0, 0}, EV_SYN, SYN_REPORT, 0},
230 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5},
231 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 1},
232 {{0, 0}, EV_SYN, SYN_REPORT, 0},
234 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d},
235 {{0, 0}, EV_KEY, KEY_Z, 1},
236 {{0, 0}, EV_SYN, SYN_REPORT, 0},
238 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d},
239 {{0, 0}, EV_KEY, KEY_Z, 0},
240 {{0, 0}, EV_SYN, SYN_REPORT, 0},
242 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
243 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 0},
244 {{0, 0}, EV_SYN, SYN_REPORT, 0},
246 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5},
247 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 0},
248 {{0, 0}, EV_SYN, SYN_REPORT, 0},
251 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
252 EXPECT_EQ(6u, dev->size());
256 event = dev->event(0);
257 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
258 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
259 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
261 event = dev->event(1);
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());
266 event = dev->event(2);
267 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
268 EXPECT_EQ(ui::VKEY_Z, event->key_code());
269 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
271 event = dev->event(3);
272 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
273 EXPECT_EQ(ui::VKEY_Z, event->key_code());
274 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
276 event = dev->event(4);
277 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
278 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
279 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
281 event = dev->event(5);
282 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
283 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
284 EXPECT_EQ(0, event->flags());
287 TEST_F(KeyEventConverterEvdevTest, KeyWithLock) {
288 ui::MockKeyEventConverterEvdev* dev = device();
290 struct input_event mock_kernel_queue[] = {
291 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
292 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1},
293 {{0, 0}, EV_SYN, SYN_REPORT, 0},
295 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
296 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0},
297 {{0, 0}, EV_SYN, SYN_REPORT, 0},
299 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014},
300 {{0, 0}, EV_KEY, KEY_Q, 1},
301 {{0, 0}, EV_SYN, SYN_REPORT, 0},
303 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014},
304 {{0, 0}, EV_KEY, KEY_Q, 0},
305 {{0, 0}, EV_SYN, SYN_REPORT, 0},
307 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
308 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1},
309 {{0, 0}, EV_SYN, SYN_REPORT, 0},
311 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
312 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0},
313 {{0, 0}, EV_SYN, SYN_REPORT, 0},
316 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
317 EXPECT_EQ(6u, dev->size());
321 event = dev->event(0);
322 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
323 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
324 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
326 event = dev->event(1);
327 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
328 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
329 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
331 event = dev->event(2);
332 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
333 EXPECT_EQ(ui::VKEY_Q, event->key_code());
334 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
336 event = dev->event(3);
337 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
338 EXPECT_EQ(ui::VKEY_Q, event->key_code());
339 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
341 event = dev->event(4);
342 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
343 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
344 EXPECT_EQ(0, event->flags());
346 event = dev->event(5);
347 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
348 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
349 EXPECT_EQ(0, event->flags());