OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/input_event_tracker.h" | 5 #include "remoting/protocol/input_event_tracker.h" |
6 | 6 |
7 #include "remoting/proto/event.pb.h" | 7 #include "remoting/proto/event.pb.h" |
8 #include "remoting/protocol/protocol_mock_objects.h" | 8 #include "remoting/protocol/protocol_mock_objects.h" |
9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 26 matching lines...) Expand all Loading... | |
37 return arg.usb_keycode() == static_cast<uint32>(usb_keycode) && | 37 return arg.usb_keycode() == static_cast<uint32>(usb_keycode) && |
38 arg.pressed() == pressed && | 38 arg.pressed() == pressed && |
39 arg.lock_states() == kTestLockStates; | 39 arg.lock_states() == kTestLockStates; |
40 } | 40 } |
41 | 41 |
42 MATCHER_P4(EqualsMouseEvent, x, y, button, down, "") { | 42 MATCHER_P4(EqualsMouseEvent, x, y, button, down, "") { |
43 return arg.x() == x && arg.y() == y && arg.button() == button && | 43 return arg.x() == x && arg.y() == y && arg.button() == button && |
44 arg.button_down() == down; | 44 arg.button_down() == down; |
45 } | 45 } |
46 | 46 |
47 MATCHER_P2(TouchPointIdsAndTypeEqual, ids, type, "") { | |
48 if (arg.event_type() != type) | |
49 return false; | |
50 | |
51 std::set<uint32> touch_ids; | |
52 for (const TouchEventPoint& point : arg.touch_points()) { | |
53 touch_ids.insert(point.id()); | |
54 } | |
55 return touch_ids == ids; | |
56 } | |
57 | |
47 static KeyEvent NewUsbEvent(uint32 usb_keycode, | 58 static KeyEvent NewUsbEvent(uint32 usb_keycode, |
48 bool pressed) { | 59 bool pressed) { |
49 KeyEvent event; | 60 KeyEvent event; |
50 event.set_usb_keycode(usb_keycode); | 61 event.set_usb_keycode(usb_keycode); |
51 event.set_pressed(pressed); | 62 event.set_pressed(pressed); |
52 // Create all key events with the hardcoded |lock_state| in this test. | 63 // Create all key events with the hardcoded |lock_state| in this test. |
53 event.set_lock_states(kTestLockStates); | 64 event.set_lock_states(kTestLockStates); |
54 return event; | 65 return event; |
55 } | 66 } |
56 | 67 |
57 static void PressAndReleaseUsb(InputStub* input_stub, | 68 static void PressAndReleaseUsb(InputStub* input_stub, |
58 uint32 usb_keycode) { | 69 uint32 usb_keycode) { |
59 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, true)); | 70 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, true)); |
60 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, false)); | 71 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, false)); |
61 } | 72 } |
62 | 73 |
63 static MouseEvent NewMouseEvent(int x, int y, | 74 static MouseEvent NewMouseEvent(int x, int y, |
64 MouseEvent::MouseButton button, bool down) { | 75 MouseEvent::MouseButton button, bool down) { |
65 MouseEvent event; | 76 MouseEvent event; |
66 event.set_x(x); | 77 event.set_x(x); |
67 event.set_y(y); | 78 event.set_y(y); |
68 event.set_button(button); | 79 event.set_button(button); |
69 event.set_button_down(down); | 80 event.set_button_down(down); |
70 return event; | 81 return event; |
71 } | 82 } |
72 | 83 |
84 void AddTouchPoint(uint32 id, TouchEvent* event) { | |
85 TouchEventPoint* p = event->add_touch_points(); | |
86 p->set_id(id); | |
73 } | 87 } |
74 | 88 |
89 } // namespace | |
90 | |
75 // Verify that keys that were pressed and released aren't re-released. | 91 // Verify that keys that were pressed and released aren't re-released. |
76 TEST(InputEventTrackerTest, NothingToRelease) { | 92 TEST(InputEventTrackerTest, NothingToRelease) { |
77 MockInputStub mock_stub; | 93 MockInputStub mock_stub; |
78 InputEventTracker input_tracker(&mock_stub); | 94 InputEventTracker input_tracker(&mock_stub); |
79 | 95 |
80 { | 96 { |
81 InSequence s; | 97 InSequence s; |
82 | 98 |
83 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, true))); | 99 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, true))); |
84 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, false))); | 100 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, false))); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 PressAndReleaseUsb(&input_tracker, 2); | 248 PressAndReleaseUsb(&input_tracker, 2); |
233 | 249 |
234 EXPECT_FALSE(input_tracker.IsKeyPressed(1)); | 250 EXPECT_FALSE(input_tracker.IsKeyPressed(1)); |
235 EXPECT_FALSE(input_tracker.IsKeyPressed(2)); | 251 EXPECT_FALSE(input_tracker.IsKeyPressed(2)); |
236 EXPECT_TRUE(input_tracker.IsKeyPressed(3)); | 252 EXPECT_TRUE(input_tracker.IsKeyPressed(3)); |
237 EXPECT_EQ(1, input_tracker.PressedKeyCount()); | 253 EXPECT_EQ(1, input_tracker.PressedKeyCount()); |
238 | 254 |
239 input_tracker.ReleaseAll(); | 255 input_tracker.ReleaseAll(); |
240 } | 256 } |
241 | 257 |
258 // All touch points added with multiple touch events should be released as a | |
259 // cancel event. | |
260 TEST(InputEventTrackerTest, ReleaseAllTouchPoints) { | |
261 MockInputStub mock_stub; | |
262 InputEventTracker input_tracker(&mock_stub); | |
263 ExpectationSet injects; | |
264 | |
265 std::set<uint32> expected_ids1; | |
266 expected_ids1.insert(1); | |
267 expected_ids1.insert(2); | |
268 std::set<uint32> expected_ids2; | |
269 expected_ids2.insert(3); | |
270 expected_ids2.insert(5); | |
271 expected_ids2.insert(8); | |
272 | |
273 { | |
274 InSequence s; | |
275 injects += EXPECT_CALL( | |
276 mock_stub, InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
277 expected_ids1, TouchEvent::TOUCH_POINT_START))); | |
278 injects += EXPECT_CALL( | |
279 mock_stub, InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
280 expected_ids2, TouchEvent::TOUCH_POINT_START))); | |
281 } | |
Wez
2015/02/05 02:09:07
nit: Blank line between this and the next block
Rintaro Kuroiwa
2015/02/06 23:35:02
Done.
| |
282 std::set<uint32> all_touch_point_ids; | |
283 all_touch_point_ids.insert(expected_ids1.begin(), expected_ids1.end()); | |
284 all_touch_point_ids.insert(expected_ids2.begin(), expected_ids2.end()); | |
285 EXPECT_CALL(mock_stub, | |
286 InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
287 all_touch_point_ids, TouchEvent::TOUCH_POINT_CANCEL))) | |
288 .After(injects); | |
Wez
2015/02/05 02:09:07
Why is this not just in the sequence |s|?
Rintaro Kuroiwa
2015/02/06 23:35:02
This test works with InSequence. Removed Expecatat
| |
289 | |
290 TouchEvent start_event1; | |
291 start_event1.set_event_type(TouchEvent::TOUCH_POINT_START); | |
292 AddTouchPoint(1, &start_event1); | |
293 AddTouchPoint(2, &start_event1); | |
294 input_tracker.InjectTouchEvent(start_event1); | |
295 | |
296 TouchEvent start_event2; | |
297 start_event2.set_event_type(TouchEvent::TOUCH_POINT_START); | |
298 AddTouchPoint(3, &start_event2); | |
299 AddTouchPoint(5, &start_event2); | |
300 AddTouchPoint(8, &start_event2); | |
301 input_tracker.InjectTouchEvent(start_event2); | |
302 | |
303 input_tracker.ReleaseAll(); | |
304 } | |
305 | |
306 // Add some touch points and remove only a subset of them. ReleaseAll() should | |
307 // cancel all the remaining touch points. | |
308 TEST(InputEventTrackerTest, ReleaseAllRemainingTouchPoints) { | |
309 MockInputStub mock_stub; | |
310 InputEventTracker input_tracker(&mock_stub); | |
311 ExpectationSet injects; | |
312 | |
313 std::set<uint32> start_expected_ids; | |
314 start_expected_ids.insert(1); | |
315 start_expected_ids.insert(2); | |
316 std::set<uint32> end_expected_ids; | |
317 end_expected_ids.insert(1); | |
318 | |
319 { | |
320 InSequence s; | |
321 injects += EXPECT_CALL( | |
322 mock_stub, | |
323 InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
324 start_expected_ids, TouchEvent::TOUCH_POINT_START))); | |
325 injects += EXPECT_CALL( | |
326 mock_stub, | |
327 InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
328 end_expected_ids, TouchEvent::TOUCH_POINT_END))); | |
329 } | |
Wez
2015/02/05 02:09:07
nit: Blank line before next logical block.
Rintaro Kuroiwa
2015/02/06 23:35:02
Done.
| |
330 std::set<uint32> all_remaining_touch_point_ids; | |
331 all_remaining_touch_point_ids.insert(2); | |
332 EXPECT_CALL(mock_stub, InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
333 all_remaining_touch_point_ids, | |
334 TouchEvent::TOUCH_POINT_CANCEL))) | |
335 .After(injects); | |
Wez
2015/02/05 02:09:07
Why is this not just in the sequence |s|?
Rintaro Kuroiwa
2015/02/06 23:35:02
This test works with InSequence. Removed Expecatat
| |
336 | |
337 TouchEvent start_event; | |
338 start_event.set_event_type(TouchEvent::TOUCH_POINT_START); | |
339 AddTouchPoint(1, &start_event); | |
340 AddTouchPoint(2, &start_event); | |
341 input_tracker.InjectTouchEvent(start_event); | |
342 | |
343 TouchEvent end_event; | |
344 end_event.set_event_type(TouchEvent::TOUCH_POINT_END); | |
345 AddTouchPoint(1, &end_event); | |
346 input_tracker.InjectTouchEvent(end_event); | |
347 | |
348 input_tracker.ReleaseAll(); | |
349 } | |
350 | |
351 // All touch points are released before ReleaseAll() is called. | |
Wez
2015/02/05 02:09:08
Do you mean "test that no touch events are generat
Rintaro Kuroiwa
2015/02/06 23:35:02
Yes, that's what I meant :)
True, the test above
| |
352 TEST(InputEventTrackerTest, NoTouchPointsForReleaseAll) { | |
353 ::testing::StrictMock<MockInputStub> mock_stub; | |
354 InputEventTracker input_tracker(&mock_stub); | |
355 | |
356 std::set<uint32> expected_ids; | |
357 expected_ids.insert(13); | |
358 expected_ids.insert(59); | |
359 { | |
360 InSequence s; | |
361 EXPECT_CALL(mock_stub, | |
362 InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
363 expected_ids, TouchEvent::TOUCH_POINT_START))); | |
364 EXPECT_CALL(mock_stub, | |
365 InjectTouchEvent(TouchPointIdsAndTypeEqual( | |
366 expected_ids, TouchEvent::TOUCH_POINT_END))); | |
367 } | |
368 | |
369 TouchEvent start_touch_event; | |
370 start_touch_event.set_event_type(TouchEvent::TOUCH_POINT_START); | |
371 AddTouchPoint(13, &start_touch_event); | |
372 AddTouchPoint(59, &start_touch_event); | |
373 input_tracker.InjectTouchEvent(start_touch_event); | |
374 | |
375 TouchEvent end_touch_event; | |
376 end_touch_event.set_event_type(TouchEvent::TOUCH_POINT_END); | |
377 AddTouchPoint(13, &end_touch_event); | |
378 AddTouchPoint(59, &end_touch_event); | |
379 input_tracker.InjectTouchEvent(end_touch_event); | |
380 | |
381 input_tracker.ReleaseAll(); | |
382 } | |
383 | |
242 } // namespace protocol | 384 } // namespace protocol |
243 } // namespace remoting | 385 } // namespace remoting |
OLD | NEW |