test_parsers.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. # test_parsers.py/Open GoPro, Version 2.0 (C) Copyright 2021 GoPro, Inc. (http://gopro.com/OpenGoPro).
  2. # This copyright was auto-generated on Mon Jul 31 17:04:06 UTC 2023
  3. import pytest
  4. from open_gopro.api.ble_commands import BleCommands
  5. from open_gopro.domain.communicator_interface import GoProBle
  6. from open_gopro.domain.parser_interface import GlobalParsers, Parser
  7. from open_gopro.models.constants import CmdId
  8. from open_gopro.models.network_scan_responses import (
  9. GoProAdvData,
  10. adv_data_struct,
  11. manuf_data_struct,
  12. scan_response_struct,
  13. )
  14. from open_gopro.models.proto import EnumResultGeneric, ResponseGetApEntries
  15. from open_gopro.parsers.bytes import BytesParserBuilder, ProtobufByteParser
  16. def test_version_response(mock_ble_communicator: GoProBle):
  17. BleCommands(mock_ble_communicator)
  18. parser = GlobalParsers.get_parser(CmdId.GET_THIRD_PARTY_API_VERSION)
  19. builder = parser.byte_json_adapter.build
  20. raw_bytes = builder({"major": 1, "minor": 2})
  21. assert parser.parse(raw_bytes) == "1.2"
  22. def test_recursive_protobuf_proxying():
  23. scan1 = ResponseGetApEntries.ScanEntry(
  24. ssid="one", signal_strength_bars=0, signal_frequency_mhz=0, scan_entry_flags=0
  25. )
  26. scan2 = ResponseGetApEntries.ScanEntry(
  27. ssid="two", signal_strength_bars=0, signal_frequency_mhz=0, scan_entry_flags=0
  28. )
  29. response = ResponseGetApEntries(result=EnumResultGeneric.RESULT_SUCCESS, scan_id=1, entries=[scan1, scan2])
  30. raw = response.SerializeToString()
  31. parser = Parser[ResponseGetApEntries](byte_json_adapter=ProtobufByteParser(ResponseGetApEntries))
  32. parsed = parser.parse(raw)
  33. assert len(parsed.entries) == 2
  34. assert parsed.entries[0].ssid == "one"
  35. assert parsed.entries[1].ssid == "two"
  36. def test_ble_advertisement_parsing():
  37. # GIVEN
  38. adv_data = bytes(
  39. [
  40. 0x02,
  41. 0x01,
  42. 0x02,
  43. 0x03,
  44. 0x02,
  45. 0xA6,
  46. 0xFE,
  47. 0x0F,
  48. 0xFF,
  49. 0xF2,
  50. 0x02,
  51. 0x02,
  52. 0x01,
  53. 0x38,
  54. 0x33,
  55. 0x00,
  56. 0xB3,
  57. 0xFE,
  58. 0x2A,
  59. 0x79,
  60. 0xDC,
  61. 0xEB,
  62. 0x0F,
  63. ]
  64. )
  65. # WHEN
  66. adv = adv_data_struct.parse(adv_data)
  67. manuf_data = adv.manuf_data
  68. camera_status = manuf_data.camera_status
  69. camera_capabilities = manuf_data.camera_capabilities
  70. media_offload_status = manuf_data.media_offload_status
  71. # THEN
  72. assert adv.flags == 0x0102
  73. assert adv.uuids == 0xFEA6
  74. assert adv.manuf_type == 0xFF
  75. assert adv.company_id == 0xF202
  76. assert manuf_data.schema_version == 2
  77. assert manuf_data.camera_id == 56
  78. assert manuf_data.id_hash.hex(":") == "b3:fe:2a:79:dc:eb"
  79. assert camera_status.processor_state == False
  80. assert camera_status.wifi_ap_state == False
  81. assert camera_status.peripheral_pairing_state == False
  82. assert camera_status.central_role_enabled == False
  83. assert camera_status.is_new_media_available == False
  84. assert camera_capabilities.cnc == False
  85. assert camera_capabilities.ble_metadata == False
  86. assert camera_capabilities.wideband_audio == True
  87. assert camera_capabilities.concurrent_master_slave == True
  88. assert camera_capabilities.onboarding == False
  89. assert camera_capabilities.new_media_available == False
  90. assert media_offload_status.available == False
  91. assert media_offload_status.new_media_available == False
  92. assert media_offload_status.battery_ok == False
  93. assert media_offload_status.sd_card_ok == False
  94. assert media_offload_status.busy == True
  95. assert media_offload_status.paused == True
  96. def test_ble_scan_response_parsing():
  97. # GIVEN
  98. scan_response_data = bytes(
  99. [
  100. 0x0B,
  101. 0x09,
  102. 0x47,
  103. 0x6F,
  104. 0x50,
  105. 0x72,
  106. 0x6F,
  107. 0x20,
  108. 0x31,
  109. 0x30,
  110. 0x35,
  111. 0x38,
  112. 0x0B,
  113. 0x16,
  114. 0xA6,
  115. 0xFE,
  116. 0xF7,
  117. 0xA9,
  118. 0x76,
  119. 0x88,
  120. 0x31,
  121. 0x30,
  122. 0x35,
  123. 0x38,
  124. ]
  125. )
  126. # WHEN
  127. scan_response = scan_response_struct.parse(scan_response_data)
  128. # THEN
  129. assert scan_response.name == "GoPro 1058"
  130. assert scan_response.service_type == 0x16
  131. assert scan_response.service_uuid == 0xFEA6
  132. assert scan_response.service_data.ap_mac_address == "f7:a9:76:88"
  133. assert scan_response.service_data.serial_number == "1058"
  134. @pytest.fixture(scope="module")
  135. def mock_gopro_adv_data() -> GoProAdvData:
  136. return GoProAdvData(
  137. name="name",
  138. schema_version=2,
  139. processor_state=True,
  140. wifi_ap_state=True,
  141. peripheral_pairing_state=True,
  142. is_new_media_available=True,
  143. camera_id=0,
  144. supports_cnc=False,
  145. supports_ble_metadata=False,
  146. supports_wideband_audio=False,
  147. supports_concurrent_master_slave=False,
  148. supports_onboarding=False,
  149. supports_new_media_available=False,
  150. id_hash=bytes(6),
  151. is_media_upload_available=False,
  152. is_media_upload_battery_ok=False,
  153. is_media_upload_busy=False,
  154. is_media_upload_new_media_available=False,
  155. is_media_upload_paused=False,
  156. is_media_upload_sd_card_ok=False,
  157. ap_mac_address=bytes(6),
  158. partial_serial_number="AAAA",
  159. )
  160. def test_serial_number_complete_success(mock_gopro_adv_data: GoProAdvData):
  161. # GIVEN
  162. mock_gopro_adv_data.camera_id = 64
  163. mock_gopro_adv_data.id_hash = bytes([0x30, 0x31, 0x32, 0x33, 0x34, 0x35])
  164. mock_gopro_adv_data.partial_serial_number = "6789"
  165. # WHEN
  166. serial_number = mock_gopro_adv_data.serial_number
  167. # THEN
  168. assert serial_number == "C3520123456789"
  169. def test_serial_number_id_hash_not_middle_6(mock_gopro_adv_data: GoProAdvData):
  170. # GIVEN
  171. mock_gopro_adv_data.camera_id = 64
  172. mock_gopro_adv_data.id_hash = bytes(6 * [0x9A])
  173. mock_gopro_adv_data.partial_serial_number = "6789"
  174. # WHEN
  175. serial_number = mock_gopro_adv_data.serial_number
  176. # THEN
  177. assert serial_number == "C352XXXXXX6789"
  178. def test_serial_number_invalid_model_id(mock_gopro_adv_data: GoProAdvData):
  179. # GIVEN
  180. mock_gopro_adv_data.camera_id = -1
  181. mock_gopro_adv_data.id_hash = bytes([0x30, 0x31, 0x32, 0x33, 0x34, 0x35])
  182. mock_gopro_adv_data.partial_serial_number = "6789"
  183. # WHEN
  184. serial_number = mock_gopro_adv_data.serial_number
  185. # THEN
  186. assert serial_number == "XXXX0123456789"