Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: ui/base/linux/touch_event_from_evdev_converter_unittest.cc

Issue 13886018: Add a factory and defines for native Linux surfaces. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Get {base,ui,aura}_unittests working with native linux surface Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <unistd.h>
6 #include <linux/input.h>
7 #include <errno.h>
8 #include <fcntl.h>
9 #include <unistd.h>
10
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/scoped_vector.h"
13 #include "ui/base/linux/touch_event_from_evdev_converter.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "base/posix/eintr_wrapper.h"
16 #include "base/time.h"
17
18 #include "ui/base/events/event.h"
19
20 #include <vector>
21
22 namespace {
23
24 static int SetNonBlocking(int fd) {
25 int flags = fcntl(fd, F_GETFL, 0);
26 if (flags == -1)
27 flags = 0;
28 return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
29 }
30
31 } // namespace
32
33 namespace ui {
34
35 class MockTouchEventFromEvdevConverter : public TouchEventFromEvdevConverter {
36 public:
37 MockTouchEventFromEvdevConverter(int a, int b);
38 ~MockTouchEventFromEvdevConverter() {
39 };
40
41 void ConfigureReadMock(struct input_event* queue,
42 long read_this_many,
43 long queue_index);
44
45 unsigned size() { return dispatched_events_.size(); }
46 TouchEvent* event(unsigned index) { return dispatched_events_[index]; }
47
48 // Actually dispatch the event reader code.
49 void ReadNow() {
50 OnFileCanReadWithoutBlocking(read_pipe_);
51 }
52
53 private:
54 virtual void DispatchEvent(TouchEvent* tev) OVERRIDE;
55
56 int read_pipe_;
57 int write_pipe_;
58
59 ScopedVector<TouchEvent> dispatched_events_;
60
61 DISALLOW_COPY_AND_ASSIGN(MockTouchEventFromEvdevConverter);
62 };
63
64
65 MockTouchEventFromEvdevConverter::MockTouchEventFromEvdevConverter(int a, int b)
66 : TouchEventFromEvdevConverter(a, b) {
67 pressure_min_ = 30;
68 pressure_max_ = 60;
69
70 int fds[2];
71
72 DCHECK(pipe(fds) >= 0) << "pipe() failed, errno: " << errno;
73 DCHECK(SetNonBlocking(fds[0]) == 0)
74 << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
75 DCHECK(SetNonBlocking(fds[1]) == 0)
76 << "SetNonBlocking for pipe fd[0] failed, errno: " << errno;
77 read_pipe_ = fds[0];
78 write_pipe_ = fds[1];
79 }
80
81 void MockTouchEventFromEvdevConverter::DispatchEvent(TouchEvent* tev) {
82 dispatched_events_.push_back(tev);
83 }
84
85 void MockTouchEventFromEvdevConverter::ConfigureReadMock(
86 struct input_event* queue,
87 long read_this_many,
88 long queue_index) {
89 int nwrite = HANDLE_EINTR(write(
90 write_pipe_,
91 queue + queue_index,
92 sizeof(struct input_event) * read_this_many));
93 DCHECK(nwrite == static_cast<int>(
94 sizeof(struct input_event) * read_this_many))
95 << "write() failed, errno: " << errno;
96 }
97
98 } // namespace ui
99
100 // Test fixture.
101 class TouchEventFromEvdevConverterTest : public testing::Test {
102 public:
103 TouchEventFromEvdevConverterTest() { }
104
105 // Overridden from testing::Test:
106 virtual void SetUp() OVERRIDE {
107 device_ = new ui::MockTouchEventFromEvdevConverter(-1, 2);
108 }
109 virtual void TearDown() OVERRIDE {
110 delete device_;
111 }
112
113 ui::MockTouchEventFromEvdevConverter* device() { return device_; }
114
115 private:
116 ui::MockTouchEventFromEvdevConverter* device_;
117 DISALLOW_COPY_AND_ASSIGN(TouchEventFromEvdevConverterTest);
118 };
119
120 // TODO(rjkroege): Test for valid handling of time stamps.
121 TEST_F(TouchEventFromEvdevConverterTest, TouchDown) {
122 ui::MockTouchEventFromEvdevConverter* dev = device();
123
124 struct input_event mock_kernel_queue[] = {
125 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684 },
126 { {0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3 },
127 { {0, 0}, EV_ABS, ABS_MT_PRESSURE, 45 },
128 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 42 },
129 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51 },
130 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
131
132 dev->ConfigureReadMock(mock_kernel_queue, 1, 0);
133 dev->ReadNow();
134 EXPECT_EQ(0u, dev->size());
135
136 dev->ConfigureReadMock(mock_kernel_queue, 2, 1);
137 dev->ReadNow();
138 EXPECT_EQ(0u, dev->size());
139
140 dev->ConfigureReadMock(mock_kernel_queue, 3, 3);
141 dev->ReadNow();
142 EXPECT_EQ(1u, dev->size());
143
144 ui::TouchEvent* event = dev->event(0);
145 EXPECT_FALSE(event == NULL);
146
147 EXPECT_EQ(ui::ET_TOUCH_PRESSED, event->type());
148 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
149 EXPECT_EQ(42, event->x());
150 EXPECT_EQ(51, event->y());
151 EXPECT_EQ(0, event->touch_id());
152 EXPECT_FLOAT_EQ(.5f, event->force());
153 EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
154 }
155
156 TEST_F(TouchEventFromEvdevConverterTest, NoEvents) {
157 ui::MockTouchEventFromEvdevConverter* dev = device();
158 dev->ConfigureReadMock(NULL, 0, 0);
159 EXPECT_EQ(0u, dev->size());
160 }
161
162 TEST_F(TouchEventFromEvdevConverterTest, TouchMove) {
163 ui::MockTouchEventFromEvdevConverter* dev = device();
164
165 struct input_event mock_kernel_queue_press[] = {
166 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684 },
167 { {0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3 },
168 { {0, 0}, EV_ABS, ABS_MT_PRESSURE, 45 },
169 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 42 },
170 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51 },
171 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
172
173 struct input_event mock_kernel_queue_move1[] = {
174 { {0, 0}, EV_ABS, ABS_MT_PRESSURE, 50 },
175 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 42 },
176 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 43 },
177 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
178
179 struct input_event mock_kernel_queue_move2[] = {
180 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 42 },
181 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
182
183
184 // Setup and discard a press.
185 dev->ConfigureReadMock(mock_kernel_queue_press, 6, 0);
186 dev->ReadNow();
187 EXPECT_EQ(1u, dev->size());
188
189 dev->ConfigureReadMock(mock_kernel_queue_move1, 4, 0);
190 dev->ReadNow();
191 EXPECT_EQ(2u, dev->size());
192 ui::TouchEvent* event = dev->event(1);
193 EXPECT_FALSE(event == NULL);
194
195 EXPECT_EQ(ui::ET_TOUCH_MOVED, event->type());
196 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
197 EXPECT_EQ(42, event->x());
198 EXPECT_EQ(43, event->y());
199 EXPECT_EQ(0, event->touch_id());
200 EXPECT_FLOAT_EQ(2.f / 3.f, event->force());
201 EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
202
203 dev->ConfigureReadMock(mock_kernel_queue_move2, 2, 0);
204 dev->ReadNow();
205 EXPECT_EQ(3u, dev->size());
206 event = dev->event(2);
207 EXPECT_FALSE(event == NULL);
208
209 EXPECT_EQ(ui::ET_TOUCH_MOVED, event->type());
210 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
211 EXPECT_EQ(42, event->x());
212 EXPECT_EQ(42, event->y());
213 EXPECT_EQ(0, event->touch_id());
214 EXPECT_FLOAT_EQ(2.f / 3.f, event->force());
215 EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
216 }
217
218 TEST_F(TouchEventFromEvdevConverterTest, TouchRelease) {
219 ui::MockTouchEventFromEvdevConverter* dev = device();
220
221 struct input_event mock_kernel_queue_press[] = {
222 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684 },
223 { {0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3 },
224 { {0, 0}, EV_ABS, ABS_MT_PRESSURE, 45 },
225 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 42 },
226 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51 },
227 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
228
229 struct input_event mock_kernel_queue_release[] = {
230 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1 },
231 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
232
233
234 // Setup and discard a press.
235 dev->ConfigureReadMock(mock_kernel_queue_press, 6, 0);
236 dev->ReadNow();
237 EXPECT_EQ(1u, dev->size());
238 ui::TouchEvent* event = dev->event(0);
239 EXPECT_FALSE(event == NULL);
240
241 dev->ConfigureReadMock(mock_kernel_queue_release, 2, 0);
242 dev->ReadNow();
243 EXPECT_EQ(2u, dev->size());
244 event = dev->event(1);
245 EXPECT_FALSE(event == NULL);
246
247 EXPECT_EQ(ui::ET_TOUCH_RELEASED, event->type());
248 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), event->time_stamp());
249 EXPECT_EQ(42, event->x());
250 EXPECT_EQ(51, event->y());
251 EXPECT_EQ(0, event->touch_id());
252 EXPECT_FLOAT_EQ(.5f, event->force());
253 EXPECT_FLOAT_EQ(0.f, event->rotation_angle());
254 }
255
256
257
258
259
260 TEST_F(TouchEventFromEvdevConverterTest, TwoFingerGesture) {
261 ui::MockTouchEventFromEvdevConverter* dev = device();
262
263 ui::TouchEvent* ev0;
264 ui::TouchEvent* ev1;
265
266 struct input_event mock_kernel_queue_press0[] = {
267 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 684 },
268 { {0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3 },
269 { {0, 0}, EV_ABS, ABS_MT_PRESSURE, 45 },
270 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 42 },
271 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 51 },
272 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
273 // Setup and discard a press.
274 dev->ConfigureReadMock(mock_kernel_queue_press0, 6, 0);
275 dev->ReadNow();
276 EXPECT_EQ(1u, dev->size());
277
278 struct input_event mock_kernel_queue_move0[] = {
279 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 40 },
280 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
281 // Setup and discard a move.
282 dev->ConfigureReadMock(mock_kernel_queue_move0, 2, 0);
283 dev->ReadNow();
284 EXPECT_EQ(2u, dev->size());
285
286 struct input_event mock_kernel_queue_move0press1[] = {
287 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 40 },
288 { {0, 0}, EV_SYN, SYN_REPORT, 0 },
289 { {0, 0}, EV_ABS, ABS_MT_SLOT, 1 },
290 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, 686 },
291 { {0, 0}, EV_ABS, ABS_MT_TOUCH_MAJOR, 3 },
292 { {0, 0}, EV_ABS, ABS_MT_PRESSURE, 45 },
293 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 101 },
294 { {0, 0}, EV_ABS, ABS_MT_POSITION_Y, 102 },
295 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
296 // Move on 0, press on 1.
297 dev->ConfigureReadMock(mock_kernel_queue_move0press1, 9, 0);
298 dev->ReadNow();
299 EXPECT_EQ(4u, dev->size());
300 ev0 = dev->event(2);
301 ev1 = dev->event(3);
302
303 // Move
304 EXPECT_EQ(ui::ET_TOUCH_MOVED, ev0->type());
305 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
306 EXPECT_EQ(40, ev0->x());
307 EXPECT_EQ(51, ev0->y());
308 EXPECT_EQ(0, ev0->touch_id());
309 EXPECT_FLOAT_EQ(.5f, ev0->force());
310 EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
311
312 // Press
313 EXPECT_EQ(ui::ET_TOUCH_PRESSED, ev1->type());
314 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
315 EXPECT_EQ(101, ev1->x());
316 EXPECT_EQ(102, ev1->y());
317 EXPECT_EQ(1, ev1->touch_id());
318 EXPECT_FLOAT_EQ(.5f, ev1->force());
319 EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
320
321 // Stationary 0, Moves 1.
322 struct input_event mock_kernel_queue_stationary0_move1[] = {
323 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 40 },
324 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
325 dev->ConfigureReadMock(mock_kernel_queue_stationary0_move1, 2, 0);
326 dev->ReadNow();
327 EXPECT_EQ(5u, dev->size());
328 ev1 = dev->event(4);
329
330 EXPECT_EQ(ui::ET_TOUCH_MOVED, ev1->type());
331 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
332 EXPECT_EQ(40, ev1->x());
333 EXPECT_EQ(102, ev1->y());
334 EXPECT_EQ(1, ev1->touch_id());
335
336 EXPECT_FLOAT_EQ(.5f, ev1->force());
337 EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
338
339 // Move 0, stationary 1.
340 struct input_event mock_kernel_queue_move0_stationary1[] = {
341 { {0, 0}, EV_ABS, ABS_MT_SLOT, 0 },
342 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 39 },
343 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
344 dev->ConfigureReadMock(mock_kernel_queue_move0_stationary1, 3, 0);
345 dev->ReadNow();
346 EXPECT_EQ(6u, dev->size());
347 ev0 = dev->event(5);
348
349 EXPECT_EQ(ui::ET_TOUCH_MOVED, ev0->type());
350 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
351 EXPECT_EQ(39, ev0->x());
352 EXPECT_EQ(51, ev0->y());
353 EXPECT_EQ(0, ev0->touch_id());
354 EXPECT_FLOAT_EQ(.5f, ev0->force());
355 EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
356
357 // Release 0, move 1.
358 struct input_event mock_kernel_queue_release0_move1[] = {
359 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1 },
360 { {0, 0}, EV_ABS, ABS_MT_SLOT, 1 },
361 { {0, 0}, EV_ABS, ABS_MT_POSITION_X, 38 },
362 { {0, 0}, EV_SYN, SYN_REPORT, 0 } };
363 dev->ConfigureReadMock(mock_kernel_queue_release0_move1, 4, 0);
364 dev->ReadNow();
365 EXPECT_EQ(8u, dev->size());
366 ev0 = dev->event(6);
367 ev1 = dev->event(7);
368
369 EXPECT_EQ(ui::ET_TOUCH_RELEASED, ev0->type());
370 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev0->time_stamp());
371 EXPECT_EQ(39, ev0->x());
372 EXPECT_EQ(51, ev0->y());
373 EXPECT_EQ(0, ev0->touch_id());
374 EXPECT_FLOAT_EQ(.5f, ev0->force());
375 EXPECT_FLOAT_EQ(0.f, ev0->rotation_angle());
376
377 EXPECT_EQ(ui::ET_TOUCH_MOVED, ev1->type());
378 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
379 EXPECT_EQ(38, ev1->x());
380 EXPECT_EQ(102, ev1->y());
381 EXPECT_EQ(1, ev1->touch_id());
382 EXPECT_FLOAT_EQ(.5f, ev1->force());
383 EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
384
385 // Release 1.
386 struct input_event mock_kernel_queue_release1[] = {
387 { {0, 0}, EV_ABS, ABS_MT_TRACKING_ID, -1 },
388 { {0, 0}, EV_SYN, SYN_REPORT, 0 },};
389 dev->ConfigureReadMock(mock_kernel_queue_release1, 2, 0);
390 dev->ReadNow();
391 EXPECT_EQ(9u, dev->size());
392 ev1 = dev->event(8);
393
394 EXPECT_EQ(ui::ET_TOUCH_RELEASED, ev1->type());
395 EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), ev1->time_stamp());
396 EXPECT_EQ(38, ev1->x());
397 EXPECT_EQ(102, ev1->y());
398 EXPECT_EQ(1, ev1->touch_id());
399 EXPECT_FLOAT_EQ(.5f, ev1->force());
400 EXPECT_FLOAT_EQ(0.f, ev1->rotation_angle());
401 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698