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 "remoting/protocol/test_event_matchers.h" |
9 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
11 | 12 |
12 using ::testing::_; | 13 using ::testing::_; |
13 using ::testing::ExpectationSet; | 14 using ::testing::ExpectationSet; |
14 using ::testing::InSequence; | 15 using ::testing::InSequence; |
15 | 16 |
16 namespace remoting { | 17 namespace remoting { |
17 namespace protocol { | 18 namespace protocol { |
18 | 19 |
19 namespace { | 20 namespace { |
20 | 21 |
21 static const MouseEvent::MouseButton BUTTON_LEFT = MouseEvent::BUTTON_LEFT; | 22 static const MouseEvent::MouseButton BUTTON_LEFT = MouseEvent::BUTTON_LEFT; |
22 static const MouseEvent::MouseButton BUTTON_RIGHT = MouseEvent::BUTTON_RIGHT; | 23 static const MouseEvent::MouseButton BUTTON_RIGHT = MouseEvent::BUTTON_RIGHT; |
23 | 24 |
24 // A hardcoded value used to verify |lock_states| is preserved. | |
25 static const uint32 kTestLockStates = protocol::KeyEvent::LOCK_STATES_CAPSLOCK; | |
26 | |
27 // Verify the usb key code and the "pressed" state. | |
28 // Also verify that the event doesn't have |lock_states| set. | |
29 MATCHER_P2(EqualsUsbEventWithoutLockStates, usb_keycode, pressed, "") { | |
30 return arg.usb_keycode() == static_cast<uint32>(usb_keycode) && | |
31 arg.pressed() == pressed && | |
32 !arg.has_lock_states(); | |
33 } | |
34 | |
35 // Verify the usb key code, the "pressed" state, and the lock states. | |
36 MATCHER_P2(EqualsUsbEvent, usb_keycode, pressed, "") { | |
37 return arg.usb_keycode() == static_cast<uint32>(usb_keycode) && | |
38 arg.pressed() == pressed && | |
39 arg.lock_states() == kTestLockStates; | |
40 } | |
41 | |
42 MATCHER_P4(EqualsMouseEvent, x, y, button, down, "") { | |
43 return arg.x() == x && arg.y() == y && arg.button() == button && | |
44 arg.button_down() == down; | |
45 } | |
46 | |
47 MATCHER_P2(TouchPointIdsAndTypeEqual, ids, type, "") { | 25 MATCHER_P2(TouchPointIdsAndTypeEqual, ids, type, "") { |
48 if (arg.event_type() != type) | 26 if (arg.event_type() != type) |
49 return false; | 27 return false; |
50 | 28 |
51 std::set<uint32> touch_ids; | 29 std::set<uint32> touch_ids; |
52 for (const TouchEventPoint& point : arg.touch_points()) { | 30 for (const TouchEventPoint& point : arg.touch_points()) { |
53 touch_ids.insert(point.id()); | 31 touch_ids.insert(point.id()); |
54 } | 32 } |
55 return touch_ids == ids; | 33 return touch_ids == ids; |
56 } | 34 } |
57 | 35 |
58 static KeyEvent NewUsbEvent(uint32 usb_keycode, | 36 static KeyEvent NewUsbEvent(uint32 usb_keycode, bool pressed) { |
59 bool pressed) { | |
60 KeyEvent event; | 37 KeyEvent event; |
61 event.set_usb_keycode(usb_keycode); | 38 event.set_usb_keycode(usb_keycode); |
62 event.set_pressed(pressed); | 39 event.set_pressed(pressed); |
63 // Create all key events with the hardcoded |lock_state| in this test. | 40 // Create all key events with the hardcoded |lock_state| in this test. |
64 event.set_lock_states(kTestLockStates); | 41 event.set_lock_states(KeyEvent::LOCK_STATES_CAPSLOCK); |
65 return event; | 42 return event; |
66 } | 43 } |
67 | 44 |
68 static void PressAndReleaseUsb(InputStub* input_stub, | 45 static void PressAndReleaseUsb(InputStub* input_stub, uint32 usb_keycode) { |
69 uint32 usb_keycode) { | |
70 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, true)); | 46 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, true)); |
71 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, false)); | 47 input_stub->InjectKeyEvent(NewUsbEvent(usb_keycode, false)); |
72 } | 48 } |
73 | 49 |
74 static MouseEvent NewMouseEvent(int x, int y, | 50 static MouseEvent NewMouseEvent(int x, |
75 MouseEvent::MouseButton button, bool down) { | 51 int y, |
| 52 MouseEvent::MouseButton button, |
| 53 bool down) { |
76 MouseEvent event; | 54 MouseEvent event; |
77 event.set_x(x); | 55 event.set_x(x); |
78 event.set_y(y); | 56 event.set_y(y); |
79 event.set_button(button); | 57 event.set_button(button); |
80 event.set_button_down(down); | 58 event.set_button_down(down); |
81 return event; | 59 return event; |
82 } | 60 } |
83 | 61 |
84 void AddTouchPoint(uint32 id, TouchEvent* event) { | 62 void AddTouchPoint(uint32 id, TouchEvent* event) { |
85 TouchEventPoint* p = event->add_touch_points(); | 63 TouchEventPoint* p = event->add_touch_points(); |
86 p->set_id(id); | 64 p->set_id(id); |
87 } | 65 } |
88 | 66 |
89 } // namespace | 67 } // namespace |
90 | 68 |
91 // Verify that keys that were pressed and released aren't re-released. | 69 // Verify that keys that were pressed and released aren't re-released. |
92 TEST(InputEventTrackerTest, NothingToRelease) { | 70 TEST(InputEventTrackerTest, NothingToRelease) { |
93 MockInputStub mock_stub; | 71 MockInputStub mock_stub; |
94 InputEventTracker input_tracker(&mock_stub); | 72 InputEventTracker input_tracker(&mock_stub); |
95 | 73 |
96 { | 74 { |
97 InSequence s; | 75 InSequence s; |
98 | 76 |
99 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, true))); | 77 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(1, true))); |
100 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, false))); | 78 EXPECT_CALL(mock_stub, |
101 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, true))); | 79 InjectKeyEvent(EqualsUsbEventWithCapsLock(1, false))); |
102 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, false))); | 80 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(2, true))); |
| 81 EXPECT_CALL(mock_stub, |
| 82 InjectKeyEvent(EqualsUsbEventWithCapsLock(2, false))); |
103 | 83 |
104 EXPECT_CALL(mock_stub, | 84 EXPECT_CALL(mock_stub, |
105 InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_LEFT, true))); | 85 InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_LEFT, true))); |
106 EXPECT_CALL(mock_stub, | 86 EXPECT_CALL(mock_stub, |
107 InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_LEFT, false))); | 87 InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_LEFT, false))); |
108 } | 88 } |
109 | 89 |
110 PressAndReleaseUsb(&input_tracker, 1); | 90 PressAndReleaseUsb(&input_tracker, 1); |
111 PressAndReleaseUsb(&input_tracker, 2); | 91 PressAndReleaseUsb(&input_tracker, 2); |
112 | 92 |
113 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_LEFT, true)); | 93 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_LEFT, true)); |
114 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_LEFT, false)); | 94 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_LEFT, false)); |
115 | 95 |
116 input_tracker.ReleaseAll(); | 96 input_tracker.ReleaseAll(); |
117 } | 97 } |
118 | 98 |
119 // Verify that keys that were left pressed get released. | 99 // Verify that keys that were left pressed get released. |
120 TEST(InputEventTrackerTest, ReleaseAllKeys) { | 100 TEST(InputEventTrackerTest, ReleaseAllKeys) { |
121 MockInputStub mock_stub; | 101 MockInputStub mock_stub; |
122 InputEventTracker input_tracker(&mock_stub); | 102 InputEventTracker input_tracker(&mock_stub); |
123 ExpectationSet injects; | 103 ExpectationSet injects; |
124 | 104 |
125 { | 105 { |
126 InSequence s; | 106 InSequence s; |
127 | 107 |
128 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(3, true))); | 108 injects += EXPECT_CALL(mock_stub, |
129 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, true))); | 109 InjectKeyEvent(EqualsUsbEventWithCapsLock(3, true))); |
130 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, false))); | 110 injects += EXPECT_CALL(mock_stub, |
131 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, true))); | 111 InjectKeyEvent(EqualsUsbEventWithCapsLock(1, true))); |
132 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, false))); | 112 injects += EXPECT_CALL( |
| 113 mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(1, false))); |
| 114 injects += EXPECT_CALL(mock_stub, |
| 115 InjectKeyEvent(EqualsUsbEventWithCapsLock(2, true))); |
| 116 injects += EXPECT_CALL( |
| 117 mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(2, false))); |
133 | 118 |
134 injects += EXPECT_CALL(mock_stub, | 119 injects += EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseEvent( |
135 InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_RIGHT, true))); | 120 0, 0, BUTTON_RIGHT, true))); |
136 injects += EXPECT_CALL(mock_stub, | 121 injects += EXPECT_CALL( |
137 InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_LEFT, true))); | 122 mock_stub, InjectMouseEvent(EqualsMouseEvent(0, 0, BUTTON_LEFT, true))); |
138 injects += EXPECT_CALL(mock_stub, | 123 injects += EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseEvent( |
139 InjectMouseEvent(EqualsMouseEvent(1, 1, BUTTON_LEFT, false))); | 124 1, 1, BUTTON_LEFT, false))); |
140 } | 125 } |
141 | 126 |
142 // The key should be released but |lock_states| should not be set. | 127 // The key should be released but |lock_states| should not be set. |
143 EXPECT_CALL(mock_stub, | 128 EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEventWithoutLockStates( |
144 InjectKeyEvent(EqualsUsbEventWithoutLockStates(3, false))) | 129 3, false))).After(injects); |
145 .After(injects); | 130 EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseEvent( |
146 EXPECT_CALL(mock_stub, | 131 1, 1, BUTTON_RIGHT, false))).After(injects); |
147 InjectMouseEvent(EqualsMouseEvent(1, 1, BUTTON_RIGHT, false))) | |
148 .After(injects); | |
149 | 132 |
150 input_tracker.InjectKeyEvent(NewUsbEvent(3, true)); | 133 input_tracker.InjectKeyEvent(NewUsbEvent(3, true)); |
151 PressAndReleaseUsb(&input_tracker, 1); | 134 PressAndReleaseUsb(&input_tracker, 1); |
152 PressAndReleaseUsb(&input_tracker, 2); | 135 PressAndReleaseUsb(&input_tracker, 2); |
153 | 136 |
154 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_RIGHT, true)); | 137 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_RIGHT, true)); |
155 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_LEFT, true)); | 138 input_tracker.InjectMouseEvent(NewMouseEvent(0, 0, BUTTON_LEFT, true)); |
156 input_tracker.InjectMouseEvent(NewMouseEvent(1, 1, BUTTON_LEFT, false)); | 139 input_tracker.InjectMouseEvent(NewMouseEvent(1, 1, BUTTON_LEFT, false)); |
157 | 140 |
158 EXPECT_FALSE(input_tracker.IsKeyPressed(1)); | 141 EXPECT_FALSE(input_tracker.IsKeyPressed(1)); |
159 EXPECT_FALSE(input_tracker.IsKeyPressed(2)); | 142 EXPECT_FALSE(input_tracker.IsKeyPressed(2)); |
160 EXPECT_TRUE(input_tracker.IsKeyPressed(3)); | 143 EXPECT_TRUE(input_tracker.IsKeyPressed(3)); |
161 EXPECT_EQ(1, input_tracker.PressedKeyCount()); | 144 EXPECT_EQ(1, input_tracker.PressedKeyCount()); |
162 | 145 |
163 input_tracker.ReleaseAll(); | 146 input_tracker.ReleaseAll(); |
164 } | 147 } |
165 | 148 |
166 // Verify that we track both USB-based key events correctly. | 149 // Verify that we track both USB-based key events correctly. |
167 TEST(InputEventTrackerTest, TrackUsbKeyEvents) { | 150 TEST(InputEventTrackerTest, TrackUsbKeyEvents) { |
168 MockInputStub mock_stub; | 151 MockInputStub mock_stub; |
169 InputEventTracker input_tracker(&mock_stub); | 152 InputEventTracker input_tracker(&mock_stub); |
170 ExpectationSet injects; | 153 ExpectationSet injects; |
171 | 154 |
172 { | 155 { |
173 InSequence s; | 156 InSequence s; |
174 | 157 |
175 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(3, true))); | 158 injects += EXPECT_CALL(mock_stub, |
176 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(6, true))); | 159 InjectKeyEvent(EqualsUsbEventWithCapsLock(3, true))); |
177 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(7, true))); | 160 injects += EXPECT_CALL(mock_stub, |
178 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(5, true))); | 161 InjectKeyEvent(EqualsUsbEventWithCapsLock(6, true))); |
179 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(5, true))); | 162 injects += EXPECT_CALL(mock_stub, |
180 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, true))); | 163 InjectKeyEvent(EqualsUsbEventWithCapsLock(7, true))); |
181 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, false))); | 164 injects += EXPECT_CALL(mock_stub, |
| 165 InjectKeyEvent(EqualsUsbEventWithCapsLock(5, true))); |
| 166 injects += EXPECT_CALL(mock_stub, |
| 167 InjectKeyEvent(EqualsUsbEventWithCapsLock(5, true))); |
| 168 injects += EXPECT_CALL(mock_stub, |
| 169 InjectKeyEvent(EqualsUsbEventWithCapsLock(2, true))); |
| 170 injects += EXPECT_CALL( |
| 171 mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(2, false))); |
182 } | 172 } |
183 | 173 |
184 // The key should be auto released with no |lock_states|. | 174 // The key should be auto released with no |lock_states|. |
185 EXPECT_CALL(mock_stub, | 175 EXPECT_CALL(mock_stub, |
186 InjectKeyEvent(EqualsUsbEventWithoutLockStates(3, false))) | 176 InjectKeyEvent(EqualsUsbEventWithoutLockStates(3, false))) |
187 .After(injects); | 177 .After(injects); |
188 EXPECT_CALL(mock_stub, | 178 EXPECT_CALL(mock_stub, |
189 InjectKeyEvent(EqualsUsbEventWithoutLockStates(6, false))) | 179 InjectKeyEvent(EqualsUsbEventWithoutLockStates(6, false))) |
190 .After(injects); | 180 .After(injects); |
191 EXPECT_CALL(mock_stub, | 181 EXPECT_CALL(mock_stub, |
(...skipping 23 matching lines...) Expand all Loading... |
215 | 205 |
216 // Verify that invalid events get passed through but not tracked. | 206 // Verify that invalid events get passed through but not tracked. |
217 TEST(InputEventTrackerTest, InvalidEventsNotTracked) { | 207 TEST(InputEventTrackerTest, InvalidEventsNotTracked) { |
218 MockInputStub mock_stub; | 208 MockInputStub mock_stub; |
219 InputEventTracker input_tracker(&mock_stub); | 209 InputEventTracker input_tracker(&mock_stub); |
220 ExpectationSet injects; | 210 ExpectationSet injects; |
221 | 211 |
222 { | 212 { |
223 InSequence s; | 213 InSequence s; |
224 | 214 |
225 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(3, true))); | 215 injects += EXPECT_CALL(mock_stub, |
226 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, true))); | 216 InjectKeyEvent(EqualsUsbEventWithCapsLock(3, true))); |
227 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(1, false))); | 217 injects += EXPECT_CALL(mock_stub, |
| 218 InjectKeyEvent(EqualsUsbEventWithCapsLock(1, true))); |
| 219 injects += EXPECT_CALL( |
| 220 mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(1, false))); |
228 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(_)).Times(2); | 221 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(_)).Times(2); |
229 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, true))); | 222 injects += EXPECT_CALL(mock_stub, |
230 injects += EXPECT_CALL(mock_stub, InjectKeyEvent(EqualsUsbEvent(2, false))); | 223 InjectKeyEvent(EqualsUsbEventWithCapsLock(2, true))); |
| 224 injects += EXPECT_CALL( |
| 225 mock_stub, InjectKeyEvent(EqualsUsbEventWithCapsLock(2, false))); |
231 } | 226 } |
232 | 227 |
233 EXPECT_CALL(mock_stub, | 228 EXPECT_CALL(mock_stub, |
234 InjectKeyEvent(EqualsUsbEventWithoutLockStates(3, false))) | 229 InjectKeyEvent(EqualsUsbEventWithoutLockStates(3, false))) |
235 .After(injects); | 230 .After(injects); |
236 | 231 |
237 input_tracker.InjectKeyEvent(NewUsbEvent(3, true)); | 232 input_tracker.InjectKeyEvent(NewUsbEvent(3, true)); |
238 PressAndReleaseUsb(&input_tracker, 1); | 233 PressAndReleaseUsb(&input_tracker, 1); |
239 | 234 |
240 KeyEvent invalid_event1; | 235 KeyEvent invalid_event1; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 TouchEvent cancel_event; | 342 TouchEvent cancel_event; |
348 cancel_event.set_event_type(TouchEvent::TOUCH_POINT_CANCEL); | 343 cancel_event.set_event_type(TouchEvent::TOUCH_POINT_CANCEL); |
349 AddTouchPoint(3, &cancel_event); | 344 AddTouchPoint(3, &cancel_event); |
350 input_tracker.InjectTouchEvent(cancel_event); | 345 input_tracker.InjectTouchEvent(cancel_event); |
351 | 346 |
352 input_tracker.ReleaseAll(); | 347 input_tracker.ReleaseAll(); |
353 } | 348 } |
354 | 349 |
355 } // namespace protocol | 350 } // namespace protocol |
356 } // namespace remoting | 351 } // namespace remoting |
OLD | NEW |