1 // Copyright 2013 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>
7 #include "base/memory/scoped_ptr.h"
8 #include "base/memory/scoped_vector.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/events/event.h"
11 #include "ui/events/keycodes/keyboard_codes.h"
12 #include "ui/events/ozone/evdev/key_event_converter.h"
16 const int kInvalidFileDescriptor = -1;
17 const char kTestDevicePath[] = "/dev/input/test-device";
19 class MockKeyEventConverterEvdev : public KeyEventConverterEvdev {
21 MockKeyEventConverterEvdev(EventModifiersEvdev* modifiers)
22 : KeyEventConverterEvdev(kInvalidFileDescriptor,
23 base::FilePath(kTestDevicePath),
25 virtual ~MockKeyEventConverterEvdev() {};
27 unsigned size() { return dispatched_events_.size(); }
28 KeyEvent* event(unsigned index) { return dispatched_events_[index]; }
30 virtual void DispatchEvent(scoped_ptr<Event> event) OVERRIDE;
33 ScopedVector<KeyEvent> dispatched_events_;
35 DISALLOW_COPY_AND_ASSIGN(MockKeyEventConverterEvdev);
38 void MockKeyEventConverterEvdev::DispatchEvent(scoped_ptr<Event> event) {
39 dispatched_events_.push_back(static_cast<KeyEvent*>(event.release()));
45 class KeyEventConverterEvdevTest : public testing::Test {
47 KeyEventConverterEvdevTest() {}
49 // Overridden from testing::Test:
50 virtual void SetUp() OVERRIDE {
51 modifiers_ = new ui::EventModifiersEvdev();
52 device_ = new ui::MockKeyEventConverterEvdev(modifiers_);
54 virtual void TearDown() OVERRIDE {
59 ui::MockKeyEventConverterEvdev* device() { return device_; }
60 ui::EventModifiersEvdev* modifiers() { return modifiers_; }
63 ui::EventModifiersEvdev* modifiers_;
64 ui::MockKeyEventConverterEvdev* device_;
65 DISALLOW_COPY_AND_ASSIGN(KeyEventConverterEvdevTest);
68 TEST_F(KeyEventConverterEvdevTest, KeyPress) {
69 ui::MockKeyEventConverterEvdev* dev = device();
71 struct input_event mock_kernel_queue[] = {
72 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
73 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1},
74 {{0, 0}, EV_SYN, SYN_REPORT, 0},
76 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
77 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0},
78 {{0, 0}, EV_SYN, SYN_REPORT, 0},
81 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
82 EXPECT_EQ(2u, dev->size());
86 event = dev->event(0);
87 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
88 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
89 EXPECT_EQ(0, event->flags());
91 event = dev->event(1);
92 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
93 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
94 EXPECT_EQ(0, event->flags());
97 TEST_F(KeyEventConverterEvdevTest, KeyRepeat) {
98 ui::MockKeyEventConverterEvdev* dev = device();
100 struct input_event mock_kernel_queue[] = {
101 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
102 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1},
103 {{0, 0}, EV_SYN, SYN_REPORT, 0},
105 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
106 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2},
107 {{0, 0}, EV_SYN, SYN_REPORT, 0},
109 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
110 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2},
111 {{0, 0}, EV_SYN, SYN_REPORT, 0},
113 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
114 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0},
115 {{0, 0}, EV_SYN, SYN_REPORT, 0},
118 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
119 EXPECT_EQ(4u, dev->size());
123 event = dev->event(0);
124 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
125 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
126 EXPECT_EQ(0, event->flags());
128 event = dev->event(1);
129 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
130 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
131 EXPECT_EQ(0, event->flags());
133 event = dev->event(2);
134 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
135 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
136 EXPECT_EQ(0, event->flags());
138 event = dev->event(3);
139 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
140 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
141 EXPECT_EQ(0, event->flags());
144 TEST_F(KeyEventConverterEvdevTest, NoEvents) {
145 ui::MockKeyEventConverterEvdev* dev = device();
146 dev->ProcessEvents(NULL, 0);
147 EXPECT_EQ(0u, dev->size());
150 TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) {
151 ui::MockKeyEventConverterEvdev* dev = device();
153 struct input_event mock_kernel_queue[] = {
154 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
155 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 1},
156 {{0, 0}, EV_SYN, SYN_REPORT, 0},
158 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004},
159 {{0, 0}, EV_KEY, KEY_A, 1},
160 {{0, 0}, EV_SYN, SYN_REPORT, 0},
162 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004},
163 {{0, 0}, EV_KEY, KEY_A, 0},
164 {{0, 0}, EV_SYN, SYN_REPORT, 0},
166 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
167 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 0},
168 {{0, 0}, EV_SYN, SYN_REPORT, 0},
171 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
172 EXPECT_EQ(4u, dev->size());
176 event = dev->event(0);
177 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
178 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
179 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
181 event = dev->event(1);
182 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
183 EXPECT_EQ(ui::VKEY_A, event->key_code());
184 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
186 event = dev->event(2);
187 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
188 EXPECT_EQ(ui::VKEY_A, event->key_code());
189 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
191 event = dev->event(3);
192 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
193 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
194 EXPECT_EQ(0, event->flags());
197 TEST_F(KeyEventConverterEvdevTest, KeyWithDuplicateModifier) {
198 ui::MockKeyEventConverterEvdev* dev = device();
200 struct input_event mock_kernel_queue[] = {
201 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
202 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 1},
203 {{0, 0}, EV_SYN, SYN_REPORT, 0},
205 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5},
206 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 1},
207 {{0, 0}, EV_SYN, SYN_REPORT, 0},
209 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d},
210 {{0, 0}, EV_KEY, KEY_Z, 1},
211 {{0, 0}, EV_SYN, SYN_REPORT, 0},
213 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d},
214 {{0, 0}, EV_KEY, KEY_Z, 0},
215 {{0, 0}, EV_SYN, SYN_REPORT, 0},
217 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
218 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 0},
219 {{0, 0}, EV_SYN, SYN_REPORT, 0},
221 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5},
222 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 0},
223 {{0, 0}, EV_SYN, SYN_REPORT, 0},
226 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
227 EXPECT_EQ(6u, dev->size());
231 event = dev->event(0);
232 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
233 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
234 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
236 event = dev->event(1);
237 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
238 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
239 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
241 event = dev->event(2);
242 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
243 EXPECT_EQ(ui::VKEY_Z, event->key_code());
244 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
246 event = dev->event(3);
247 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
248 EXPECT_EQ(ui::VKEY_Z, event->key_code());
249 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
251 event = dev->event(4);
252 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
253 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
254 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
256 event = dev->event(5);
257 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
258 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
259 EXPECT_EQ(0, event->flags());
262 TEST_F(KeyEventConverterEvdevTest, KeyWithLock) {
263 ui::MockKeyEventConverterEvdev* dev = device();
265 struct input_event mock_kernel_queue[] = {
266 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
267 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1},
268 {{0, 0}, EV_SYN, SYN_REPORT, 0},
270 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
271 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0},
272 {{0, 0}, EV_SYN, SYN_REPORT, 0},
274 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014},
275 {{0, 0}, EV_KEY, KEY_Q, 1},
276 {{0, 0}, EV_SYN, SYN_REPORT, 0},
278 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014},
279 {{0, 0}, EV_KEY, KEY_Q, 0},
280 {{0, 0}, EV_SYN, SYN_REPORT, 0},
282 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
283 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1},
284 {{0, 0}, EV_SYN, SYN_REPORT, 0},
286 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
287 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0},
288 {{0, 0}, EV_SYN, SYN_REPORT, 0},
291 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
292 EXPECT_EQ(6u, dev->size());
296 event = dev->event(0);
297 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
298 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
299 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
301 event = dev->event(1);
302 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
303 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
304 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
306 event = dev->event(2);
307 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
308 EXPECT_EQ(ui::VKEY_Q, event->key_code());
309 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
311 event = dev->event(3);
312 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
313 EXPECT_EQ(ui::VKEY_Q, event->key_code());
314 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
316 event = dev->event(4);
317 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
318 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
319 EXPECT_EQ(0, event->flags());
321 event = dev->event(5);
322 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
323 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
324 EXPECT_EQ(0, event->flags());