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