1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2013 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)
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_vector.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.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"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/events/event.h"
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/base/ozone/evdev/touch_event_converter_ozone.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static int SetNonBlocking(int fd) {
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int flags = fcntl(fd, F_GETFL, 0);
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (flags == -1)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    flags = 0;
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace ui {
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MockTouchEventConverterOzone : public TouchEventConverterOzone,
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     public base::MessageLoop::Dispatcher {
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MockTouchEventConverterOzone(int a, int b);
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~MockTouchEventConverterOzone() {};
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ConfigureReadMock(struct input_event* queue,
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         long read_this_many,
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         long queue_index);
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned size() { return dispatched_events_.size(); }
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TouchEvent* event(unsigned index) { return dispatched_events_[index]; }
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Actually dispatch the event reader code.
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void ReadNow() {
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    OnFileCanReadWithoutBlocking(read_pipe_);
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE;
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int read_pipe_;
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int write_pipe_;
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedVector<TouchEvent> dispatched_events_;
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTouchEventConverterOzone);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MockTouchEventConverterOzone::MockTouchEventConverterOzone(int a, int b)
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : TouchEventConverterOzone(a, b) {
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pressure_min_ = 30;
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pressure_max_ = 60;
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int fds[2];
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(pipe(fds) >= 0) << "pipe() failed, errno: " << errno;
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(SetNonBlocking(fds[0]) == 0)
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(SetNonBlocking(fds[1]) == 0)
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  read_pipe_ = fds[0];
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  write_pipe_ = fds[1];
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool MockTouchEventConverterOzone::Dispatch(const base::NativeEvent& event) {
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* ev = new ui::TouchEvent(event);
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dispatched_events_.push_back(ev);
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void MockTouchEventConverterOzone::ConfigureReadMock(struct input_event* queue,
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     long read_this_many,
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     long queue_index) {
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int nwrite = HANDLE_EINTR(write(write_pipe_,
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  queue + queue_index,
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  sizeof(struct input_event) * read_this_many));
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(nwrite ==
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)         static_cast<int>(sizeof(struct input_event) * read_this_many))
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "write() failed, errno: " << errno;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace ui
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Test fixture.
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TouchEventConverterOzoneTest : public testing::Test {
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TouchEventConverterOzoneTest() {}
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Overridden from testing::Test:
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    loop_ = new base::MessageLoop(base::MessageLoop::TYPE_UI);
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    device_ = new ui::MockTouchEventConverterOzone(-1, 2);
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::MessagePumpOzone::Current()->AddDispatcherForRootWindow(device_);
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delete device_;
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delete loop_;
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* device() { return device_; }
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::MessageLoop* loop_;
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* device_;
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TouchEventConverterOzoneTest);
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// TODO(rjkroege): Test for valid handling of time stamps.
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(TouchEventConverterOzoneTest, TouchDown) {
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* dev = device();
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue[] = {
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue, 1, 0);
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, dev->size());
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue, 2, 1);
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, dev->size());
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue, 3, 3);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* event = dev->event(0);
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_PRESSED, event->type());
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, event->y());
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, event->force());
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(TouchEventConverterOzoneTest, NoEvents) {
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* dev = device();
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(NULL, 0, 0);
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u, dev->size());
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(TouchEventConverterOzoneTest, TouchMove) {
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* dev = device();
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_press[] = {
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move1[] = {
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 50},
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 43}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move2[] = {
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 42}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a press.
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press, 6, 0);
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move1, 4, 0);
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* event = dev->event(1);
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, event->type());
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(43, event->y());
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(2.f / 3.f, event->force());
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move2, 2, 0);
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(3u, dev->size());
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  event = dev->event(2);
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, event->type());
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->y());
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(2.f / 3.f, event->force());
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(TouchEventConverterOzoneTest, TouchRelease) {
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* dev = device();
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_press[] = {
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_release[] = {
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a press.
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press, 6, 0);
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* event = dev->event(0);
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_release, 2, 0);
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  event = dev->event(1);
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(event == NULL);
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_RELEASED, event->type());
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(42, event->x());
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, event->y());
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, event->touch_id());
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, event->force());
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(TouchEventConverterOzoneTest, TwoFingerGesture) {
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::MockTouchEventConverterOzone* dev = device();
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* ev0;
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui::TouchEvent* ev1;
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_press0[] = {
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684},
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 42},
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a press.
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_press0, 6, 0);
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1u, dev->size());
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move0[] = {
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Setup and discard a move.
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0, 2, 0);
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2u, dev->size());
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move0press1[] = {
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0},
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_SLOT, 1}, {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 686},
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3},
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_PRESSURE, 45},
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 101},
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_Y, 102}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move on 0, press on 1.
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0press1, 9, 0);
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(4u, dev->size());
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev0 = dev->event(2);
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(3);
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev0->type());
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(40, ev0->x());
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, ev0->y());
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, ev0->touch_id());
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev0->force());
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Press
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_PRESSED, ev1->type());
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(101, ev1->x());
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Stationary 0, Moves 1.
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_stationary0_move1[] = {
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 40}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_stationary0_move1, 2, 0);
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(5u, dev->size());
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(4);
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev1->type());
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(40, ev1->x());
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Move 0, stationary 1.
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_move0_stationary1[] = {
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_SLOT, 0}, {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 39},
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_SYN, SYN_REPORT, 0}
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_move0_stationary1, 3, 0);
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(6u, dev->size());
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev0 = dev->event(5);
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev0->type());
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(39, ev0->x());
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, ev0->y());
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, ev0->touch_id());
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev0->force());
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Release 0, move 1.
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_release0_move1[] = {
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1}, {{0, 0}, EV_ABS, ABS_MT_SLOT, 1},
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_POSITION_X, 38}, {{0, 0}, EV_SYN, SYN_REPORT, 0}
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_release0_move1, 4, 0);
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(8u, dev->size());
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev0 = dev->event(6);
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(7);
363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_RELEASED, ev0->type());
365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(39, ev0->x());
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(51, ev0->y());
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, ev0->touch_id());
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev0->force());
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_MOVED, ev1->type());
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(38, ev1->x());
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Release 1.
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct input_event mock_kernel_queue_release1[] = {
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    {{0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1}, {{0, 0}, EV_SYN, SYN_REPORT, 0},
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ConfigureReadMock(mock_kernel_queue_release1, 2, 0);
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  dev->ReadNow();
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(9u, dev->size());
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ev1 = dev->event(8);
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(ui::ET_TOUCH_RELEASED, ev1->type());
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(38, ev1->x());
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(102, ev1->y());
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1, ev1->touch_id());
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(.5f, ev1->force());
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
397