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 } |
| 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); |
| 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 } |
| 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); |
| 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. |
| 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 |