15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <errno.h>
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <fcntl.h>
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <linux/input.h>
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <unistd.h>
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <vector>
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_vector.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/posix/eintr_wrapper.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/ozone/evdev/touch_event_converter_evdev.h"
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_dispatcher.h"
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_source.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static int SetNonBlocking(int fd) {
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int flags = fcntl(fd, F_GETFL, 0);
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (flags == -1)
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    flags = 0;
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTestDevicePath[] = "/dev/input/test-device";
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace ui {
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockTouchEventConverterEvdev : public TouchEventConverterEvdev {
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockTouchEventConverterEvdev(int fd, base::FilePath path);
428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual ~MockTouchEventConverterEvdev() {};
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ConfigureReadMock(struct input_event* queue,
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         long read_this_many,
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         long queue_index);
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned size() { return dispatched_events_.size(); }
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TouchEvent* event(unsigned index) { return dispatched_events_[index]; }
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Actually dispatch the event reader code.
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ReadNow() {
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    OnFileCanReadWithoutBlocking(read_pipe_);
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void DispatchCallback(Event* event) {
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dispatched_events_.push_back(
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        new TouchEvent(*static_cast<TouchEvent*>(event)));
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool Reinitialize() OVERRIDE { return true; }
630de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int read_pipe_;
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int write_pipe_;
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedVector<TouchEvent> dispatched_events_;
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTouchEventConverterEvdev);
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MockTouchEventConverterEvdev::MockTouchEventConverterEvdev(int fd,
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                           base::FilePath path)
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : TouchEventConverterEvdev(
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          fd,
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          path,
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          EventDeviceInfo(),
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          base::Bind(&MockTouchEventConverterEvdev::DispatchCallback,
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                     base::Unretained(this))) {
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pressure_min_ = 30;
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pressure_max_ = 60;
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(rjkroege): Check test axes.
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  x_min_pixels_ = x_min_tuxels_ = 0;
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  x_num_pixels_ = x_num_tuxels_ = std::numeric_limits<int>::max();
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  y_min_pixels_ = y_min_tuxels_ = 0;
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  y_num_pixels_ = y_num_tuxels_ = std::numeric_limits<int>::max();
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int fds[2];
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (pipe(fds))
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PLOG(FATAL) << "failed pipe";
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(SetNonBlocking(fds[0]) == 0)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(SetNonBlocking(fds[1]) == 0)
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  read_pipe_ = fds[0];
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  write_pipe_ = fds[1];
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void MockTouchEventConverterEvdev::ConfigureReadMock(struct input_event* queue,
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     long read_this_many,
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     long queue_index) {
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int nwrite = HANDLE_EINTR(write(write_pipe_,
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  queue + queue_index,
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  sizeof(struct input_event) * read_this_many));
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(nwrite ==
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         static_cast<int>(sizeof(struct input_event) * read_this_many))
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "write() failed, errno: " << errno;
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace ui
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Test fixture.
1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class TouchEventConverterEvdevTest : public testing::Test {
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  TouchEventConverterEvdevTest() {}
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Overridden from testing::Test:
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Set up pipe to satisfy message pump (unused).
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int evdev_io[2];
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (pipe(evdev_io))
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PLOG(FATAL) << "failed pipe";
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    events_in_ = evdev_io[0];
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    events_out_ = evdev_io[1];
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loop_ = new base::MessageLoopForUI;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    device_ = new ui::MockTouchEventConverterEvdev(
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        events_in_, base::FilePath(kTestDevicePath));
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delete device_;
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delete loop_;
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* device() { return device_; }
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop* loop_;
1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* device_;
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int events_out_;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int events_in_;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TouchEventConverterEvdevTest);
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(rjkroege): Test for valid handling of time stamps.
1538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, TouchDown) {
1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue[] = {
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue, 1, 0);
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, dev->size());
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue, 2, 1);
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, dev->size());
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue, 3, 3);
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* event = dev->event(0);
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_PRESSED, event->type());
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, event->y());
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FLOAT_EQ(1.5f, event->radius_x());
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, event->force());
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, NoEvents) {
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(NULL, 0, 0);
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, dev->size());
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, TouchMove) {
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_press[] = {
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move1[] = {
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 50},
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 43}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move2[] = {
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 42}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a press.
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press, 6, 0);
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move1, 4, 0);
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* event = dev->event(1);
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, event->type());
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(43, event->y());
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(2.f / 3.f, event->force());
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move2, 2, 0);
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(3u, dev->size());
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  event = dev->event(2);
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, event->type());
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->y());
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(2.f / 3.f, event->force());
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, TouchRelease) {
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_press[] = {
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_release[] = {
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a press.
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press, 6, 0);
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* event = dev->event(0);
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_release, 2, 0);
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  event = dev->event(1);
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_RELEASED, event->type());
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, event->y());
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, event->force());
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, TwoFingerGesture) {
2888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* ev0;
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* ev1;
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_press0[] = {
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a press.
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press0, 6, 0);
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move0[] = {
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a move.
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0, 2, 0);
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move0press1[] = {
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0},
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_SLOT, 1}, {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 686},
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 101},
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 102}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move on 0, press on 1.
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0press1, 9, 0);
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(4u, dev->size());
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev0 = dev->event(2);
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(3);
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev0->type());
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(40, ev0->x());
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, ev0->y());
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, ev0->touch_id());
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev0->force());
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Press
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_PRESSED, ev1->type());
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(101, ev1->x());
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stationary 0, Moves 1.
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_stationary0_move1[] = {
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_stationary0_move1, 2, 0);
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(5u, dev->size());
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(4);
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev1->type());
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(40, ev1->x());
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move 0, stationary 1.
365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move0_stationary1[] = {
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_SLOT, 0}, {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 39},
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_SYN, SYN_REPORT, 0}
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0_stationary1, 3, 0);
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(6u, dev->size());
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev0 = dev->event(5);
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev0->type());
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(39, ev0->x());
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, ev0->y());
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, ev0->touch_id());
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev0->force());
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Release 0, move 1.
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_release0_move1[] = {
384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1}, {{0, 0}, EV_ABS, ABS_MT_SLOT, 1},
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 38}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_release0_move1, 4, 0);
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(8u, dev->size());
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev0 = dev->event(6);
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(7);
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_RELEASED, ev0->type());
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(39, ev0->x());
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, ev0->y());
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, ev0->touch_id());
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev0->force());
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev1->type());
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(38, ev1->x());
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Release 1.
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_release1[] = {
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1}, {{0, 0}, EV_SYN, SYN_REPORT, 0},
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_release1, 2, 0);
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(9u, dev->size());
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(8);
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_RELEASED, ev1->type());
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(38, ev1->x());
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
4260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, TypeA) {
4280de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
4290de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4300de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  struct input_event mock_kernel_queue_press0[] = {
4310de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
4320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
4330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
4340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51},
4350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_SYN, SYN_MT_REPORT, 0},
4360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
4370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 61},
4380de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 71},
4390de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_SYN, SYN_MT_REPORT, 0},
4400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_SYN, SYN_REPORT, 0}
4410de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  };
4420de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4430de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Check that two events are generated.
4440de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press0, 10, 0);
4450de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ReadNow();
4460de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
4470de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
4480de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4490de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)TEST_F(TouchEventConverterEvdevTest, Unsync) {
4500de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ui::MockTouchEventConverterEvdev* dev = device();
4510de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4520de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  struct input_event mock_kernel_queue_press0[] = {
4530de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
4540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
4550de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
4560de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
4570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
4580de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  };
4590de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4600de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press0, 6, 0);
4610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ReadNow();
4620de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
4630de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Prepare a move with a drop.
4650de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  struct input_event mock_kernel_queue_move0[] = {
4660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_SYN, SYN_DROPPED, 0},
4670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
4680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  };
4690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4700de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Verify that we didn't receive it/
4710de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0, 3, 0);
4720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ReadNow();
4730de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
4740de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4750de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  struct input_event mock_kernel_queue_move1[] = {
4760de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
4770de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  };
4780de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4790de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Verify that it re-syncs after a SYN_REPORT.
4800de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move1, 2, 0);
4810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  dev->ReadNow();
4820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
4830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// crbug.com/407386
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TouchEventConverterEvdevTest,
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       DontChangeMultitouchPositionFromLegacyAxes) {
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::MockTouchEventConverterEvdev* dev = device();
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct input_event mock_kernel_queue[] = {
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_SLOT, 0},
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 100},
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 999},
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 888},
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 55},
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_SLOT, 1},
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 200},
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 44},
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 777},
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 666},
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_X, 999},
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_Y, 888},
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_ABS, ABS_PRESSURE, 55},
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {{0, 0}, EV_SYN, SYN_REPORT, 0},
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check that two events are generated.
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dev->ConfigureReadMock(mock_kernel_queue, arraysize(mock_kernel_queue), 0);
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dev->ReadNow();
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const unsigned int kExpectedEventCount = 2;
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kExpectedEventCount, dev->size());
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (kExpectedEventCount != dev->size())
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::TouchEvent* ev0 = dev->event(0);
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::TouchEvent* ev1 = dev->event(1);
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, ev0->touch_id());
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(999, ev0->x());
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(888, ev0->y());
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FLOAT_EQ(0.8333333f, ev0->force());
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(1, ev1->touch_id());
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(777, ev1->x());
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(666, ev1->y());
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FLOAT_EQ(0.4666666f, ev1->force());
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
529