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

Side by Side Diff: components/keyboard_lock/key_hook_state_keeper_unittest.cc

Issue 2879033002: Keyboard Lock Host implementation
Patch Set: Remove useless files Created 3 years, 4 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
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/keyboard_lock/key_hook_state_keeper.h"
6
7 #include <memory>
8 #include <utility>
9 #include <vector>
10
11 #include "base/bind.h"
12 #include "base/location.h"
13 #include "base/logging.h"
14 #include "base/memory/ptr_util.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace keyboard_lock {
18
19 namespace {
20
21 static const ui::KeyboardCode KEY_1 = ui::VKEY_CANCEL;
22 static const ui::KeyboardCode KEY_2 = ui::VKEY_BACK;
23 static const ui::KeyboardCode KEY_3 = ui::VKEY_TAB;
24
25 class FakeKeyHook : public KeyHook {
26 public:
27 FakeKeyHook();
28 ~FakeKeyHook() override = default;
29
30 // KeyHook implementations.
31 void RegisterKey(const std::vector<ui::KeyboardCode>& codes,
32 base::Callback<void(bool)> on_result) override;
33 void UnregisterKey(const std::vector<ui::KeyboardCode>& codes,
34 base::Callback<void(bool)> on_result) override;
35
36 bool registered(ui::KeyboardCode code) const { return states_[code]; }
37 int register_counter() const { return register_counter_; }
38 int unregister_counter() const { return unregister_counter_; }
39
40 private:
41 std::vector<bool> states_;
42 int register_counter_ = 0;
43 int unregister_counter_ = 0;
44 };
45
46 class FakeKeyEventFilter : public KeyEventFilter {
47 public:
48 explicit FakeKeyEventFilter(const FakeKeyHook* const key_hook);
49 ~FakeKeyEventFilter() override = default;
50
51 // KeyEventFilter implementations.
52 bool OnKeyDown(ui::KeyboardCode code, int flags) override;
53 bool OnKeyUp(ui::KeyboardCode code, int flags) override;
54
55 private:
56 const FakeKeyHook* const key_hook_;
57 };
58
59 FakeKeyHook::FakeKeyHook() : states_(256) {}
60
61 void FakeKeyHook::RegisterKey(const std::vector<ui::KeyboardCode>& codes,
62 base::Callback<void(bool)> on_result) {
63 register_counter_++;
64 for (const ui::KeyboardCode code : codes) {
65 ASSERT_LT(code, 256);
66 ASSERT_GE(code, 0);
67 ASSERT_FALSE(states_[code]);
68 states_[code] = true;
69 }
70 if (on_result) {
71 on_result.Run(true);
72 }
73 }
74
75 void FakeKeyHook::UnregisterKey(const std::vector<ui::KeyboardCode>& codes,
76 base::Callback<void(bool)> on_result) {
77 unregister_counter_++;
78 for (const ui::KeyboardCode code : codes) {
79 ASSERT_LT(code, 256);
80 ASSERT_GE(code, 0);
81 ASSERT_TRUE(states_[code]);
82 states_[code] = false;
83 }
84 if (on_result) {
85 on_result.Run(true);
86 }
87 }
88
89 FakeKeyEventFilter::FakeKeyEventFilter(const FakeKeyHook* const key_hook)
90 : key_hook_(key_hook) {
91 DCHECK(key_hook_);
92 }
93
94 bool FakeKeyEventFilter::OnKeyDown(ui::KeyboardCode code, int flags) {
95 EXPECT_LT(code, 256);
96 EXPECT_GE(code, 0);
97 return key_hook_->registered(code);
98 }
99
100 bool FakeKeyEventFilter::OnKeyUp(ui::KeyboardCode code, int flags) {
101 EXPECT_LT(code, 256);
102 EXPECT_GE(code, 0);
103 return key_hook_->registered(code);
104 }
105
106 }
107
108 class KeyHookStateKeeperTest : public testing::Test {
109 public:
110 KeyHookStateKeeperTest() {
111 std::unique_ptr<FakeKeyHook> hook(new FakeKeyHook());
112 key_hook_ = hook.get();
113 state_keeper_.reset(new KeyHookStateKeeper(
114 base::MakeUnique<FakeKeyEventFilter>(key_hook_),
115 std::move(hook)));
116 callback_ = base::Bind([](bool* target, bool result) {
117 *target = result;
118 },
119 base::Unretained(&last_callback_result_));
120 }
121
122 protected:
123 const FakeKeyHook* key_hook() const { return key_hook_; }
124 KeyHookStateKeeper* state_keeper() const { return state_keeper_.get(); }
125 base::Callback<void(bool)> callback() const { return callback_; }
126 bool last_callback_result() const { return last_callback_result_; }
127
128 private:
129 const FakeKeyHook* key_hook_;
130 std::unique_ptr<KeyHookStateKeeper> state_keeper_;
131 base::Callback<void(bool)> callback_;
132 bool last_callback_result_ = false;
133 };
134
135 TEST_F(KeyHookStateKeeperTest, RegisterBeforeActivate) {
136 state_keeper()->RegisterKey({ KEY_1 }, callback());
137 ASSERT_TRUE(last_callback_result());
138 ASSERT_FALSE(key_hook()->registered(KEY_1));
139 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
140
141 state_keeper()->Activate(callback());
142 ASSERT_TRUE(last_callback_result());
143 ASSERT_TRUE(key_hook()->registered(KEY_1));
144 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
145
146 ASSERT_EQ(key_hook()->register_counter(), 1);
147 ASSERT_EQ(key_hook()->unregister_counter(), 0);
148 }
149
150 TEST_F(KeyHookStateKeeperTest, RegisterAfterActivate) {
151 state_keeper()->Activate(callback());
152 ASSERT_TRUE(last_callback_result());
153 ASSERT_FALSE(key_hook()->registered(KEY_1));
154 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
155
156 state_keeper()->RegisterKey({ KEY_1 }, callback());
157 ASSERT_TRUE(last_callback_result());
158 ASSERT_TRUE(key_hook()->registered(KEY_1));
159 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
160
161 ASSERT_EQ(key_hook()->register_counter(), 1);
162 ASSERT_EQ(key_hook()->unregister_counter(), 0);
163 }
164
165 TEST_F(KeyHookStateKeeperTest, ActivateInTheMiddle) {
166 state_keeper()->RegisterKey({ KEY_1 }, callback());
167 ASSERT_TRUE(last_callback_result());
168 ASSERT_FALSE(key_hook()->registered(KEY_1));
169 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
170
171 state_keeper()->Activate(callback());
172 ASSERT_TRUE(last_callback_result());
173 ASSERT_TRUE(key_hook()->registered(KEY_1));
174 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
175
176 state_keeper()->RegisterKey({ KEY_2 }, callback());
177 ASSERT_TRUE(last_callback_result());
178 ASSERT_TRUE(key_hook()->registered(KEY_2));
179 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_2, 0));
180
181 ASSERT_EQ(key_hook()->register_counter(), 2);
182 ASSERT_EQ(key_hook()->unregister_counter(), 0);
183 }
184
185 TEST_F(KeyHookStateKeeperTest, ActivateTwiceWontTakeEffect) {
186 state_keeper()->RegisterKey({ KEY_1 }, callback());
187 ASSERT_TRUE(last_callback_result());
188 ASSERT_FALSE(key_hook()->registered(KEY_1));
189 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
190
191 state_keeper()->Activate(callback());
192 ASSERT_TRUE(last_callback_result());
193 ASSERT_TRUE(key_hook()->registered(KEY_1));
194 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
195
196 state_keeper()->Activate(callback());
197 ASSERT_TRUE(last_callback_result());
198 ASSERT_TRUE(key_hook()->registered(KEY_1));
199 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
200
201 ASSERT_EQ(key_hook()->register_counter(), 1);
202 ASSERT_EQ(key_hook()->unregister_counter(), 0);
203 }
204
205 TEST_F(KeyHookStateKeeperTest, DeactivateAfterActivate) {
206 state_keeper()->RegisterKey({ KEY_1 }, callback());
207 ASSERT_TRUE(last_callback_result());
208 ASSERT_FALSE(key_hook()->registered(KEY_1));
209 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
210
211 state_keeper()->Activate(callback());
212 ASSERT_TRUE(last_callback_result());
213 ASSERT_TRUE(key_hook()->registered(KEY_1));
214 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
215
216 state_keeper()->Deactivate(callback());
217 ASSERT_TRUE(last_callback_result());
218 ASSERT_FALSE(key_hook()->registered(KEY_1));
219 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
220
221 ASSERT_EQ(key_hook()->register_counter(), 1);
222 ASSERT_EQ(key_hook()->unregister_counter(), 1);
223 }
224
225 TEST_F(KeyHookStateKeeperTest, DeactivateTwiceWontTakeEffect) {
226 state_keeper()->RegisterKey({ KEY_1 }, callback());
227 ASSERT_TRUE(last_callback_result());
228 ASSERT_FALSE(key_hook()->registered(KEY_1));
229 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
230
231 ASSERT_EQ(key_hook()->register_counter(), 0);
232 ASSERT_EQ(key_hook()->unregister_counter(), 0);
233
234 state_keeper()->Activate(callback());
235 ASSERT_TRUE(last_callback_result());
236 ASSERT_TRUE(key_hook()->registered(KEY_1));
237 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
238
239 ASSERT_EQ(key_hook()->register_counter(), 1);
240 ASSERT_EQ(key_hook()->unregister_counter(), 0);
241
242 state_keeper()->Deactivate(callback());
243 ASSERT_TRUE(last_callback_result());
244 ASSERT_FALSE(key_hook()->registered(KEY_1));
245 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
246
247 ASSERT_EQ(key_hook()->register_counter(), 1);
248 ASSERT_EQ(key_hook()->unregister_counter(), 1);
249
250 state_keeper()->Deactivate(callback());
251 ASSERT_TRUE(last_callback_result());
252 ASSERT_FALSE(key_hook()->registered(KEY_1));
253 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
254
255 ASSERT_EQ(key_hook()->register_counter(), 1);
256 ASSERT_EQ(key_hook()->unregister_counter(), 1);
257 }
258
259 TEST_F(KeyHookStateKeeperTest, UnregisterAfterActivate) {
260 state_keeper()->RegisterKey({ KEY_1, KEY_2 }, callback());
261 ASSERT_TRUE(last_callback_result());
262 ASSERT_FALSE(key_hook()->registered(KEY_1));
263 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
264 ASSERT_FALSE(key_hook()->registered(KEY_2));
265 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
266
267 ASSERT_EQ(key_hook()->register_counter(), 0);
268 ASSERT_EQ(key_hook()->unregister_counter(), 0);
269
270 state_keeper()->Activate(callback());
271 ASSERT_TRUE(last_callback_result());
272 ASSERT_TRUE(key_hook()->registered(KEY_1));
273 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
274 ASSERT_TRUE(key_hook()->registered(KEY_2));
275 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_2, 0));
276
277 ASSERT_EQ(key_hook()->register_counter(), 1);
278 ASSERT_EQ(key_hook()->unregister_counter(), 0);
279
280 state_keeper()->UnregisterKey({ KEY_2 }, callback());
281 ASSERT_TRUE(last_callback_result());
282 ASSERT_TRUE(key_hook()->registered(KEY_1));
283 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
284 ASSERT_FALSE(key_hook()->registered(KEY_2));
285 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
286
287 ASSERT_EQ(key_hook()->register_counter(), 1);
288 ASSERT_EQ(key_hook()->unregister_counter(), 1);
289 }
290
291 TEST_F(KeyHookStateKeeperTest, RegisteredKeysWontBeRegisteredAgain) {
292 state_keeper()->Activate(callback());
293 ASSERT_TRUE(last_callback_result());
294
295 state_keeper()->RegisterKey({ KEY_1, KEY_2 }, callback());
296 ASSERT_TRUE(last_callback_result());
297 ASSERT_TRUE(key_hook()->registered(KEY_1));
298 ASSERT_TRUE(key_hook()->registered(KEY_2));
299
300 state_keeper()->RegisterKey({ KEY_1, KEY_2 }, callback());
301 ASSERT_TRUE(last_callback_result());
302 ASSERT_TRUE(key_hook()->registered(KEY_1));
303 ASSERT_TRUE(key_hook()->registered(KEY_2));
304
305 ASSERT_EQ(key_hook()->register_counter(), 1);
306 ASSERT_EQ(key_hook()->unregister_counter(), 0);
307
308 state_keeper()->UnregisterKey({ KEY_1, KEY_3 }, callback());
309 ASSERT_TRUE(last_callback_result());
310 ASSERT_FALSE(key_hook()->registered(KEY_1));
311 ASSERT_FALSE(key_hook()->registered(KEY_3));
312 ASSERT_TRUE(key_hook()->registered(KEY_2));
313
314 ASSERT_EQ(key_hook()->register_counter(), 1);
315 ASSERT_EQ(key_hook()->unregister_counter(), 1);
316
317 state_keeper()->UnregisterKey({ KEY_1, KEY_3 }, callback());
318 ASSERT_TRUE(last_callback_result());
319 ASSERT_FALSE(key_hook()->registered(KEY_1));
320 ASSERT_FALSE(key_hook()->registered(KEY_3));
321 ASSERT_TRUE(key_hook()->registered(KEY_2));
322
323 ASSERT_EQ(key_hook()->register_counter(), 1);
324 ASSERT_EQ(key_hook()->unregister_counter(), 1);
325
326 state_keeper()->UnregisterKey({ KEY_1, KEY_2 }, callback());
327 ASSERT_TRUE(last_callback_result());
328 ASSERT_FALSE(key_hook()->registered(KEY_1));
329 ASSERT_FALSE(key_hook()->registered(KEY_2));
330 ASSERT_FALSE(key_hook()->registered(KEY_3));
331
332 ASSERT_EQ(key_hook()->register_counter(), 1);
333 ASSERT_EQ(key_hook()->unregister_counter(), 2);
334 }
335
336 TEST_F(KeyHookStateKeeperTest, MoreCombinations) {
337 state_keeper()->RegisterKey({ KEY_1, KEY_2 }, callback());
338 ASSERT_TRUE(last_callback_result());
339 ASSERT_FALSE(key_hook()->registered(KEY_1));
340 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
341 ASSERT_FALSE(key_hook()->registered(KEY_2));
342 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
343
344 ASSERT_EQ(key_hook()->register_counter(), 0);
345 ASSERT_EQ(key_hook()->unregister_counter(), 0);
346
347 state_keeper()->Activate(callback());
348 ASSERT_TRUE(last_callback_result());
349 ASSERT_TRUE(key_hook()->registered(KEY_1));
350 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
351 ASSERT_TRUE(key_hook()->registered(KEY_2));
352 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_2, 0));
353
354 ASSERT_EQ(key_hook()->register_counter(), 1);
355 ASSERT_EQ(key_hook()->unregister_counter(), 0);
356
357 state_keeper()->UnregisterKey({ KEY_2 }, callback());
358 ASSERT_TRUE(last_callback_result());
359 ASSERT_TRUE(key_hook()->registered(KEY_1));
360 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
361 ASSERT_FALSE(key_hook()->registered(KEY_2));
362 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
363
364 ASSERT_EQ(key_hook()->register_counter(), 1);
365 ASSERT_EQ(key_hook()->unregister_counter(), 1);
366
367 state_keeper()->Deactivate(callback());
368 ASSERT_TRUE(last_callback_result());
369 ASSERT_FALSE(key_hook()->registered(KEY_1));
370 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
371 ASSERT_FALSE(key_hook()->registered(KEY_2));
372 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
373
374 ASSERT_EQ(key_hook()->register_counter(), 1);
375 ASSERT_EQ(key_hook()->unregister_counter(), 2);
376
377 state_keeper()->RegisterKey({ KEY_3 }, callback());
378 ASSERT_TRUE(last_callback_result());
379 ASSERT_FALSE(key_hook()->registered(KEY_1));
380 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
381 ASSERT_FALSE(key_hook()->registered(KEY_2));
382 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
383 ASSERT_FALSE(key_hook()->registered(KEY_3));
384 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_3, 0));
385
386 ASSERT_EQ(key_hook()->register_counter(), 1);
387 ASSERT_EQ(key_hook()->unregister_counter(), 2);
388
389 state_keeper()->Activate(callback());
390 ASSERT_TRUE(last_callback_result());
391 ASSERT_TRUE(key_hook()->registered(KEY_1));
392 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_1, 0));
393 ASSERT_FALSE(key_hook()->registered(KEY_2));
394 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
395 ASSERT_TRUE(key_hook()->registered(KEY_3));
396 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_3, 0));
397
398 ASSERT_EQ(key_hook()->register_counter(), 2);
399 ASSERT_EQ(key_hook()->unregister_counter(), 2);
400
401 state_keeper()->Deactivate(callback());
402 ASSERT_TRUE(last_callback_result());
403 ASSERT_FALSE(key_hook()->registered(KEY_1));
404 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
405 ASSERT_FALSE(key_hook()->registered(KEY_2));
406 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
407 ASSERT_FALSE(key_hook()->registered(KEY_3));
408 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_3, 0));
409
410 ASSERT_EQ(key_hook()->register_counter(), 2);
411 ASSERT_EQ(key_hook()->unregister_counter(), 3);
412
413 state_keeper()->UnregisterKey({ KEY_1 }, callback());
414 ASSERT_TRUE(last_callback_result());
415 ASSERT_FALSE(key_hook()->registered(KEY_1));
416 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
417 ASSERT_FALSE(key_hook()->registered(KEY_2));
418 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
419 ASSERT_FALSE(key_hook()->registered(KEY_3));
420 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_3, 0));
421
422 ASSERT_EQ(key_hook()->register_counter(), 2);
423 ASSERT_EQ(key_hook()->unregister_counter(), 3);
424
425 state_keeper()->Activate(callback());
426 ASSERT_TRUE(last_callback_result());
427 ASSERT_FALSE(key_hook()->registered(KEY_1));
428 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_1, 0));
429 ASSERT_FALSE(key_hook()->registered(KEY_2));
430 ASSERT_FALSE(state_keeper()->OnKeyDown(KEY_2, 0));
431 ASSERT_TRUE(key_hook()->registered(KEY_3));
432 ASSERT_TRUE(state_keeper()->OnKeyDown(KEY_3, 0));
433
434 ASSERT_EQ(key_hook()->register_counter(), 3);
435 ASSERT_EQ(key_hook()->unregister_counter(), 3);
436 }
437
438 } // namespace keyboard_lock
OLDNEW
« no previous file with comments | « components/keyboard_lock/key_hook_state_keeper.cc ('k') | components/keyboard_lock/key_hook_thread_wrapper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698