15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <linux/input.h> 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_vector.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/events/event.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/ozone/evdev/key_event_converter_evdev.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace ui { 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTestDevicePath[] = "/dev/input/test-device"; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class MockKeyEventConverterEvdev : public KeyEventConverterEvdev { 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockKeyEventConverterEvdev(int fd, EventModifiersEvdev* modifiers) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : KeyEventConverterEvdev( 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fd, 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath(kTestDevicePath), 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci modifiers, 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&MockKeyEventConverterEvdev::DispatchEventForTest, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))) { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Start(); 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual ~MockKeyEventConverterEvdev() {}; 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsigned size() { return dispatched_events_.size(); } 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) KeyEvent* event(unsigned index) { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_GT(dispatched_events_.size(), index); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return dispatched_events_[index]; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DispatchEventForTest(Event* event); 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ScopedVector<KeyEvent> dispatched_events_; 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockKeyEventConverterEvdev); 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MockKeyEventConverterEvdev::DispatchEventForTest(Event* event) { 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dispatched_events_.push_back(new KeyEvent(*static_cast<KeyEvent*>(event))); 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace ui 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Test fixture. 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class KeyEventConverterEvdevTest : public testing::Test { 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) KeyEventConverterEvdevTest() {} 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Overridden from testing::Test: 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetUp() OVERRIDE { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set up pipe to satisfy message pump (unused). 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int evdev_io[2]; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (pipe(evdev_io)) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PLOG(FATAL) << "failed pipe"; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) events_in_ = evdev_io[0]; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) events_out_ = evdev_io[1]; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) modifiers_ = new ui::EventModifiersEvdev(); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_ = new ui::MockKeyEventConverterEvdev(events_in_, modifiers_); 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void TearDown() OVERRIDE { 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delete device_; 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delete modifiers_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) close(events_in_); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) close(events_out_); 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* device() { return device_; } 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::EventModifiersEvdev* modifiers() { return modifiers_; } 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForUI ui_loop_; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::EventModifiersEvdev* modifiers_; 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* device_; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int events_out_; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int events_in_; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KeyEventConverterEvdevTest); 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(KeyEventConverterEvdevTest, KeyPress) { 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* dev = device(); 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) struct input_event mock_kernel_queue[] = { 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_BACKSPACE, 1}, 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_BACKSPACE, 0}, 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(2u, dev->size()); 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::KeyEvent* event; 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(0); 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_BACK, event->key_code()); 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(1); 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_BACK, event->key_code()); 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(KeyEventConverterEvdevTest, KeyRepeat) { 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* dev = device(); 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) struct input_event mock_kernel_queue[] = { 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_BACKSPACE, 1}, 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_BACKSPACE, 2}, 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_BACKSPACE, 2}, 1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7002a}, 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_BACKSPACE, 0}, 1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(4u, dev->size()); 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::KeyEvent* event; 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(0); 1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_BACK, event->key_code()); 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(1); 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_BACK, event->key_code()); 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(2); 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_BACK, event->key_code()); 1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(3); 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_BACK, event->key_code()); 1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(KeyEventConverterEvdevTest, NoEvents) { 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* dev = device(); 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dev->ProcessEvents(NULL, 0); 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0u, dev->size()); 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(KeyEventConverterEvdevTest, KeyWithModifier) { 1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* dev = device(); 1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) struct input_event mock_kernel_queue[] = { 1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, 1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 1}, 1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70004}, 1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_A, 1}, 1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70004}, 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_A, 0}, 1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_LEFTSHIFT, 0}, 1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(4u, dev->size()); 1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::KeyEvent* event; 2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(0); 2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_SHIFT, event->key_code()); 2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); 2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(1); 2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_A, event->key_code()); 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(2); 2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_A, event->key_code()); 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_SHIFT_DOWN, event->flags()); 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(3); 2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_SHIFT, event->key_code()); 2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(KeyEventConverterEvdevTest, KeyWithDuplicateModifier) { 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* dev = device(); 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) struct input_event mock_kernel_queue[] = { 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, 2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_LEFTCTRL, 1}, 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5}, 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 1}, 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d}, 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_Z, 1}, 2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x7001d}, 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_Z, 0}, 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x700e1}, 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_LEFTCTRL, 0}, 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x700e5}, 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_RIGHTCTRL, 0}, 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); 2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(6u, dev->size()); 2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::KeyEvent* event; 2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(0); 2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); 2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); 2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(1); 2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); 2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); 2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(2); 2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_Z, event->key_code()); 2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); 2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(3); 2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_Z, event->key_code()); 2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); 2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(4); 2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); 2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CONTROL_DOWN, event->flags()); 2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(5); 2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CONTROL, event->key_code()); 2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(KeyEventConverterEvdevTest, KeyWithLock) { 2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::MockKeyEventConverterEvdev* dev = device(); 2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) struct input_event mock_kernel_queue[] = { 2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, 2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1}, 2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, 2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0}, 2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70014}, 3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_Q, 1}, 3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70014}, 3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_Q, 0}, 3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, 3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_CAPSLOCK, 1}, 3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_MSC, MSC_SCAN, 0x70039}, 3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_KEY, KEY_CAPSLOCK, 0}, 3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {{0, 0}, EV_SYN, SYN_REPORT, 0}, 3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dev->ProcessEvents(mock_kernel_queue, arraysize(mock_kernel_queue)); 3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(6u, dev->size()); 3181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::KeyEvent* event; 3201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(0); 3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); 3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); 3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(1); 3271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 3281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); 3291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); 3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(2); 3321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 3331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_Q, event->key_code()); 3341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); 3351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(3); 3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 3381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_Q, event->key_code()); 3391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, event->flags()); 3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(4); 3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_PRESSED, event->type()); 3431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); 3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 3451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) event = dev->event(5); 3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::ET_KEY_RELEASED, event->type()); 3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(ui::VKEY_CAPITAL, event->key_code()); 3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_EQ(0, event->flags()); 3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 351