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