os_detection.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* Copyright 2022 Ruslan Sayfutdinov (@KapJI)
  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. extern "C" {
  18. #include "os_detection.h"
  19. }
  20. class OsDetectionTest : public ::testing::Test {
  21. protected:
  22. void SetUp() override {
  23. erase_wlength_data();
  24. }
  25. };
  26. os_variant_t check_sequence(const std::vector<uint16_t> &w_lengths) {
  27. for (auto &w_length : w_lengths) {
  28. process_wlength(w_length);
  29. }
  30. return detected_host_os();
  31. }
  32. /* Some collected data.
  33. ChibiOS:
  34. Windows 10: [FF, FF, 4, 24, 4, 24, 4, FF, 24, FF, 4, FF, 24, 4, 24, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A, 20A]
  35. Windows 10 (another host): [FF, FF, 4, 24, 4, 24, 4, 24, 4, 24, 4, 24]
  36. macOS 12.5: [2, 24, 2, 28, FF]
  37. iOS/iPadOS 15.6: [2, 24, 2, 28]
  38. Linux (including Android, Raspberry Pi and WebOS TV): [FF, FF, FF]
  39. PS5: [2, 4, 2, 28, 2, 24]
  40. Nintendo Switch: [82, FF, 40, 40, FF, 40, 40, FF, 40, 40, FF, 40, 40, FF, 40, 40]
  41. Quest 2: [FF, FF, FF, FE, FF, FE, FF, FE, FF, FE, FF]
  42. LUFA:
  43. Windows 10 (first connect): [12, FF, FF, 4, 10, FF, FF, FF, 4, 10, 20A, 20A, 20A, 20A, 20A, 20A]
  44. Windows 10 (subsequent connect): [FF, FF, 4, 10, FF, 4, FF, 10, FF, 20A, 20A, 20A, 20A, 20A, 20A]
  45. Windows 10 (another host): [FF, FF, 4, 10, 4, 10]
  46. macOS: [2, 10, 2, E, FF]
  47. iOS/iPadOS: [2, 10, 2, E]
  48. Linux: [FF, FF, FF]
  49. PS5: [2, 4, 2, E, 2, 10]
  50. Nintendo Switch: [82, FF, 40, 40, FF, 40, 40]
  51. V-USB:
  52. Windows 10: [FF, FF, 4, E, FF]
  53. Windows 10 (another host): [FF, FF, 4, E, 4]
  54. macOS: [2, E, 2, E, FF]
  55. iOS/iPadOS: [2, E, 2, E]
  56. Linux: [FF, FF, FF]
  57. PS5: [2, 4, 2, E, 2]
  58. Nintendo Switch: [82, FF, 40, 40]
  59. Quest 2: [FF, FF, FF, FE]
  60. Common parts:
  61. Windows: [..., FF, FF, 4, ...]
  62. macOS: [2, _, 2, _, FF]
  63. iOS/iPadOS: [2, _, 2, _]
  64. Linux: [FF, FF, FF]
  65. PS5: [2, 4, 2, _, 2, ...]
  66. Nintendo Switch: [82, FF, 40, 40, ...]
  67. Quest 2: [FF, FF, FF, FE, ...]
  68. */
  69. TEST_F(OsDetectionTest, TestLinux) {
  70. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF}), OS_LINUX);
  71. }
  72. TEST_F(OsDetectionTest, TestChibiosMacos) {
  73. EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28, 0xFF}), OS_MACOS);
  74. }
  75. TEST_F(OsDetectionTest, TestLufaMacos) {
  76. EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE, 0xFF}), OS_MACOS);
  77. }
  78. TEST_F(OsDetectionTest, TestVusbMacos) {
  79. EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE, 0xFF}), OS_MACOS);
  80. }
  81. TEST_F(OsDetectionTest, TestChibiosIos) {
  82. EXPECT_EQ(check_sequence({0x2, 0x24, 0x2, 0x28}), OS_IOS);
  83. }
  84. TEST_F(OsDetectionTest, TestLufaIos) {
  85. EXPECT_EQ(check_sequence({0x2, 0x10, 0x2, 0xE}), OS_IOS);
  86. }
  87. TEST_F(OsDetectionTest, TestVusbIos) {
  88. EXPECT_EQ(check_sequence({0x2, 0xE, 0x2, 0xE}), OS_IOS);
  89. }
  90. TEST_F(OsDetectionTest, TestChibiosWindows10) {
  91. 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);
  92. }
  93. TEST_F(OsDetectionTest, TestChibiosWindows10_2) {
  94. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24, 0x4, 0x24}), OS_WINDOWS);
  95. }
  96. TEST_F(OsDetectionTest, TestLufaWindows10) {
  97. EXPECT_EQ(check_sequence({0x12, 0xFF, 0xFF, 0x4, 0x10, 0xFF, 0xFF, 0xFF, 0x4, 0x10, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
  98. }
  99. TEST_F(OsDetectionTest, TestLufaWindows10_2) {
  100. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x10, 0xFF, 0x4, 0xFF, 0x10, 0xFF, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A, 0x20A}), OS_WINDOWS);
  101. }
  102. TEST_F(OsDetectionTest, TestLufaWindows10_3) {
  103. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0x10, 0x4, 0x10}), OS_WINDOWS);
  104. }
  105. TEST_F(OsDetectionTest, TestVusbWindows10) {
  106. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0xE, 0xFF}), OS_WINDOWS);
  107. }
  108. TEST_F(OsDetectionTest, TestVusbWindows10_2) {
  109. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0x4, 0xE, 0x4}), OS_WINDOWS);
  110. }
  111. TEST_F(OsDetectionTest, TestChibiosPs5) {
  112. EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0x28, 0x2, 0x24}), OS_LINUX);
  113. }
  114. TEST_F(OsDetectionTest, TestLufaPs5) {
  115. EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2, 0x10}), OS_LINUX);
  116. }
  117. TEST_F(OsDetectionTest, TestVusbPs5) {
  118. EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2}), OS_LINUX);
  119. }
  120. TEST_F(OsDetectionTest, TestChibiosNintendoSwitch) {
  121. EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX);
  122. }
  123. TEST_F(OsDetectionTest, TestLufaNintendoSwitch) {
  124. EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX);
  125. }
  126. TEST_F(OsDetectionTest, TestVusbNintendoSwitch) {
  127. EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40}), OS_LINUX);
  128. }
  129. TEST_F(OsDetectionTest, TestChibiosQuest2) {
  130. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF}), OS_LINUX);
  131. }
  132. TEST_F(OsDetectionTest, TestVusbQuest2) {
  133. EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX);
  134. }