test_secure.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /* Copyright 2021 Stefan Kerkmann
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "gtest/gtest.h"
  17. #include "keyboard_report_util.hpp"
  18. #include "test_common.hpp"
  19. using testing::_;
  20. using testing::AnyNumber;
  21. using testing::InSequence;
  22. class Secure : public TestFixture {
  23. public:
  24. void SetUp() override {
  25. secure_lock();
  26. }
  27. // Convenience function to tap `key`.
  28. void TapKey(KeymapKey key) {
  29. key.press();
  30. run_one_scan_loop();
  31. key.release();
  32. run_one_scan_loop();
  33. }
  34. // Taps in order each key in `keys`.
  35. template <typename... Ts>
  36. void TapKeys(Ts... keys) {
  37. for (KeymapKey key : {keys...}) {
  38. TapKey(key);
  39. }
  40. }
  41. };
  42. TEST_F(Secure, test_lock) {
  43. TestDriver driver;
  44. // Allow any number of empty reports.
  45. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  46. EXPECT_FALSE(secure_is_unlocked());
  47. secure_unlock();
  48. EXPECT_TRUE(secure_is_unlocked());
  49. run_one_scan_loop();
  50. EXPECT_TRUE(secure_is_unlocked());
  51. secure_lock();
  52. EXPECT_FALSE(secure_is_unlocked());
  53. testing::Mock::VerifyAndClearExpectations(&driver);
  54. }
  55. TEST_F(Secure, test_unlock_timeout) {
  56. TestDriver driver;
  57. // Allow any number of empty reports.
  58. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  59. EXPECT_FALSE(secure_is_unlocked());
  60. secure_unlock();
  61. EXPECT_TRUE(secure_is_unlocked());
  62. idle_for(SECURE_IDLE_TIMEOUT + 1);
  63. EXPECT_FALSE(secure_is_unlocked());
  64. testing::Mock::VerifyAndClearExpectations(&driver);
  65. }
  66. TEST_F(Secure, test_unlock_request) {
  67. TestDriver driver;
  68. auto key_mo = KeymapKey(0, 0, 0, MO(1));
  69. auto key_a = KeymapKey(0, 1, 0, KC_A);
  70. auto key_b = KeymapKey(0, 2, 0, KC_B);
  71. auto key_c = KeymapKey(0, 3, 0, KC_C);
  72. auto key_d = KeymapKey(0, 4, 0, KC_D);
  73. set_keymap({key_mo, key_a, key_b, key_c, key_d});
  74. // Allow any number of empty reports.
  75. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  76. EXPECT_TRUE(secure_is_locked());
  77. secure_request_unlock();
  78. EXPECT_TRUE(secure_is_unlocking());
  79. TapKeys(key_a, key_b, key_c, key_d);
  80. EXPECT_TRUE(secure_is_unlocked());
  81. testing::Mock::VerifyAndClearExpectations(&driver);
  82. }
  83. TEST_F(Secure, test_unlock_request_fail) {
  84. TestDriver driver;
  85. auto key_e = KeymapKey(0, 0, 0, KC_E);
  86. auto key_a = KeymapKey(0, 1, 0, KC_A);
  87. auto key_b = KeymapKey(0, 2, 0, KC_B);
  88. auto key_c = KeymapKey(0, 3, 0, KC_C);
  89. auto key_d = KeymapKey(0, 4, 0, KC_D);
  90. set_keymap({key_e, key_a, key_b, key_c, key_d});
  91. // Allow any number of empty reports.
  92. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber());
  93. { // Expect the following reports in this order.
  94. InSequence s;
  95. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A)));
  96. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B)));
  97. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_C)));
  98. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_D)));
  99. }
  100. EXPECT_TRUE(secure_is_locked());
  101. secure_request_unlock();
  102. EXPECT_TRUE(secure_is_unlocking());
  103. TapKeys(key_e, key_a, key_b, key_c, key_d);
  104. EXPECT_FALSE(secure_is_unlocked());
  105. testing::Mock::VerifyAndClearExpectations(&driver);
  106. }
  107. TEST_F(Secure, test_unlock_request_timeout) {
  108. TestDriver driver;
  109. // Allow any number of empty reports.
  110. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  111. EXPECT_FALSE(secure_is_unlocked());
  112. secure_request_unlock();
  113. EXPECT_TRUE(secure_is_unlocking());
  114. idle_for(SECURE_UNLOCK_TIMEOUT + 1);
  115. EXPECT_FALSE(secure_is_unlocking());
  116. EXPECT_FALSE(secure_is_unlocked());
  117. testing::Mock::VerifyAndClearExpectations(&driver);
  118. }
  119. TEST_F(Secure, test_unlock_request_fail_mid) {
  120. TestDriver driver;
  121. auto key_e = KeymapKey(0, 0, 0, KC_E);
  122. auto key_a = KeymapKey(0, 1, 0, KC_A);
  123. auto key_b = KeymapKey(0, 2, 0, KC_B);
  124. auto key_c = KeymapKey(0, 3, 0, KC_C);
  125. auto key_d = KeymapKey(0, 4, 0, KC_D);
  126. set_keymap({key_e, key_a, key_b, key_c, key_d});
  127. // Allow any number of empty reports.
  128. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber());
  129. { // Expect the following reports in this order.
  130. InSequence s;
  131. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_C)));
  132. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_D)));
  133. }
  134. EXPECT_FALSE(secure_is_unlocked());
  135. secure_request_unlock();
  136. EXPECT_TRUE(secure_is_unlocking());
  137. TapKeys(key_a, key_b, key_e, key_c, key_d);
  138. EXPECT_FALSE(secure_is_unlocking());
  139. EXPECT_FALSE(secure_is_unlocked());
  140. testing::Mock::VerifyAndClearExpectations(&driver);
  141. }
  142. TEST_F(Secure, test_unlock_request_fail_out_of_order) {
  143. TestDriver driver;
  144. auto key_e = KeymapKey(0, 0, 0, KC_E);
  145. auto key_a = KeymapKey(0, 1, 0, KC_A);
  146. auto key_b = KeymapKey(0, 2, 0, KC_B);
  147. auto key_c = KeymapKey(0, 3, 0, KC_C);
  148. auto key_d = KeymapKey(0, 4, 0, KC_D);
  149. set_keymap({key_e, key_a, key_b, key_c, key_d});
  150. // Allow any number of empty reports.
  151. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(AnyNumber());
  152. { // Expect the following reports in this order.
  153. InSequence s;
  154. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B)));
  155. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_C)));
  156. }
  157. EXPECT_FALSE(secure_is_unlocked());
  158. secure_request_unlock();
  159. EXPECT_TRUE(secure_is_unlocking());
  160. TapKeys(key_a, key_d, key_b, key_c);
  161. EXPECT_TRUE(secure_is_locked());
  162. EXPECT_FALSE(secure_is_unlocking());
  163. EXPECT_FALSE(secure_is_unlocked());
  164. testing::Mock::VerifyAndClearExpectations(&driver);
  165. }
  166. TEST_F(Secure, test_unlock_request_on_layer) {
  167. TestDriver driver;
  168. auto key_mo = KeymapKey(0, 0, 0, MO(1));
  169. auto key_a = KeymapKey(0, 1, 0, KC_A);
  170. auto key_b = KeymapKey(0, 2, 0, KC_B);
  171. auto key_c = KeymapKey(0, 3, 0, KC_C);
  172. auto key_d = KeymapKey(0, 4, 0, KC_D);
  173. set_keymap({key_mo, key_a, key_b, key_c, key_d});
  174. // Allow any number of empty reports.
  175. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
  176. EXPECT_TRUE(secure_is_locked());
  177. key_mo.press();
  178. run_one_scan_loop();
  179. secure_request_unlock();
  180. key_mo.release();
  181. run_one_scan_loop();
  182. EXPECT_TRUE(secure_is_unlocking());
  183. TapKeys(key_a, key_b, key_c, key_d);
  184. EXPECT_TRUE(secure_is_unlocked());
  185. EXPECT_FALSE(layer_state_is(1));
  186. testing::Mock::VerifyAndClearExpectations(&driver);
  187. }
  188. TEST_F(Secure, test_unlock_request_mid_stroke) {
  189. TestDriver driver;
  190. auto key_e = KeymapKey(0, 0, 0, KC_E);
  191. auto key_a = KeymapKey(0, 1, 0, KC_A);
  192. auto key_b = KeymapKey(0, 2, 0, KC_B);
  193. auto key_c = KeymapKey(0, 3, 0, KC_C);
  194. auto key_d = KeymapKey(0, 4, 0, KC_D);
  195. set_keymap({key_e, key_a, key_b, key_c, key_d});
  196. // Allow any number of empty reports.
  197. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_E)));
  198. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
  199. EXPECT_TRUE(secure_is_locked());
  200. key_e.press();
  201. run_one_scan_loop();
  202. secure_request_unlock();
  203. key_e.release();
  204. run_one_scan_loop();
  205. EXPECT_TRUE(secure_is_unlocking());
  206. TapKeys(key_a, key_b, key_c, key_d);
  207. EXPECT_TRUE(secure_is_unlocked());
  208. testing::Mock::VerifyAndClearExpectations(&driver);
  209. }
  210. TEST_F(Secure, test_unlock_request_mods) {
  211. TestDriver driver;
  212. auto key_lsft = KeymapKey(0, 0, 0, KC_LSFT);
  213. auto key_a = KeymapKey(0, 1, 0, KC_A);
  214. auto key_b = KeymapKey(0, 2, 0, KC_B);
  215. auto key_c = KeymapKey(0, 3, 0, KC_C);
  216. auto key_d = KeymapKey(0, 4, 0, KC_D);
  217. set_keymap({key_lsft, key_a, key_b, key_c, key_d});
  218. // Allow any number of empty reports.
  219. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(key_lsft.report_code)));
  220. EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
  221. EXPECT_TRUE(secure_is_locked());
  222. key_lsft.press();
  223. run_one_scan_loop();
  224. secure_request_unlock();
  225. key_lsft.release();
  226. run_one_scan_loop();
  227. EXPECT_TRUE(secure_is_unlocking());
  228. TapKeys(key_a, key_b, key_c, key_d);
  229. EXPECT_TRUE(secure_is_unlocked());
  230. testing::Mock::VerifyAndClearExpectations(&driver);
  231. }