summaryrefslogtreecommitdiff
path: root/quantum/os_detection/tests/os_detection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/os_detection/tests/os_detection.cpp')
-rw-r--r--quantum/os_detection/tests/os_detection.cpp229
1 files changed, 229 insertions, 0 deletions
diff --git a/quantum/os_detection/tests/os_detection.cpp b/quantum/os_detection/tests/os_detection.cpp
index 102349852e..11e93fdea8 100644
--- a/quantum/os_detection/tests/os_detection.cpp
+++ b/quantum/os_detection/tests/os_detection.cpp
@@ -18,12 +18,20 @@
18 18
19extern "C" { 19extern "C" {
20#include "os_detection.h" 20#include "os_detection.h"
21#include "timer.h"
22
23void advance_time(uint32_t ms);
21} 24}
22 25
26static uint32_t reported_count;
27static os_variant_t reported_os;
28
23class OsDetectionTest : public ::testing::Test { 29class OsDetectionTest : public ::testing::Test {
24 protected: 30 protected:
25 void SetUp() override { 31 void SetUp() override {
26 erase_wlength_data(); 32 erase_wlength_data();
33 reported_count = 0;
34 reported_os = OS_UNSURE;
27 } 35 }
28}; 36};
29 37
@@ -34,6 +42,24 @@ os_variant_t check_sequence(const std::vector<uint16_t> &w_lengths) {
34 return detected_host_os(); 42 return detected_host_os();
35} 43}
36 44
45bool process_detected_host_os_kb(os_variant_t os) {
46 reported_count = reported_count + 1;
47 reported_os = os;
48}
49
50void assert_not_reported(void) {
51 // check that it does not report the result, nor any intermediate results
52 EXPECT_EQ(reported_count, 0);
53 EXPECT_EQ(reported_os, OS_UNSURE);
54}
55
56void assert_reported(os_variant_t os) {
57 // check that it reports exclusively the result, not any intermediate results
58 EXPECT_EQ(reported_count, 1);
59 EXPECT_EQ(reported_os, os);
60 EXPECT_EQ(reported_os, detected_host_os());
61}
62
37/* Some collected data. 63/* Some collected data.
38 64
39ChibiOS: 65ChibiOS:
@@ -77,88 +103,291 @@ Quest 2: [FF, FF, FF, FE, ...]
77*/ 103*/
78TEST_F(OsDetectionTest, TestLinux) { 104TEST_F(OsDetectionTest, TestLinux) {
79 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF}), OS_LINUX); 105 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF}), OS_LINUX);
106 os_detection_task();
107 assert_not_reported();
80} 108}
81 109
82TEST_F(OsDetectionTest, TestChibiosMacos) { 110TEST_F(OsDetectionTest, TestChibiosMacos) {
83 EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28, 0xFF}), OS_MACOS); 111 EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28, 0xFF}), OS_MACOS);
112 os_detection_task();
113 assert_not_reported();
84} 114}
85 115
86TEST_F(OsDetectionTest, TestLufaMacos) { 116TEST_F(OsDetectionTest, TestLufaMacos) {
87 EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE, 0xFF}), OS_MACOS); 117 EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE, 0xFF}), OS_MACOS);
118 os_detection_task();
119 assert_not_reported();
88} 120}
89 121
90TEST_F(OsDetectionTest, TestVusbMacos) { 122TEST_F(OsDetectionTest, TestVusbMacos) {
91 EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE, 0xFF}), OS_MACOS); 123 EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE, 0xFF}), OS_MACOS);
124 os_detection_task();
125 assert_not_reported();
92} 126}
93 127
94TEST_F(OsDetectionTest, TestChibiosIos) { 128TEST_F(OsDetectionTest, TestChibiosIos) {
95 EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28}), OS_IOS); 129 EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28}), OS_IOS);
130 os_detection_task();
131 assert_not_reported();
96} 132}
97 133
98TEST_F(OsDetectionTest, TestLufaIos) { 134TEST_F(OsDetectionTest, TestLufaIos) {
99 EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE}), OS_IOS); 135 EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE}), OS_IOS);
136 os_detection_task();
137 assert_not_reported();
100} 138}
101 139
102TEST_F(OsDetectionTest, TestVusbIos) { 140TEST_F(OsDetectionTest, TestVusbIos) {
103 EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE}), OS_IOS); 141 EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE}), OS_IOS);
142 os_detection_task();
143 assert_not_reported();
104} 144}
105 145
106TEST_F(OsDetectionTest, TestChibiosWindows10) { 146TEST_F(OsDetectionTest, TestChibiosWindows10) {
107 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x24, 0x4, 0x24, 0x4, 0xFF, 0x24, 0xFF, 0x4, 0xFF, 0x24, 0x4, 0x24, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS); 147 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x24, 0x4, 0x24, 0x4, 0xFF, 0x24, 0xFF, 0x4, 0xFF, 0x24, 0x4, 0x24, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
148 os_detection_task();
149 assert_not_reported();
108} 150}
109 151
110TEST_F(OsDetectionTest, TestChibiosWindows10_2) { 152TEST_F(OsDetectionTest, TestChibiosWindows10_2) {
111 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24}), OS_WINDOWS); 153 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24}), OS_WINDOWS);
154 os_detection_task();
155 assert_not_reported();
112} 156}
113 157
114TEST_F(OsDetectionTest, TestLufaWindows10) { 158TEST_F(OsDetectionTest, TestLufaWindows10) {
115 EXPECT_EQ(check_sequence({0x12, 0xFF, 0xFF, 0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS); 159 EXPECT_EQ(check_sequence({0x12, 0xFF, 0xFF, 0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
160 os_detection_task();
161 assert_not_reported();
116} 162}
117 163
118TEST_F(OsDetectionTest, TestLufaWindows10_2) { 164TEST_F(OsDetectionTest, TestLufaWindows10_2) {
119 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x10, 0xFF, 0x4, 0xFF, 0x10, 0xFF, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS); 165 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x10, 0xFF, 0x4, 0xFF, 0x10, 0xFF, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
166 os_detection_task();
167 assert_not_reported();
120} 168}
121 169
122TEST_F(OsDetectionTest, TestLufaWindows10_3) { 170TEST_F(OsDetectionTest, TestLufaWindows10_3) {
123 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x10, 0x4, 0x10}), OS_WINDOWS); 171 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x10, 0x4, 0x10}), OS_WINDOWS);
172 os_detection_task();
173 assert_not_reported();
124} 174}
125 175
126TEST_F(OsDetectionTest, TestVusbWindows10) { 176TEST_F(OsDetectionTest, TestVusbWindows10) {
127 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0xE, 0xFF}), OS_WINDOWS); 177 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0xE, 0xFF}), OS_WINDOWS);
178 os_detection_task();
179 assert_not_reported();
128} 180}
129 181
130TEST_F(OsDetectionTest, TestVusbWindows10_2) { 182TEST_F(OsDetectionTest, TestVusbWindows10_2) {
131 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0xE, 0x4}), OS_WINDOWS); 183 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0xE, 0x4}), OS_WINDOWS);
184 os_detection_task();
185 assert_not_reported();
132} 186}
133 187
134TEST_F(OsDetectionTest, TestChibiosPs5) { 188TEST_F(OsDetectionTest, TestChibiosPs5) {
135 EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0x28, 0x2, 0x24}), OS_LINUX); 189 EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0x28, 0x2, 0x24}), OS_LINUX);
190 os_detection_task();
191 assert_not_reported();
136} 192}
137 193
138TEST_F(OsDetectionTest, TestLufaPs5) { 194TEST_F(OsDetectionTest, TestLufaPs5) {
139 EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2, 0x10}), OS_LINUX); 195 EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2, 0x10}), OS_LINUX);
196 os_detection_task();
197 assert_not_reported();
140} 198}
141 199
142TEST_F(OsDetectionTest, TestVusbPs5) { 200TEST_F(OsDetectionTest, TestVusbPs5) {
143 EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2}), OS_LINUX); 201 EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2}), OS_LINUX);
202 os_detection_task();
203 assert_not_reported();
144} 204}
145 205
146TEST_F(OsDetectionTest, TestChibiosNintendoSwitch) { 206TEST_F(OsDetectionTest, TestChibiosNintendoSwitch) {
147 EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX); 207 EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX);
208 os_detection_task();
209 assert_not_reported();
148} 210}
149 211
150TEST_F(OsDetectionTest, TestLufaNintendoSwitch) { 212TEST_F(OsDetectionTest, TestLufaNintendoSwitch) {
151 EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX); 213 EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX);
214 os_detection_task();
215 assert_not_reported();
152} 216}
153 217
154TEST_F(OsDetectionTest, TestVusbNintendoSwitch) { 218TEST_F(OsDetectionTest, TestVusbNintendoSwitch) {
155 EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40}), OS_LINUX); 219 EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40}), OS_LINUX);
220 os_detection_task();
221 assert_not_reported();
156} 222}
157 223
158TEST_F(OsDetectionTest, TestChibiosQuest2) { 224TEST_F(OsDetectionTest, TestChibiosQuest2) {
159 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF}), OS_LINUX); 225 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF}), OS_LINUX);
226 os_detection_task();
227 assert_not_reported();
160} 228}
161 229
162TEST_F(OsDetectionTest, TestVusbQuest2) { 230TEST_F(OsDetectionTest, TestVusbQuest2) {
163 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX); 231 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX);
232 os_detection_task();
233 assert_not_reported();
234}
235
236// Regression reported in https://github.com/qmk/qmk_firmware/pull/21777#issuecomment-1922815841
237TEST_F(OsDetectionTest, TestDetectMacM1AsIOS) {
238 EXPECT_EQ(check_sequence({0x02, 0x32, 0x02, 0x24, 0x101, 0xFF}), OS_IOS);
239 os_detection_task();
240 assert_not_reported();
241}
242
243TEST_F(OsDetectionTest, TestDoNotReportIfUsbUnstable) {
244 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX);
245 os_detection_task();
246 assert_not_reported();
247
248 advance_time(OS_DETECTION_DEBOUNCE);
249 os_detection_task();
250 assert_not_reported();
251 EXPECT_EQ(detected_host_os(), OS_LINUX);
252}
253
254TEST_F(OsDetectionTest, TestReportAfterDebounce) {
255 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX);
256 os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
257 os_detection_task();
258 assert_not_reported();
259
260 advance_time(1);
261 os_detection_task();
262 assert_not_reported();
263 EXPECT_EQ(detected_host_os(), OS_LINUX);
264
265 advance_time(OS_DETECTION_DEBOUNCE - 3);
266 os_detection_task();
267 assert_not_reported();
268 EXPECT_EQ(detected_host_os(), OS_LINUX);
269
270 advance_time(1);
271 os_detection_task();
272 assert_not_reported();
273 EXPECT_EQ(detected_host_os(), OS_LINUX);
274
275 // advancing the timer alone must not cause a report
276 advance_time(1);
277 assert_not_reported();
278 EXPECT_EQ(detected_host_os(), OS_LINUX);
279 // the task will cause a report
280 os_detection_task();
281 assert_reported(OS_LINUX);
282 EXPECT_EQ(detected_host_os(), OS_LINUX);
283
284 // check that it remains the same after a long time
285 advance_time(OS_DETECTION_DEBOUNCE * 15);
286 assert_reported(OS_LINUX);
287 EXPECT_EQ(detected_host_os(), OS_LINUX);
288}
289
290TEST_F(OsDetectionTest, TestReportAfterDebounceLongWait) {
291 EXPECT_EQ(check_sequence({0x12, 0xFF, 0xFF, 0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
292 os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
293 os_detection_task();
294 assert_not_reported();
295
296 advance_time(1);
297 os_detection_task();
298 assert_not_reported();
299 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
300
301 // advancing the timer alone must not cause a report
302 advance_time(OS_DETECTION_DEBOUNCE * 15);
303 assert_not_reported();
304 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
305 // the task will cause a report
306 os_detection_task();
307 assert_reported(OS_WINDOWS);
308 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
309
310 // check that it remains the same after a long time
311 advance_time(OS_DETECTION_DEBOUNCE * 10);
312 os_detection_task();
313 assert_reported(OS_WINDOWS);
314 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
315}
316
317TEST_F(OsDetectionTest, TestReportUnsure) {
318 EXPECT_EQ(check_sequence({0x12, 0xFF}), OS_UNSURE);
319 os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
320 os_detection_task();
321 assert_not_reported();
322
323 advance_time(1);
324 os_detection_task();
325 assert_not_reported();
326 EXPECT_EQ(detected_host_os(), OS_UNSURE);
327
328 // advancing the timer alone must not cause a report
329 advance_time(OS_DETECTION_DEBOUNCE - 1);
330 assert_not_reported();
331 EXPECT_EQ(detected_host_os(), OS_UNSURE);
332 // the task will cause a report
333 os_detection_task();
334 assert_reported(OS_UNSURE);
335 EXPECT_EQ(detected_host_os(), OS_UNSURE);
336
337 // check that it remains the same after a long time
338 advance_time(OS_DETECTION_DEBOUNCE * 10);
339 os_detection_task();
340 assert_reported(OS_UNSURE);
341 EXPECT_EQ(detected_host_os(), OS_UNSURE);
342}
343
344TEST_F(OsDetectionTest, TestDoNotReportIntermediateResults) {
345 EXPECT_EQ(check_sequence({0x12, 0xFF}), OS_UNSURE);
346 os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
347 os_detection_task();
348 assert_not_reported();
349
350 advance_time(OS_DETECTION_DEBOUNCE - 1);
351 os_detection_task();
352 assert_not_reported();
353 EXPECT_EQ(detected_host_os(), OS_UNSURE);
354
355 // at this stage, the final result has not been reached yet
356 EXPECT_EQ(check_sequence({0xFF}), OS_LINUX);
357 os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
358 advance_time(OS_DETECTION_DEBOUNCE - 1);
359 os_detection_task();
360 assert_not_reported();
361 // the intermedite but yet unstable result is exposed through detected_host_os()
362 EXPECT_EQ(detected_host_os(), OS_LINUX);
363
364 // the remainder is processed
365 EXPECT_EQ(check_sequence({0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
366 os_detection_notify_usb_device_state_change(USB_DEVICE_STATE_CONFIGURED);
367 advance_time(OS_DETECTION_DEBOUNCE - 1);
368 os_detection_task();
369 assert_not_reported();
370 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
371
372 // advancing the timer alone must not cause a report
373 advance_time(1);
374 assert_not_reported();
375 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
376 // the task will cause a report
377 os_detection_task();
378 assert_reported(OS_WINDOWS);
379 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
380
381 // check that it remains the same after a long time
382 advance_time(OS_DETECTION_DEBOUNCE * 10);
383 os_detection_task();
384 assert_reported(OS_WINDOWS);
385 EXPECT_EQ(detected_host_os(), OS_WINDOWS);
386}
387
388TEST_F(OsDetectionTest, TestDoNotGoBackToUnsure) {
389 // 0x02 would cause it to go back to Unsure, so check that it does not
390 EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0x02}), OS_LINUX);
391 os_detection_task();
392 assert_not_reported();
164} 393}