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/client/plugin/mac_key_event_processor.h" | 5 #include "remoting/client/plugin/mac_key_event_processor.h" |
6 #include "remoting/proto/event.pb.h" | 6 #include "remoting/proto/event.pb.h" |
| 7 #include "remoting/protocol/protocol_mock_objects.h" |
| 8 #include "testing/gmock/include/gmock/gmock.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
8 | 10 |
| 11 using ::testing::InSequence; |
9 using remoting::protocol::InputStub; | 12 using remoting::protocol::InputStub; |
10 using remoting::protocol::KeyEvent; | 13 using remoting::protocol::KeyEvent; |
| 14 using remoting::protocol::MockInputStub; |
11 using remoting::protocol::MouseEvent; | 15 using remoting::protocol::MouseEvent; |
12 | 16 |
13 namespace remoting { | 17 namespace remoting { |
14 | 18 |
15 namespace { | 19 namespace { |
16 | 20 |
17 const int kShift = 16; | 21 const unsigned int kUsbLeftShift = 0x0700e1; |
18 const int kOption = 18; | 22 const unsigned int kUsbLeftOption = 0x0700e2; |
19 const int kLeftCmd = 91; | 23 const unsigned int kUsbLeftCmd = 0x0700e3; |
20 const int kRightCmd = 93; | 24 const unsigned int kUsbRightCmd = 0x0700e7; |
21 | 25 |
22 class FakeInputStub : public InputStub { | 26 MATCHER_P2(EqualsUsbEvent, usb_keycode, pressed, "") { |
23 public: | 27 return arg.usb_keycode() == static_cast<uint32>(usb_keycode) && |
24 FakeInputStub() {} | 28 arg.pressed() == pressed; |
25 virtual ~FakeInputStub() {} | 29 } |
26 | |
27 virtual void InjectKeyEvent(const KeyEvent& event) { | |
28 key_events_.push_back(std::make_pair(event.keycode(), event.pressed())); | |
29 } | |
30 | |
31 virtual void InjectMouseEvent(const MouseEvent& event) { | |
32 } | |
33 | |
34 void ExpectOneKeyEvent(int keycode, bool pressed) { | |
35 EXPECT_EQ(1u, key_events_.size()); | |
36 EXPECT_EQ(keycode, key_events_[0].first); | |
37 EXPECT_EQ(pressed, key_events_[0].second); | |
38 } | |
39 | |
40 void ExpectTwoKeyEvents(int keycode0, bool pressed0, | |
41 int keycode1, bool pressed1) { | |
42 EXPECT_EQ(2u, key_events_.size()); | |
43 EXPECT_EQ(keycode0, key_events_[0].first); | |
44 EXPECT_EQ(pressed0, key_events_[0].second); | |
45 EXPECT_EQ(keycode1, key_events_[1].first); | |
46 EXPECT_EQ(pressed1, key_events_[1].second); | |
47 } | |
48 | |
49 void ExpectThreeKeyEvents(int keycode0, bool pressed0, | |
50 int keycode1, bool pressed1, | |
51 int keycode2, bool pressed2) { | |
52 EXPECT_EQ(3u, key_events_.size()); | |
53 EXPECT_EQ(keycode0, key_events_[0].first); | |
54 EXPECT_EQ(pressed0, key_events_[0].second); | |
55 EXPECT_EQ(keycode1, key_events_[1].first); | |
56 EXPECT_EQ(pressed1, key_events_[1].second); | |
57 EXPECT_EQ(keycode2, key_events_[2].first); | |
58 EXPECT_EQ(pressed2, key_events_[2].second); | |
59 } | |
60 | |
61 void ClearKeyEvents() { | |
62 key_events_.clear(); | |
63 } | |
64 | |
65 private: | |
66 std::vector<std::pair<int, bool> > key_events_; | |
67 | |
68 DISALLOW_COPY_AND_ASSIGN(FakeInputStub); | |
69 }; | |
70 | 30 |
71 KeyEvent MakeKeyEvent(int keycode, bool pressed) { | 31 KeyEvent MakeKeyEvent(int keycode, bool pressed) { |
72 KeyEvent event; | 32 KeyEvent event; |
73 event.set_keycode(keycode); | 33 event.set_usb_keycode(keycode); |
74 event.set_pressed(pressed); | 34 event.set_pressed(pressed); |
75 return event; | 35 return event; |
76 } | 36 } |
77 | 37 |
78 } // namespace | 38 } // namespace |
79 | 39 |
80 // Test without pressing command key. | 40 // Test without pressing command key. |
81 TEST(MacKeyEventProcessorTest, NoInjection) { | 41 TEST(MacKeyEventProcessorTest, NoInjection) { |
82 FakeInputStub stub; | 42 MockInputStub stub; |
83 MacKeyEventProcessor processor(&stub); | 43 MacKeyEventProcessor processor(&stub); |
84 | 44 |
85 // C Down. | 45 { |
| 46 InSequence s; |
| 47 |
| 48 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', true))); |
| 49 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 50 } |
| 51 |
| 52 // C Down and C Up. |
86 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | 53 processor.InjectKeyEvent(MakeKeyEvent('C', true)); |
87 stub.ExpectOneKeyEvent('C', true); | |
88 stub.ClearKeyEvents(); | |
89 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
90 | |
91 // C Up. | |
92 processor.InjectKeyEvent(MakeKeyEvent('C', false)); | 54 processor.InjectKeyEvent(MakeKeyEvent('C', false)); |
93 stub.ExpectOneKeyEvent('C', false); | |
94 stub.ClearKeyEvents(); | |
95 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
96 } | 55 } |
97 | 56 |
98 // Test pressing command key and other normal keys. | 57 // Test pressing command key and other normal keys. |
99 TEST(MacKeyEventProcessorTest, CmdKey) { | 58 TEST(MacKeyEventProcessorTest, CmdKey) { |
100 FakeInputStub stub; | 59 MockInputStub stub; |
101 MacKeyEventProcessor processor(&stub); | 60 MacKeyEventProcessor processor(&stub); |
102 | 61 |
| 62 { |
| 63 InSequence s; |
| 64 |
| 65 // Left command key. |
| 66 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, true))); |
| 67 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', true))); |
| 68 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 69 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, false))); |
| 70 |
| 71 // Right command key. |
| 72 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, true))); |
| 73 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', true))); |
| 74 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 75 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, false))); |
| 76 |
| 77 // More than one keys after CMD. |
| 78 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, true))); |
| 79 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', true))); |
| 80 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('V', true))); |
| 81 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 82 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('V', false))); |
| 83 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, false))); |
| 84 } |
| 85 |
103 // Left command key. | 86 // Left command key. |
104 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, true)); | 87 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, true)); |
105 stub.ExpectOneKeyEvent(kLeftCmd, true); | |
106 stub.ClearKeyEvents(); | |
107 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
108 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | 88 processor.InjectKeyEvent(MakeKeyEvent('C', true)); |
109 stub.ExpectOneKeyEvent('C', true); | 89 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, false)); |
110 stub.ClearKeyEvents(); | |
111 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
112 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, false)); | |
113 stub.ExpectTwoKeyEvents('C', false, kLeftCmd, false); | |
114 stub.ClearKeyEvents(); | |
115 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
116 | 90 |
117 // Right command key. | 91 // Right command key. |
118 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, true)); | 92 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, true)); |
119 stub.ExpectOneKeyEvent(kRightCmd, true); | |
120 stub.ClearKeyEvents(); | |
121 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
122 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | 93 processor.InjectKeyEvent(MakeKeyEvent('C', true)); |
123 stub.ExpectOneKeyEvent('C', true); | 94 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, false)); |
124 stub.ClearKeyEvents(); | |
125 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
126 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, false)); | |
127 stub.ExpectTwoKeyEvents('C', false, kRightCmd, false); | |
128 stub.ClearKeyEvents(); | |
129 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
130 | 95 |
131 // More than one keys after CMD. | 96 // More than one keys after CMD. |
132 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, true)); | 97 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, true)); |
133 stub.ExpectOneKeyEvent(kRightCmd, true); | |
134 stub.ClearKeyEvents(); | |
135 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
136 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | 98 processor.InjectKeyEvent(MakeKeyEvent('C', true)); |
137 stub.ExpectOneKeyEvent('C', true); | |
138 stub.ClearKeyEvents(); | |
139 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
140 processor.InjectKeyEvent(MakeKeyEvent('V', true)); | 99 processor.InjectKeyEvent(MakeKeyEvent('V', true)); |
141 stub.ExpectOneKeyEvent('V', true); | 100 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, false)); |
142 stub.ClearKeyEvents(); | |
143 EXPECT_EQ(3, processor.NumberOfPressedKeys()); | |
144 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, false)); | |
145 stub.ExpectThreeKeyEvents('C', false, 'V', false, | |
146 kRightCmd, false); | |
147 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
148 } | 101 } |
149 | 102 |
150 // Test pressing command and special keys. | 103 // Test pressing command and special keys. |
151 TEST(MacKeyEventProcessorTest, SpecialKeys) { | 104 TEST(MacKeyEventProcessorTest, SpecialKeys) { |
152 FakeInputStub stub; | 105 MockInputStub stub; |
153 MacKeyEventProcessor processor(&stub); | 106 MacKeyEventProcessor processor(&stub); |
154 | 107 |
| 108 { |
| 109 InSequence s; |
| 110 |
| 111 // Command + Shift. |
| 112 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, true))); |
| 113 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftShift, true))); |
| 114 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, false))); |
| 115 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftShift, false))); |
| 116 |
| 117 // Command + Option. |
| 118 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, true))); |
| 119 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftOption, true))); |
| 120 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, false))); |
| 121 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftOption, false))); |
| 122 } |
| 123 |
155 // Command + Shift. | 124 // Command + Shift. |
156 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, true)); | 125 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, true)); |
157 stub.ExpectOneKeyEvent(kLeftCmd, true); | 126 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftShift, true)); |
158 stub.ClearKeyEvents(); | 127 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, false)); |
159 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | 128 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftShift, false)); |
160 processor.InjectKeyEvent(MakeKeyEvent(kShift, true)); | |
161 stub.ExpectOneKeyEvent(kShift, true); | |
162 stub.ClearKeyEvents(); | |
163 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
164 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, false)); | |
165 stub.ExpectOneKeyEvent(kLeftCmd, false); | |
166 stub.ClearKeyEvents(); | |
167 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
168 processor.InjectKeyEvent(MakeKeyEvent(kShift, false)); | |
169 stub.ExpectOneKeyEvent(kShift, false); | |
170 stub.ClearKeyEvents(); | |
171 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
172 | 129 |
173 // Command + Option. | 130 // Command + Option. |
174 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, true)); | 131 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, true)); |
175 stub.ExpectOneKeyEvent(kLeftCmd, true); | 132 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftOption, true)); |
176 stub.ClearKeyEvents(); | 133 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, false)); |
177 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | 134 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftOption, false)); |
178 processor.InjectKeyEvent(MakeKeyEvent(kOption, true)); | |
179 stub.ExpectOneKeyEvent(kOption, true); | |
180 stub.ClearKeyEvents(); | |
181 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
182 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, false)); | |
183 stub.ExpectOneKeyEvent(kLeftCmd, false); | |
184 stub.ClearKeyEvents(); | |
185 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
186 processor.InjectKeyEvent(MakeKeyEvent(kOption, false)); | |
187 stub.ExpectOneKeyEvent(kOption, false); | |
188 stub.ClearKeyEvents(); | |
189 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
190 } | 135 } |
191 | 136 |
192 // Test pressing multiple command keys. | 137 // Test pressing multiple command keys. |
193 TEST(MacKeyEventProcessorTest, MultipleCmdKeys) { | 138 TEST(MacKeyEventProcessorTest, MultipleCmdKeys) { |
194 FakeInputStub stub; | 139 MockInputStub stub; |
195 MacKeyEventProcessor processor(&stub); | 140 MacKeyEventProcessor processor(&stub); |
196 | 141 |
| 142 { |
| 143 InSequence s; |
| 144 |
| 145 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, true))); |
| 146 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', true))); |
| 147 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, true))); |
| 148 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 149 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbLeftCmd, false))); |
| 150 } |
| 151 |
197 // Test multiple CMD keys at the same time. | 152 // Test multiple CMD keys at the same time. |
198 // L CMD Down. | 153 // L CMD Down, C Down, R CMD Down, L CMD Up. |
199 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, true)); | 154 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, true)); |
200 stub.ExpectOneKeyEvent(kLeftCmd, true); | |
201 stub.ClearKeyEvents(); | |
202 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
203 // C Down. | |
204 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | 155 processor.InjectKeyEvent(MakeKeyEvent('C', true)); |
205 stub.ExpectOneKeyEvent('C', true); | 156 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, true)); |
206 stub.ClearKeyEvents(); | 157 processor.InjectKeyEvent(MakeKeyEvent(kUsbLeftCmd, false)); |
207 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
208 // R CMD Down. | |
209 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, true)); | |
210 stub.ExpectOneKeyEvent(kRightCmd, true); | |
211 stub.ClearKeyEvents(); | |
212 EXPECT_EQ(3, processor.NumberOfPressedKeys()); | |
213 // L CMD Up. | |
214 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, false)); | |
215 stub.ExpectTwoKeyEvents('C', false, kLeftCmd, false); | |
216 stub.ClearKeyEvents(); | |
217 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
218 } | 158 } |
219 | 159 |
220 // Test press C key before command key. | 160 // Test press C key before command key. |
221 TEST(MacKeyEventProcessorTest, BeforeCmdKey) { | 161 TEST(MacKeyEventProcessorTest, BeforeCmdKey) { |
222 FakeInputStub stub; | 162 MockInputStub stub; |
223 MacKeyEventProcessor processor(&stub); | 163 MacKeyEventProcessor processor(&stub); |
224 | 164 |
| 165 { |
| 166 InSequence s; |
| 167 |
| 168 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', true))); |
| 169 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, true))); |
| 170 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 171 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent(kUsbRightCmd, false))); |
| 172 EXPECT_CALL(stub, InjectKeyEvent(EqualsUsbEvent('C', false))); |
| 173 } |
| 174 |
225 // Press C before command key. | 175 // Press C before command key. |
226 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | 176 processor.InjectKeyEvent(MakeKeyEvent('C', true)); |
227 stub.ExpectOneKeyEvent('C', true); | 177 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, true)); |
228 stub.ClearKeyEvents(); | 178 processor.InjectKeyEvent(MakeKeyEvent(kUsbRightCmd, false)); |
229 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
230 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, true)); | |
231 stub.ExpectOneKeyEvent(kRightCmd, true); | |
232 stub.ClearKeyEvents(); | |
233 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
234 processor.InjectKeyEvent(MakeKeyEvent(kRightCmd, false)); | |
235 stub.ExpectTwoKeyEvents('C', false, kRightCmd, false); | |
236 stub.ClearKeyEvents(); | |
237 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
238 processor.InjectKeyEvent(MakeKeyEvent('C', false)); | 179 processor.InjectKeyEvent(MakeKeyEvent('C', false)); |
239 stub.ExpectOneKeyEvent('C', false); | |
240 stub.ClearKeyEvents(); | |
241 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
242 } | |
243 | |
244 // Test sending multiple keydowns. | |
245 TEST(MacKeyEventProcessorTest, MultipleKeydowns) { | |
246 FakeInputStub stub; | |
247 MacKeyEventProcessor processor(&stub); | |
248 | |
249 // 2 CMD Downs. | |
250 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, true)); | |
251 stub.ExpectOneKeyEvent(kLeftCmd, true); | |
252 stub.ClearKeyEvents(); | |
253 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
254 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, true)); | |
255 stub.ExpectOneKeyEvent(kLeftCmd, true); | |
256 stub.ClearKeyEvents(); | |
257 EXPECT_EQ(1, processor.NumberOfPressedKeys()); | |
258 // C Down. | |
259 processor.InjectKeyEvent(MakeKeyEvent('C', true)); | |
260 stub.ExpectOneKeyEvent('C', true); | |
261 stub.ClearKeyEvents(); | |
262 EXPECT_EQ(2, processor.NumberOfPressedKeys()); | |
263 // CMD Up. | |
264 processor.InjectKeyEvent(MakeKeyEvent(kLeftCmd, false)); | |
265 stub.ExpectTwoKeyEvents('C', false, kLeftCmd, false); | |
266 stub.ClearKeyEvents(); | |
267 EXPECT_EQ(0, processor.NumberOfPressedKeys()); | |
268 } | 180 } |
269 | 181 |
270 } // namespace remoting | 182 } // namespace remoting |
OLD | NEW |