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

Side by Side Diff: remoting/client/plugin/mac_key_event_processor_unittest.cc

Issue 10387226: [chromoting] Fix sticky c key with cmd on mac using usb keycode (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698