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 class MockKeyEventConverterEvdev : public KeyEventConverterEvdev {
18 MockKeyEventConverterEvdev(EventModifiersEvdev* modifiers)
19 : KeyEventConverterEvdev(modifiers) {}
20 virtual ~MockKeyEventConverterEvdev() {};
22 unsigned size() { return dispatched_events_.size(); }
23 KeyEvent* event(unsigned index) { return dispatched_events_[index]; }
25 virtual void DispatchEvent(scoped_ptr<Event> event) OVERRIDE;
28 ScopedVector<KeyEvent> dispatched_events_;
30 DISALLOW_COPY_AND_ASSIGN(MockKeyEventConverterEvdev);
33 void MockKeyEventConverterEvdev::DispatchEvent(scoped_ptr<Event> event) {
34 dispatched_events_.push_back(static_cast<KeyEvent*>(event.release()));
40 class KeyEventConverterEvdevTest : public testing::Test {
42 KeyEventConverterEvdevTest() {}
44 // Overridden from testing::Test:
45 virtual void SetUp() OVERRIDE {
46 modifiers_ = new ui::EventModifiersEvdev();
47 device_ = new ui::MockKeyEventConverterEvdev(modifiers_);
49 virtual void TearDown() OVERRIDE {
54 ui::MockKeyEventConverterEvdev* device() { return device_; }
55 ui::EventModifiersEvdev* modifiers() { return modifiers_; }
58 ui::EventModifiersEvdev* modifiers_;
59 ui::MockKeyEventConverterEvdev* device_;
60 DISALLOW_COPY_AND_ASSIGN(KeyEventConverterEvdevTest);
63 TEST_F(KeyEventConverterEvdevTest, KeyPress) {
64 ui::MockKeyEventConverterEvdev* dev = device();
66 struct input_event mock_kernel_queue[] = {
67 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
68 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1},
69 {{0, 0}, EV_SYN, SYN_REPORT, 0},
71 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
72 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0},
73 {{0, 0}, EV_SYN, SYN_REPORT, 0},
76 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
77 EXPECT_EQ(2u, dev->size());
81 event = dev->event(0);
82 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
83 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
84 EXPECT_EQ(0, event->flags());
86 event = dev->event(1);
87 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
88 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
89 EXPECT_EQ(0, event->flags());
92 TEST_F(KeyEventConverterEvdevTest, KeyRepeat) {
93 ui::MockKeyEventConverterEvdev* dev = device();
95 struct input_event mock_kernel_queue[] = {
96 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
97 {{0, 0}, EV_KEY, KEY_BACKSPACE, 1},
98 {{0, 0}, EV_SYN, SYN_REPORT, 0},
100 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
101 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2},
102 {{0, 0}, EV_SYN, SYN_REPORT, 0},
104 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
105 {{0, 0}, EV_KEY, KEY_BACKSPACE, 2},
106 {{0, 0}, EV_SYN, SYN_REPORT, 0},
108 {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a},
109 {{0, 0}, EV_KEY, KEY_BACKSPACE, 0},
110 {{0, 0}, EV_SYN, SYN_REPORT, 0},
113 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
114 EXPECT_EQ(4u, dev->size());
118 event = dev->event(0);
119 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
120 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
121 EXPECT_EQ(0, event->flags());
123 event = dev->event(1);
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(2);
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(3);
134 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
135 EXPECT_EQ(ui::VKEY_BACK, event->key_code());
136 EXPECT_EQ(0, event->flags());
139 TEST_F(KeyEventConverterEvdevTest, NoEvents) {
140 ui::MockKeyEventConverterEvdev* dev = device();
141 dev->ProcessEvents(NULL, 0);
142 EXPECT_EQ(0u, dev->size());
145 TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) {
146 ui::MockKeyEventConverterEvdev* dev = device();
148 struct input_event mock_kernel_queue[] = {
149 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
150 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 1},
151 {{0, 0}, EV_SYN, SYN_REPORT, 0},
153 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004},
154 {{0, 0}, EV_KEY, KEY_A, 1},
155 {{0, 0}, EV_SYN, SYN_REPORT, 0},
157 {{0, 0}, EV_MSC, MSC_SCAN, 0x70004},
158 {{0, 0}, EV_KEY, KEY_A, 0},
159 {{0, 0}, EV_SYN, SYN_REPORT, 0},
161 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
162 {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 0},
163 {{0, 0}, EV_SYN, SYN_REPORT, 0},
166 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
167 EXPECT_EQ(4u, dev->size());
171 event = dev->event(0);
172 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
173 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
174 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
176 event = dev->event(1);
177 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
178 EXPECT_EQ(ui::VKEY_A, event->key_code());
179 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
181 event = dev->event(2);
182 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
183 EXPECT_EQ(ui::VKEY_A, event->key_code());
184 EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags());
186 event = dev->event(3);
187 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
188 EXPECT_EQ(ui::VKEY_SHIFT, event->key_code());
189 EXPECT_EQ(0, event->flags());
192 TEST_F(KeyEventConverterEvdevTest, KeyWithDuplicateModifier) {
193 ui::MockKeyEventConverterEvdev* dev = device();
195 struct input_event mock_kernel_queue[] = {
196 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
197 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 1},
198 {{0, 0}, EV_SYN, SYN_REPORT, 0},
200 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5},
201 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 1},
202 {{0, 0}, EV_SYN, SYN_REPORT, 0},
204 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d},
205 {{0, 0}, EV_KEY, KEY_Z, 1},
206 {{0, 0}, EV_SYN, SYN_REPORT, 0},
208 {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d},
209 {{0, 0}, EV_KEY, KEY_Z, 0},
210 {{0, 0}, EV_SYN, SYN_REPORT, 0},
212 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1},
213 {{0, 0}, EV_KEY, KEY_LEFTCTRL, 0},
214 {{0, 0}, EV_SYN, SYN_REPORT, 0},
216 {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5},
217 {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 0},
218 {{0, 0}, EV_SYN, SYN_REPORT, 0},
221 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
222 EXPECT_EQ(6u, dev->size());
226 event = dev->event(0);
227 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
228 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
229 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
231 event = dev->event(1);
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(2);
237 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
238 EXPECT_EQ(ui::VKEY_Z, event->key_code());
239 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
241 event = dev->event(3);
242 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
243 EXPECT_EQ(ui::VKEY_Z, event->key_code());
244 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
246 event = dev->event(4);
247 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
248 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
249 EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags());
251 event = dev->event(5);
252 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
253 EXPECT_EQ(ui::VKEY_CONTROL, event->key_code());
254 EXPECT_EQ(0, event->flags());
257 TEST_F(KeyEventConverterEvdevTest, KeyWithLock) {
258 ui::MockKeyEventConverterEvdev* dev = device();
260 struct input_event mock_kernel_queue[] = {
261 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
262 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1},
263 {{0, 0}, EV_SYN, SYN_REPORT, 0},
265 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
266 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0},
267 {{0, 0}, EV_SYN, SYN_REPORT, 0},
269 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014},
270 {{0, 0}, EV_KEY, KEY_Q, 1},
271 {{0, 0}, EV_SYN, SYN_REPORT, 0},
273 {{0, 0}, EV_MSC, MSC_SCAN, 0x70014},
274 {{0, 0}, EV_KEY, KEY_Q, 0},
275 {{0, 0}, EV_SYN, SYN_REPORT, 0},
277 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
278 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1},
279 {{0, 0}, EV_SYN, SYN_REPORT, 0},
281 {{0, 0}, EV_MSC, MSC_SCAN, 0x70039},
282 {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0},
283 {{0, 0}, EV_SYN, SYN_REPORT, 0},
286 dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue));
287 EXPECT_EQ(6u, dev->size());
291 event = dev->event(0);
292 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
293 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
294 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
296 event = dev->event(1);
297 EXPECT_EQ(ui::ET_KEY_RELEASED, 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(2);
302 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
303 EXPECT_EQ(ui::VKEY_Q, event->key_code());
304 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags());
306 event = dev->event(3);
307 EXPECT_EQ(ui::ET_KEY_RELEASED, 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(4);
312 EXPECT_EQ(ui::ET_KEY_PRESSED, event->type());
313 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
314 EXPECT_EQ(0, event->flags());
316 event = dev->event(5);
317 EXPECT_EQ(ui::ET_KEY_RELEASED, event->type());
318 EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code());
319 EXPECT_EQ(0, event->flags());