wiliot-certificate 4.5.0a1__py3-none-any.whl → 4.5.0a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. certificate/cert_common.py +12 -13
  2. certificate/cert_defines.py +1 -0
  3. certificate/cert_gw_sim.py +3 -0
  4. certificate/cert_results.py +8 -0
  5. certificate/cert_utils.py +3 -0
  6. certificate/certificate_eth_test_list.txt +2 -1
  7. certificate/certificate_test_list.txt +1 -0
  8. certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json +1 -1
  9. certificate/tests/cloud_connectivity/acl_test/acl_test.json +1 -1
  10. certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json +1 -1
  11. certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.json +14 -0
  12. certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py +85 -0
  13. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json +1 -1
  14. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py +10 -9
  15. certificate/tests/cloud_connectivity/stress_test/stress_test.json +1 -1
  16. certificate/tests/cloud_connectivity/stress_test/stress_test.py +10 -10
  17. certificate/tests/cloud_connectivity/uplink_test/uplink_test.py +1 -0
  18. certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json +1 -1
  19. certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.json +1 -1
  20. common/api_if/api_validation.py +2 -2
  21. {wiliot_certificate-4.5.0a1.dist-info → wiliot_certificate-4.5.0a2.dist-info}/METADATA +33 -29
  22. {wiliot_certificate-4.5.0a1.dist-info → wiliot_certificate-4.5.0a2.dist-info}/RECORD +26 -24
  23. {wiliot_certificate-4.5.0a1.dist-info → wiliot_certificate-4.5.0a2.dist-info}/WHEEL +0 -0
  24. {wiliot_certificate-4.5.0a1.dist-info → wiliot_certificate-4.5.0a2.dist-info}/entry_points.txt +0 -0
  25. {wiliot_certificate-4.5.0a1.dist-info → wiliot_certificate-4.5.0a2.dist-info}/licenses/LICENSE +0 -0
  26. {wiliot_certificate-4.5.0a1.dist-info → wiliot_certificate-4.5.0a2.dist-info}/top_level.txt +0 -0
@@ -1273,7 +1273,6 @@ def output_power_supported(board_type, output_power):
1273
1273
  else:
1274
1274
  return output_power in ag.OUTPUT_POWER_2_4_SUPPORTED_VALUES
1275
1275
 
1276
-
1277
1276
  def wiliot_pkts_validation(test, all_messages_in_test, all_data_pkts):
1278
1277
  PHASE_NAME = "Wiliot packets validation"
1279
1278
  phase_run_print(PHASE_NAME)
@@ -1290,7 +1289,7 @@ def wiliot_pkts_validation(test, all_messages_in_test, all_data_pkts):
1290
1289
  wiliot_pkts_validation_phase = seq_id_validation(wiliot_pkts_validation_phase, all_data_pkts)
1291
1290
 
1292
1291
  field_functionality_pass_fail_print(wiliot_pkts_validation_phase, PHASE_NAME)
1293
- test.phases[-1:-1] = [wiliot_pkts_validation_phase]
1292
+ test.add_phase(wiliot_pkts_validation_phase)
1294
1293
  return test
1295
1294
 
1296
1295
 
@@ -1373,19 +1372,19 @@ def generate_graph_stress_test(test, results, test_pkts_received):
1373
1372
  graph_data = []
1374
1373
  for i in range(0, len(results), 2):
1375
1374
  if i + 1 < len(results):
1376
- graph_data.append({'pkts_per_sec': results[i], 'percent_received': results[i + 1]})
1375
+ graph_data.append({'pkts_per_sec': results[i], 'received_pps': results[i + 1]})
1377
1376
 
1378
1377
  graph_df = pd.DataFrame(graph_data)
1379
1378
  html_file_path = os.path.join(ARTIFACTS_DIR, test.dir, 'stress_graph.html')
1380
1379
 
1381
1380
  # First graph: percentage received vs packets per second
1382
- fig1 = px.line(graph_df, x='pkts_per_sec', y='percent_received',
1383
- title='Percentage of packets uploaded by packets per second advertised',
1384
- labels={'pkts_per_sec': 'Packets Sent Per Second', 'percent_received': 'Percentage of packets received'},
1385
- markers=True, text='percent_received')
1381
+ fig1 = px.line(graph_df, x='pkts_per_sec', y='received_pps',
1382
+ title='Packets Per Second Uploaded vs Packets Per Second Advertised',
1383
+ labels={'pkts_per_sec': 'Advertised PPS', 'received_pps': 'Uploaded PPS'},
1384
+ markers=True, text='received_pps')
1386
1385
 
1387
- # Set y-axis to 1-100 scale
1388
- fig1.update_yaxes(range=[1, 100])
1386
+ # Set y-axis to [0 - highest_pps] scale
1387
+ fig1.update_yaxes(range=[0, results[-2]])
1389
1388
 
1390
1389
  # Position text labels next to the markers
1391
1390
  fig1.update_traces(textposition="top right")
@@ -1435,16 +1434,16 @@ def stress_analysis(test, pps, sent_pkts, received_pkts):
1435
1434
  print(f'Number of packets sent: {pkts_sent_count}')
1436
1435
  print(f'Number of packets received: {pkts_received_count}')
1437
1436
  percentage_received = round(pkts_received_count * 100 / pkts_sent_count)
1437
+ received_pps = pps * percentage_received / 100
1438
1438
 
1439
1439
  # PASS/FAIL logic
1440
- stage_pass = pkts_received_count / pkts_sent_count * 100
1441
- if stage_pass < 1: # If less than 1% of the packets were received, fail the test
1440
+ if percentage_received < 1: # If less than 1% of the packets were received, fail the test
1442
1441
  test.rc = TEST_FAILED
1443
1442
  test.reason = "Insufficient amount of packets were scanned & uploaded by the gateway"
1444
1443
  else:
1445
- test.reason = f'{percentage_received}% of packets received, average pps: {pps * percentage_received / 100}'
1444
+ test.reason = f'received pps: {received_pps} ({percentage_received}% of packets)'
1446
1445
 
1447
- return test, percentage_received
1446
+ return test, received_pps
1448
1447
 
1449
1448
 
1450
1449
  def generate_adv_payload(test_indicator, unique_pkt=False):
@@ -14,6 +14,7 @@ except importlib.metadata.PackageNotFoundError:
14
14
  CERT_VERSION = LOCAL_DEV
15
15
  CERT_MQTT_LOG_FILE = "cert_mqtt_log.json"
16
16
  DATA_SIM_LOG_FILE = "data_sim_log.txt"
17
+ RESULT_NOTES_FILE = "results_notes.txt"
17
18
  UT_RESULT_FILE_HTML = "results.html"
18
19
  UT_RESULT_FILE_PDF = "results.pdf"
19
20
  UTILS_BASE_REL_PATH = "../../../utils"
@@ -255,6 +255,9 @@ def interference_analysis(ble_serial):
255
255
  for key in CNTRS_KEYS:
256
256
  diff_dict[key] = handle_wrap_around(end_cntrs[key] - start_cntrs[key])
257
257
  bad_crc_percentage = round((diff_dict[BAD_CRC] / (diff_dict[WLT_RX] + diff_dict[NON_WLT_RX])) * 100)
258
+ notes_file_path = os.path.join(ARTIFACTS_DIR, RESULT_NOTES_FILE)
259
+ with open(notes_file_path, "a") as f:
260
+ f.write(f'Channel {channel[0]} ({channel[1]} MHz) Ambient Interference (bad CRC percentage): {bad_crc_percentage}%\n')
258
261
  print(color('WARNING', f'Channel {channel[0]} ({channel[1]} MHz) Ambient Interference (bad CRC percentage) is: {bad_crc_percentage}%'))
259
262
  print(f'Good CRC packets = {diff_dict[NON_WLT_RX] + diff_dict[WLT_RX] - diff_dict[BAD_CRC]}, bad CRC packets: {diff_dict[BAD_CRC]}')
260
263
 
@@ -36,6 +36,7 @@ BLE_MAC_ADDRESS = "BLE MAC Address"
36
36
  BOARD_TYPE = "Board Type"
37
37
  BLE_VER = "BLE Version"
38
38
  SUP_API_VER = "Supported API Version"
39
+ ADD_INFO = "Additional information"
39
40
  # TODO: This is a temporary list of all schema module names - remove this when auto generated
40
41
  MODULE_SCHEMA_NAMES_LIST = ["Cloud Connectivity", "Edge Management", "Calibration", "Datapath", "Energizer 2.4GHz",
41
42
  "Energizer Sub-1GHz", "Power Management", "BLE Sensor", "Custom"]
@@ -256,6 +257,13 @@ def generate_results_files(dut=None, tester=None, html=True, pdf=True, failures=
256
257
  hdr_page.append(Paragraph(f"{SIM} {BOARD_TYPE}: {ag.BOARD_TYPES_LIST[internal_brg.board_type]}", bold_text_style))
257
258
  hdr_page.append(Paragraph(f"{SIM} {BLE_VER}: {internal_brg.version}", bold_text_style))
258
259
  hdr_page.append(Paragraph(f"{SIM} {SUP_API_VER}: {internal_brg.api_version}", bold_text_style))
260
+ notes_file_path = os.path.join(ARTIFACTS_DIR, RESULT_NOTES_FILE)
261
+ if os.path.exists(notes_file_path):
262
+ hdr_page.append(Paragraph(f"<u>{ADD_INFO}:</u>", bold_text_style))
263
+ with open(notes_file_path, 'r') as f:
264
+ for line in f.readlines():
265
+ hdr_page.append(Paragraph(f"{line}", bold_text_style))
266
+
259
267
  hdr_page.append(Spacer(1, 20))
260
268
 
261
269
  # Analyze results per module and generate results per module for PDF
certificate/cert_utils.py CHANGED
@@ -220,6 +220,9 @@ class WltTest:
220
220
  return phase
221
221
  return None
222
222
 
223
+ def add_phase(self, phase):
224
+ self.phases[-1:-1] = [phase]
225
+
223
226
  def update_overall_rc(self):
224
227
  if any([phase.rc == TEST_FAILED for phase in self.phases]):
225
228
  self.rc = TEST_FAILED
@@ -71,4 +71,5 @@ cloud_connectivity/stress_test 20 40 60 80 100 120 140 160 180 200 222 250 285 3
71
71
  cloud_connectivity/ext_adv_stress_test 20 40 60 80 100 120 140 160 180 200
72
72
  cloud_connectivity/channel_scan_behaviour_test
73
73
  cloud_connectivity/acl_test deny allow
74
- cloud_connectivity/acl_ext_adv_test deny allow
74
+ cloud_connectivity/acl_ext_adv_test deny allow
75
+ cloud_connectivity/deduplication_test
@@ -73,3 +73,4 @@ cloud_connectivity/channel_scan_behaviour_test
73
73
  cloud_connectivity/acl_test deny allow
74
74
  cloud_connectivity/acl_ext_adv_test deny allow
75
75
  cloud_connectivity/brg_ota_test
76
+ cloud_connectivity/deduplication_test
@@ -2,7 +2,7 @@
2
2
  "name": "Access Control List using Extended Advertising",
3
3
  "module": "Cloud Connectivity",
4
4
  "purpose": "Test the access control list (ACL) functionality, configure allow list and deny list and test the behavior, while the Bridge is transmitting in extended advertising",
5
- "documentation": "<TEST_DOCUMENTATION_LINK>",
5
+ "documentation": "https://community.wiliot.com/customers/s/article/Wiliot-Network---Gateway-Extended-Advertising-Implementation",
6
6
  "initialCondition": "Gateway configured to defaults",
7
7
  "procedure": ["Test prolog", "configure the brg to be on the deny list", "configure the brg to be on the allow list", "Test epilog"],
8
8
  "expectedOutcome": "For the deny list - no unified packets are found, for the allow list - unified packets are found",
@@ -2,7 +2,7 @@
2
2
  "name": "Access Control List",
3
3
  "module": "Cloud Connectivity",
4
4
  "purpose": "Test the access control list (ACL) functionality, configure allow list and deny list and test the behavior",
5
- "documentation": "<TEST_DOCUMENTATION_LINK>",
5
+ "documentation": "https://community.wiliot.com/customers/s/article/Access-Control-List",
6
6
  "initialCondition": "Gateway configured to defaults",
7
7
  "procedure": ["Test prolog", "configure the brg to be on the deny list", "configure the brg to be on the allow list", "Test epilog"],
8
8
  "expectedOutcome": "For the deny list - no unified packets are found, for the allow list - unified packets are found",
@@ -2,7 +2,7 @@
2
2
  "name": "Gateway Channel behavior",
3
3
  "module": "Cloud Connectivity",
4
4
  "purpose": "Test gateway's channel scanning time cycles on all main channels",
5
- "documentation": "<TEST_DOCUMENTATION_LINK>",
5
+ "documentation": "",
6
6
  "initialCondition": "Gateway configured with default settings",
7
7
  "procedure": ["Test prolog",
8
8
  "Send packets as close as possible to continuously on all 3 channels, with a unique channel identifier",
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "Gateway Deduplication",
3
+ "module": "Cloud Connectivity",
4
+ "purpose": "Test gateway's packet deduplication capability when receiving identical BLE packets",
5
+ "documentation": "",
6
+ "initialCondition": "Gateway configured to defaults",
7
+ "procedure": ["Test prolog", "Send mixed packet types (pixels, mgmt, sensor, side_info_sensor) via data simulator", "Collect received packets from MQTT", "Analyze duplicate packets and calculate duplicate percentage", "Test epilog"],
8
+ "expectedOutcome": "Duplicate percentage should be <= 5% of total received packets",
9
+ "mandatory": 0,
10
+ "multiBridgeTest": 0,
11
+ "gwOnlyTest": 1,
12
+ "dataSimOnlyTest": 1,
13
+ "allSupportedValues": []
14
+ }
@@ -0,0 +1,85 @@
1
+ # This test meant to show the GW performance when is put in a pkt stress generated from the BLE via the UART
2
+ from certificate.cert_prints import *
3
+ from certificate.cert_defines import *
4
+ from certificate.wlt_types import *
5
+ import certificate.cert_common as cert_common
6
+ import certificate.cert_utils as cert_utils
7
+ import certificate.cert_mqtt as cert_mqtt
8
+ import certificate.cert_data_sim as cert_data_sim
9
+ import pandas as pd
10
+
11
+
12
+ # DEFINES
13
+ UPLINK_TEST_INDICATOR = cert_utils.get_random_hex_str(len=6)
14
+ NUM_OF_BRGS = 3
15
+
16
+
17
+ # HELPER FUNCTIONS
18
+ def duplication_analysis(test, pkts, received_pkts):
19
+ if len(received_pkts) == 0:
20
+ test.rc = TEST_FAILED
21
+ test.reason = "No packets were received!"
22
+ return test
23
+
24
+ _sent_pkts = []
25
+ for pkt in pkts:
26
+ pkt_str = pkt.get_pkt()
27
+ adva_endianness_change = cert_common.change_endianness(pkt_str[:12]) + pkt_str[12:] # Switch to big endian adva
28
+ _sent_pkts.append(adva_endianness_change)
29
+
30
+ sent_df = pd.DataFrame(_sent_pkts, columns=[PACKETS])
31
+ received_df = pd.DataFrame(received_pkts, columns=[PACKETS])
32
+
33
+ merged_df = pd.merge(sent_df, received_df, on=PACKETS, how='inner')
34
+ # Count total received packets (including duplicates) and unique packets
35
+ pkts_received_total = len(merged_df)
36
+ merged_df_unique = merged_df.drop_duplicates(subset=[PACKETS])
37
+ pkts_duplicates = pkts_received_total - len(merged_df_unique)
38
+
39
+ # Prints
40
+ print(f'Number of packets sent: {len(sent_df)}')
41
+ print(f'Number of packets received in total: {pkts_received_total}, out of them {pkts_duplicates} are duplicates')
42
+
43
+ duplicate_percentage = (pkts_duplicates / pkts_received_total) * 100
44
+ print(f'{duplicate_percentage:.2f}% of the received packets are duplicates')
45
+
46
+ if duplicate_percentage > 5.0:
47
+ test.rc = TEST_FAILED
48
+ test.reason = f"{duplicate_percentage:.2f}% of the received packets are duplicates"
49
+ return test
50
+
51
+ return test
52
+
53
+
54
+ def run(test):
55
+ test = cert_common.test_prolog(test)
56
+ if test.rc == TEST_FAILED:
57
+ return cert_common.test_epilog(test)
58
+
59
+ dut_mqttc = test.get_mqttc_by_target(DUT)
60
+ dut_mqttc.flush_pkts()
61
+ pkts = []
62
+
63
+ # generate pkts and send them using data simulator
64
+ data_pkts, _ = cert_data_sim.brg_pkt_gen(num_of_pkts_per_brg=10, num_of_brgs=NUM_OF_BRGS,
65
+ pkt_type=PIXELS_PKT, indicator=UPLINK_TEST_INDICATOR)
66
+
67
+ mgmt_pkts, _ = cert_data_sim.brg_pkt_gen(num_of_pkts_per_brg=10, num_of_brgs=NUM_OF_BRGS,
68
+ pkt_type=MGMT_PKT, indicator=UPLINK_TEST_INDICATOR)
69
+ sensor_pkts, _ = cert_data_sim.brg_pkt_gen(num_of_pkts_per_brg=10, num_of_brgs=NUM_OF_BRGS,
70
+ pkt_type=SENSOR_PKT, indicator=UPLINK_TEST_INDICATOR)
71
+ si_pkts, _ = cert_data_sim.brg_pkt_gen(num_of_pkts_per_brg=10, num_of_brgs=NUM_OF_BRGS,
72
+ pkt_type=SIDE_INFO_SENSOR_PKT, indicator=UPLINK_TEST_INDICATOR)
73
+ pkts = data_pkts + mgmt_pkts + sensor_pkts + si_pkts
74
+
75
+ pixel_sim_thread = cert_data_sim.GenericSimThread(test=test, pkts=pkts, send_single_cycle=True)
76
+ pixel_sim_thread.start()
77
+
78
+ mqtt_scan_wait(test, 10 + test.dut.upload_wait_time)
79
+ cert_mqtt.dump_pkts(test, log="deduplication_test")
80
+ recieved_pkts = cert_mqtt.get_all_data_pkts(dut_mqttc, indicator=UPLINK_TEST_INDICATOR)
81
+ pixel_sim_thread.stop()
82
+
83
+ test = duplication_analysis(test, pkts, [p[ALIAS_BRIDGE_ID] + p[PAYLOAD] for p in recieved_pkts])
84
+
85
+ return cert_common.test_epilog(test)
@@ -12,5 +12,5 @@
12
12
  "multiBridgeTest": 0,
13
13
  "gwOnlyTest": 1,
14
14
  "dataSimOnlyTest": 1,
15
- "allSupportedValues": [20, 40, 60, 80, 100, 120, 140, 160, 180, 200]
15
+ "allSupportedValues": []
16
16
  }
@@ -51,13 +51,13 @@ def run(test):
51
51
 
52
52
  cert_config.gw_action(test, f'{cert_gw_sim.BLE_SIM_INIT} 1', TESTER)
53
53
 
54
+ ppses = [20, 40, 60, 80, 100, 120, 140, 160, 180, 200]
54
55
  test_pkts_received = []
55
56
  data_pkts_received = []
56
57
  results = []
57
- for param in test.params:
58
- phase_run_print(f"PPS = {param}")
58
+ for pps in ppses:
59
+ phase_run_print(f"PPS = {pps}")
59
60
  test.flush_all_mqtt_packets()
60
- pps = param.value
61
61
  # adv_duration is increased only for lowest pps to increase packets sample for reliable results
62
62
  adv_duration = ADV_DURATION_LOWEST_PPS if pps == LOWEST_PPS else ADV_DURATION_DEFAULT
63
63
  delay = math.floor(1000 / pps) # This should be bigger than 2ms
@@ -74,17 +74,18 @@ def run(test):
74
74
  cert_config.gw_action(test, gw_action_cmd, TESTER)
75
75
  mqtt_scan_wait(test, adv_duration + upload_wait_time)
76
76
 
77
- cert_mqtt.dump_pkts(test, log=param.name)
77
+ cert_mqtt.dump_pkts(test, log=str(pps))
78
78
  phase_pkts_received = cert_mqtt.get_all_aggregated_data_pkts(test.get_mqttc_by_target(DUT), indicator=STRESS_TEST_INDICATOR)
79
79
 
80
- test, percentage_received = cert_common.stress_analysis(
80
+ test, received_pps = cert_common.stress_analysis(
81
81
  test, pps, generated_payloads,
82
82
  [(p[ALIAS_BRIDGE_ID] + p[AGGREGATED_PAYLOAD]) for p in phase_pkts_received])
83
- results.extend([pps, percentage_received])
84
- cert_mqtt.generate_log_file(test, param.name)
83
+ results.extend([pps, received_pps])
84
+ cert_mqtt.generate_log_file(test, str(pps))
85
85
 
86
- test.set_phase_rc(param.name, test.rc)
87
- test.add_phase_reason(param.name, test.reason)
86
+ test.add_phase(cert_utils.Phase(pps))
87
+ test.set_phase_rc(str(pps), test.rc)
88
+ test.add_phase_reason(str(pps), test.reason)
88
89
  if test.rc == TEST_FAILED and test.exit_on_param_failure:
89
90
  break # break the whole for loop and keep the test as failed
90
91
  test.reset_result() # reset result and continue to next param
@@ -12,5 +12,5 @@
12
12
  "multiBridgeTest": 0,
13
13
  "gwOnlyTest": 1,
14
14
  "dataSimOnlyTest": 1,
15
- "allSupportedValues": [20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 222, 250, 285, 333]
15
+ "allSupportedValues": []
16
16
  }
@@ -50,14 +50,13 @@ def run(test):
50
50
  return cert_common.test_epilog(test)
51
51
 
52
52
  cert_config.gw_action(test, f'{cert_gw_sim.BLE_SIM_INIT} 1', TESTER)
53
-
53
+ ppses = [20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 222, 250, 285, 333]
54
54
  test_pkts_received = []
55
55
  data_pkts_received = []
56
56
  results = []
57
- for param in test.params:
58
- phase_run_print(f"PPS = {param}")
57
+ for pps in ppses:
58
+ phase_run_print(f"PPS = {pps}")
59
59
  test.flush_all_mqtt_packets()
60
- pps = param.value
61
60
  # adv_duration is increased only for lowest pps to increase packets sample for reliable results
62
61
  adv_duration = ADV_DURATION_LOWEST_PPS if pps == LOWEST_PPS else ADV_DURATION_DEFAULT
63
62
  delay = math.floor(1000 / pps)
@@ -73,17 +72,18 @@ def run(test):
73
72
  f'{BLE_SIM_ADV_37_38_39} {delay} {BLE_SIM_RADIO_1MBPS} {adv_duration * pps}', TESTER)
74
73
  mqtt_scan_wait(test, adv_duration + upload_wait_time)
75
74
 
76
- cert_mqtt.dump_pkts(test, log=param.name)
75
+ cert_mqtt.dump_pkts(test, log=str(pps))
77
76
  phase_pkts_received = cert_mqtt.get_all_data_pkts(test.get_mqttc_by_target(DUT), indicator=STRESS_TEST_INDICATOR)
78
77
 
79
- test, percentage_received = cert_common.stress_analysis(
78
+ test, received_pps = cert_common.stress_analysis(
80
79
  test, pps, generated_payloads,
81
80
  [(p[ALIAS_BRIDGE_ID] + p[PAYLOAD]) for p in phase_pkts_received])
82
- results.extend([pps, percentage_received])
83
- cert_mqtt.generate_log_file(test, param.name)
81
+ results.extend([pps, received_pps])
82
+ cert_mqtt.generate_log_file(test, str(pps))
84
83
 
85
- test.set_phase_rc(param.name, test.rc)
86
- test.add_phase_reason(param.name, test.reason)
84
+ test.add_phase(cert_utils.Phase(pps))
85
+ test.set_phase_rc(str(pps), test.rc)
86
+ test.add_phase_reason(str(pps), test.reason)
87
87
  if test.rc == TEST_FAILED and test.exit_on_param_failure:
88
88
  break # break the whole for loop and keep the test as failed
89
89
  test.reset_result() # reset result and continue to next param
@@ -130,6 +130,7 @@ def run(test):
130
130
 
131
131
  mqtt_scan_wait(test, 10 + test.dut.upload_wait_time)
132
132
  cert_mqtt.dump_pkts(test, log=param.name)
133
+ pixel_sim_thread.stop()
133
134
  all_data_messages_in_test.extend(dut_mqttc._userdata[PKTS].data)
134
135
  all_data_pkts.extend(cert_mqtt.get_all_data_pkts(dut_mqttc))
135
136
  recieved_pkts = cert_mqtt.get_all_data_pkts(dut_mqttc, indicator=UPLINK_TEST_INDICATOR)
@@ -2,7 +2,7 @@
2
2
  "name": "Supported Pixels",
3
3
  "module": "Datapath",
4
4
  "purpose": "Test pixels handling in the bridge for different amount of pixels",
5
- "documentation": "<TEST_DOCUMENTATION_LINK>",
5
+ "documentation": "",
6
6
  "initialCondition": "Bridge & data simulator configured to defaults",
7
7
  "procedure": ["Test prolog",
8
8
  "Generate packets from the given amount of pixels & scan for packets in the bridge",
@@ -2,7 +2,7 @@
2
2
  "name": "RSSI Threshold",
3
3
  "module": "Datapath",
4
4
  "purpose": "Test RSSI threshold configuration and functionality in the bridge",
5
- "documentation": "<TEST_DOCUMENTATION_LINK>",
5
+ "documentation": "",
6
6
  "initialCondition": "Bridge configured to defaults",
7
7
  "procedure": ["Test prolog",
8
8
  "RSSI Threshold configuration",
@@ -23,7 +23,7 @@ def api_validation(test):
23
23
  utPrint("API validation is skipped for protobuf messages", "WARNING")
24
24
  api_validation_phase.rc = TEST_SKIPPED
25
25
  api_validation_phase.reason = "API validation is skipped for protobuf messages"
26
- test.phases[-1:-1] = [api_validation_phase]
26
+ test.add_phase(api_validation_phase)
27
27
  return test
28
28
  else:
29
29
  def validate_message(message: dict, msg_type=MESSAGE_TYPES.DATA.value) -> tuple[bool, str]:
@@ -81,5 +81,5 @@ def api_validation(test):
81
81
  api_validation_phase.rc = TEST_FAILED
82
82
  api_validation_phase.reason = "API (JSON strcture) is invalid"
83
83
  field_functionality_pass_fail_print(api_validation_phase, API_VALIDATION)
84
- test.phases[-1:-1] = [api_validation_phase]
84
+ test.add_phase(api_validation_phase)
85
85
  return test
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wiliot_certificate
3
- Version: 4.5.0a1
3
+ Version: 4.5.0a2
4
4
  Summary: A library for certifying Wiliot-compliant boards
5
5
  Author-email: Wiliot <support@wiliot.com>
6
6
  License-Expression: MIT
@@ -34,7 +34,7 @@ Dynamic: license-file
34
34
 
35
35
  <!-- Description -->
36
36
  wiliot-certificate is a Python library that provides tools for testing and certifying boards for compatibility with Wiliot’s ecosystem.
37
- This python package includes the following CLI utilities:
37
+ This python package includes the following tools:
38
38
  - Certification Wizard (`wlt-cert`)
39
39
  - Certificate CLI (`wlt-cert-cli`)
40
40
  - Tester Upgrade (`wlt-cert-tester-upgrade`)
@@ -55,33 +55,11 @@ In terminal, run:
55
55
  ````commandline
56
56
  wlt-cert
57
57
  ````
58
- <!-- This tool walks you through... TODO -->
59
- <!-- You need to have a json validation schema <LINK>, certification tester & custom broker file <LINK> -->
58
+ This tool is the default to test and certify your device.
59
+ It runs a setup wizard that walks you through the initialization steps before running the tests.
60
+ You'll need a [validation schema](https://community.wiliot.com/customers/s/article/Validation-Schema), tester device and custom broker json file ([more info here](https://community.wiliot.com/customers/s/article/Wiliot-Gateway-Certification)).
61
+ Once set up it opens a terminal and tests your device.
60
62
 
61
- #### The following capabilities are not tested in this version
62
- ##### Cloud Connectivity & Misc
63
- - Board type registered within the Board Type Management system
64
- - Bridge OTA progress reporting
65
- ##### Power management
66
- - Functionality of energize and transmit in sleep mode
67
- ##### Edge management
68
- - Timing of heartbeat and interface packets
69
- ##### Module Energy 2400
70
- - Functionality of energy pattern, output power and duty cycle
71
- ##### Module Energy SUB1G
72
- - Functionality of energy pattern and duty cycle
73
- ##### Module Datapath
74
- - RSSI edge cases: -127 and 0
75
- - Functionality of transmission pattern, output power
76
- - Pacer interval with channel 10 and 500k modulation
77
- - Pacer interval using GEN3 Pixels
78
- - Packet filter: the following configuration - DEBUG, TEMP & DEBUG, TEMPS & DEBUG & ADVANCE
79
- - Rx rate feature with extended advertising
80
- - Functionality of adaptive pacer algorithm
81
- - Supported Pixels for extended advertising and GEN3
82
- ##### Calibration
83
- - Functionality of output power and interval calibration
84
- - Functionality of calibration transmission patterns for the configuration STANDARD & EU & DISABLE
85
63
 
86
64
 
87
65
  ### Certificate CLI
@@ -107,4 +85,30 @@ wlt-cert-reg
107
85
  ````
108
86
  Certify the gateway registration process to Wiliot platform.
109
87
  The gateway must use Wiliot production MQTT broker, and mustn't be registered to any account on Wiliot platform.
110
- Use -h for details on the arguments. <!-- More info can be found in TODO link-->
88
+ Use -h for details on the arguments. [More info here](https://community.wiliot.com/customers/s/article/Wiliot-Gateway-Certification)
89
+
90
+
91
+ ## The following capabilities are not tested in this version
92
+ ##### Cloud Connectivity & Misc
93
+ - Board type registered within the Board Type Management system
94
+ - Bridge OTA progress reporting
95
+ ##### Power management
96
+ - Functionality of energize and transmit in sleep mode
97
+ ##### Edge management
98
+ - Timing of heartbeat and interface packets
99
+ ##### Module Energy 2400
100
+ - Functionality of energy pattern, output power and duty cycle
101
+ ##### Module Energy SUB1G
102
+ - Functionality of energy pattern and duty cycle
103
+ ##### Module Datapath
104
+ - RSSI edge cases: -127 and 0
105
+ - Functionality of transmission pattern, output power
106
+ - Pacer interval with channel 10 and 500k modulation
107
+ - Pacer interval using GEN3 Pixels
108
+ - Packet filter: the following configuration - DEBUG, TEMP & DEBUG, TEMPS & DEBUG & ADVANCE
109
+ - Rx rate feature with extended advertising
110
+ - Functionality of adaptive pacer algorithm
111
+ - Supported Pixels for extended advertising and GEN3
112
+ ##### Calibration
113
+ - Functionality of output power and interval calibration
114
+ - Functionality of calibration transmission patterns for the configuration STANDARD & EU & DISABLE
@@ -1,19 +1,19 @@
1
1
  certificate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- certificate/cert_common.py,sha256=UwymXwdiTcdfy6iNp9-DmLZ-EyhxFTVgq7bb3dC4Owc,71482
2
+ certificate/cert_common.py,sha256=dVPDX2E48OBhX7wb7BwqUuExcpMfs2osb8gkMIsKbc0,71414
3
3
  certificate/cert_config.py,sha256=IHzs9Cpw3fJsn6al0gxKcs7n3Z5tB3GhnSy_GTUolb8,22477
4
4
  certificate/cert_data_sim.py,sha256=7DLBP5OTzo9jJvQctz_b_6XiozsY9VXkatRCrxJ96xk,13736
5
- certificate/cert_defines.py,sha256=xkSFTbu-NORZnWV1P0pZzNpR572BUkFm2rdqn_KA998,17168
6
- certificate/cert_gw_sim.py,sha256=xIwHvcFBCi89now_HFRo_V1cTLoYuulDwBrlu1iHqGw,16368
5
+ certificate/cert_defines.py,sha256=nkrMJOwS93muV3j-2SgHGT8s3JnBQkkNfB7RWqYbjeg,17220
6
+ certificate/cert_gw_sim.py,sha256=3GOe_MTlEdugbnqlcUWybIJryRoc9_v2359x7SUDGnc,16618
7
7
  certificate/cert_mqtt.py,sha256=N1uNN2V4ovUg-pTmUGMD6lHAnICW7BLNYGTcnG59qO0,22237
8
8
  certificate/cert_prints.py,sha256=z8Bw3ZHiLr6yN3EbRkVvmUMkwLt6VNj0MUX1mUvdHQI,7025
9
9
  certificate/cert_protobuf.py,sha256=j8Tmm86VXONMvSTBl4Tmwt5G1jJRcJg05nJj7YHbpoM,3824
10
- certificate/cert_results.py,sha256=t2tiDVZYf6gEn7nDrQ1U6IXz0FD5R1sqgtGL0l68WvY,28896
11
- certificate/cert_utils.py,sha256=2oSPz9--hVMbj1Hr0G-3l0dfh9_815ReCfrbZBRQMNo,28763
10
+ certificate/cert_results.py,sha256=4pIm0TKYNYlJmIDZur0miQB43K_AL1HATJikmy-CYZc,29321
11
+ certificate/cert_utils.py,sha256=XMa-RyEbohQcFviYN4NdhRPjJ-2D5ME168oMCk7Hpws,28833
12
12
  certificate/certificate.py,sha256=VGtbU8jN-y_cBbOxn_apQZCyW59W-3MFXDaCher6bdI,9235
13
13
  certificate/certificate_cli.py,sha256=uwfdVNpQirdRyLjl0bR410xkaY59OmIEOya7wYYV4AY,5363
14
- certificate/certificate_eth_test_list.txt,sha256=CELzzkv9kQxiLdJ2aDmRglbiwImciE5G37vSVJvZK8A,6199
14
+ certificate/certificate_eth_test_list.txt,sha256=G7O7rOycoSLx5LYPDq_qlzPgOWPHq0gWZ35jsmaZL9k,6237
15
15
  certificate/certificate_sanity_test_list.txt,sha256=F1vXhhw4gsJUxt34C2fuQkS-E8Sc74G41jinzeKFO7Y,3448
16
- certificate/certificate_test_list.txt,sha256=sTCWWdNk0Gfyi70wFpIHdTVg4cZzeF1psrqjMrzmQTs,6232
16
+ certificate/certificate_test_list.txt,sha256=FAaG_Rfw_EIdpUd1Jpu_J5QiuCuQRH0Wo_38d3NTy6A,6270
17
17
  certificate/wlt_types.py,sha256=7RbsW-OudiHhNAay6nFGKtF4FrlAq91pm9yeIQRxddM,6047
18
18
  certificate/ag/wlt_cmd_if.html,sha256=eO-FYVrxVs5JdCblGaQLG9-0dZKt6YjbE9Ggz8bXRq4,16831
19
19
  certificate/ag/wlt_types_ag.py,sha256=cTYysTSdEh2IWY8tD3pipRhwKo1b194VSX64ctvgGQY,536839
@@ -39,38 +39,40 @@ certificate/tests/calibration/output_power_test/output_power_test.json,sha256=TL
39
39
  certificate/tests/calibration/output_power_test/output_power_test.py,sha256=ZhszJX-ugX1R2aFLhdKOk6qFtEwW_7qSRVDWkWv5sSo,1698
40
40
  certificate/tests/calibration/pattern_test/pattern_test.json,sha256=lfAQal-qLqbwf1_HJEKia7nUU-ZqMO9YexNWsQjVp_k,1022
41
41
  certificate/tests/calibration/pattern_test/pattern_test.py,sha256=SobeVTLqDbr0IJ79rgDBy3WAmw63Gv5CthOUSxIlMqM,4559
42
- certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json,sha256=kofk6AnR8BO_OmXP0rSr-rU4l1GwrV4Iw9zdDt3LnCI,790
42
+ certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json,sha256=ZMNw-2ihDwASqPx-2vnqyaZuCOEN-rELcwAkrsYReD0,874
43
43
  certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.py,sha256=tdXqVj8hqFAdT46aB9UwHVr-O21BfvbFQtiSLpW8erY,7118
44
- certificate/tests/cloud_connectivity/acl_test/acl_test.json,sha256=f2Z2kW-Aj7ge_dLspM9kcHb2YmTdrO_MnV7oTiC_RSk,705
44
+ certificate/tests/cloud_connectivity/acl_test/acl_test.json,sha256=HvpBwBnA7qlN0cipzJJLQAnFkBzCC0GNiLOnAUCEBcY,748
45
45
  certificate/tests/cloud_connectivity/acl_test/acl_test.py,sha256=SnXAv2IszOjyJAWJrIfzHu1RCDmLW4E5MwryJcm-Uao,4635
46
46
  certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.json,sha256=bSBbWaggOew38x91rzdC88jxE3FYJsusO9IvTy7KJ1I,850
47
47
  certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.py,sha256=xqB65yWM754UfWF1N_h4bI4kuEajAqMvcdFjRu0OFfI,1873
48
- certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json,sha256=9VPpD-FTx80Zgtns1uGVQNGLVohOzKL-6hMhVgKBs2Y,780
48
+ certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json,sha256=Sc4Xp3VPY9GjNKsQFcjAr9fyD9_MZMBfxsgpo31Jk-Y,755
49
49
  certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py,sha256=YBlpBshBHdMkiRp_liow7Tknj1e1j0fMAU8OKZJKWwg,10121
50
50
  certificate/tests/cloud_connectivity/connection_test/connection_test.json,sha256=xr-d-DnzbItkXE8oBTZ31Fr0huhILdxXTQFJyqd6FYc,939
51
51
  certificate/tests/cloud_connectivity/connection_test/connection_test.py,sha256=vawz7N9tltiIxtOLOAsEPDid-RDQuGEYWJwm388gVuA,2707
52
+ certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.json,sha256=-6va5_YT-IDdEJZjJUlV3L6CcGODPcLWgcZUE5Dv01k,710
53
+ certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py,sha256=PcESIcGJoIUgwuDDo71YGWVuy4l-KMlLypGfKg4TPJ8,3573
52
54
  certificate/tests/cloud_connectivity/downlink_test/downlink_test.json,sha256=VR2EHtOLHuh0ETSbgRGOuorHcuJPKBkk1hwM_7g_Dj4,878
53
55
  certificate/tests/cloud_connectivity/downlink_test/downlink_test.py,sha256=p9PDpvKd8dhXiPElZ4CY6HgAs5IWdKfd9fmhBj_C1fM,8645
54
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json,sha256=bpziEnGpwf0i03suFOgykAZrlwQeKsVWLyfd8vOWz0s,998
55
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py,sha256=jyfRxbkpIoDTSE1bzV3qtRwzdltfWlb53yxkdQQaJYA,3922
56
+ certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json,sha256=W0kAvLyzxUsaEKiuGu2Eq-Al5g-ov2zapFF3FXlgdq0,954
57
+ certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py,sha256=KzzZZFh8a1Xv_fH22xt_k08pqTuajjJ6sYyEU_DfeB0,3969
56
58
  certificate/tests/cloud_connectivity/reboot_test/reboot_test.json,sha256=QZMqxrUul_jEvoQJKdWjzXxa_m49a3rVyDTDbREYhik,781
57
59
  certificate/tests/cloud_connectivity/reboot_test/reboot_test.py,sha256=h8Uhn6NQExb9pLRytrd7UvLO0ScxTOfM3sdCwSCWKqg,1924
58
60
  certificate/tests/cloud_connectivity/registration_test/registration_test.json,sha256=fT-IHk0CRid8EDgo9bDtO7jl_1JDcVK0bQSHBz8CpZw,1039
59
61
  certificate/tests/cloud_connectivity/registration_test/registration_test.py,sha256=uzLwNQFffLJQhzuUx0l1-xsk7r0X1z4xBk7zjkzlTlE,15115
60
62
  certificate/tests/cloud_connectivity/registration_test/registration_test_cli.py,sha256=zh9j298Nis8BiL74E1pXskoxXzPmedznyJqJwKS4CIU,3164
61
- certificate/tests/cloud_connectivity/stress_test/stress_test.json,sha256=_DM42nBfSzF6hbo217DUfealONBY109i60-ZrAsBLXY,868
62
- certificate/tests/cloud_connectivity/stress_test/stress_test.py,sha256=K-GdYGRI-mPx_xxUHIVPbAwKEGqXw-o0lPegHhsniyU,3821
63
+ certificate/tests/cloud_connectivity/stress_test/stress_test.json,sha256=rXDA1AgdSgMdBZhDvKHyO4p1KoqJxDfKJzvwSVLcONA,804
64
+ certificate/tests/cloud_connectivity/stress_test/stress_test.py,sha256=1ljb8RmwOS4D85sGmp4w4HWcoV-3yDm9oJqRxa1VKdM,3887
63
65
  certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.json,sha256=4yiEHa1sxz6-xnQDtaBU4JHNDsPZ_p9Jpgqpy8s9QJY,1326
64
66
  certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.py,sha256=U5FRhgoba12F7IIT4JmOKRhOaIkGYLV3I4tnf6a0xVc,4427
65
67
  certificate/tests/cloud_connectivity/uplink_test/uplink_test.json,sha256=F28h9EjUxLYOiYH1mk_o8hUqHyer4Mc7BhvfU4VnhYQ,955
66
- certificate/tests/cloud_connectivity/uplink_test/uplink_test.py,sha256=UMBfpsgRWNNRxtj8iRtvA2Mhjg9IH35PCFbO-hA_GEM,6752
68
+ certificate/tests/cloud_connectivity/uplink_test/uplink_test.py,sha256=yoA84-DcFl7cZCw6_WyY1PYKB3L0R2nlYjbEEW-qY8A,6784
67
69
  certificate/tests/datapath/aging_test/aging_test.json,sha256=n1LmPKJWzfSOmjNFMVMeIdFS59kteUDce6a55gEM4Zk,901
68
70
  certificate/tests/datapath/aging_test/aging_test.py,sha256=hxWlCd9XOJP9M14T9XRPpJ8_Af6SNaUs9ZDJNLRg7ms,6682
69
71
  certificate/tests/datapath/event_ble5_test/event_ble5_test.json,sha256=Tz3sx09zVKjgRcNtrnriF2Iski_TxbUluFji69KUdPs,967
70
72
  certificate/tests/datapath/event_ble5_test/event_ble5_test.py,sha256=eCU7wTBsqheQqxdj7nIkMsi8UT3tgXeupDIfXXDNHDE,5101
71
73
  certificate/tests/datapath/event_test/event_test.json,sha256=wGLlSQB4Q1bQG4CfY5XEcw2r2wO5MI-Gnm-cBDeFktQ,972
72
74
  certificate/tests/datapath/event_test/event_test.py,sha256=fzc_t4YjyxCqSRbB4HIqVu4zZZs1TZIGRRm-pTzGA2U,4186
73
- certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json,sha256=-oNrMxuncrDXG_t7b8gbrdFsQftUFHW5uQQMGkkwz3I,830
75
+ certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json,sha256=lho1x44X3MJDvKPX3ZouWIJPednp0MyTabcqhPaU9aE,805
74
76
  certificate/tests/datapath/num_of_tags_test/num_of_tags_test.py,sha256=Ecaf-8yQQX1ZybbgMstiNPrVhZz7-BSF4MSiUiE6tTc,3481
75
77
  certificate/tests/datapath/output_power_test/output_power_test.json,sha256=1B_glQf7GUgjdqnAwnKE2_iyinNGuW3mtiglp2XlLvQ,1449
76
78
  certificate/tests/datapath/output_power_test/output_power_test.py,sha256=09Ug3nhLm3SFTdfZnoKSN1wR5Dc9yRKbRlaNn7Gt9Rw,1704
@@ -90,7 +92,7 @@ certificate/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.json,sha256
90
92
  certificate/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.py,sha256=vB2JlCczasZE81VGRzIeqBEM8VGekSf9-wgGP8SWd50,3152
91
93
  certificate/tests/datapath/pkt_filter_test/pkt_filter_test.json,sha256=sGWj910BxCrzaFMlF8lp8NjNmhiXMR4DO7qSJJg92ZU,1168
92
94
  certificate/tests/datapath/pkt_filter_test/pkt_filter_test.py,sha256=rEHn2aO0SM3PeT68czrhp1GkxG3o7qAj5h9JPUyC-kE,3132
93
- certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.json,sha256=cEu0MIuF3bu3DMQ9PglEK-J91u2g7q0oh8ABdIqw0TY,738
95
+ certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.json,sha256=GG47Viyb-QKxFrVQuk59h2d5uIEPgegKcG_5Jc9QUH8,713
94
96
  certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.py,sha256=d4RXqCuJv5fEjt01GFXQb99hF0EgOSS3EoKCueLhMfg,3271
95
97
  certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.json,sha256=zjzm7WKNzNe6UCasynLmjg4Gz4VX3HndY8n9yUlekFc,847
96
98
  certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.py,sha256=ZXQRYFxnUOgdcWS4BpN95XVbezQG0X8wU5s1Lbc2Ytg,3398
@@ -148,7 +150,7 @@ common/wltPb_pb2.py,sha256=xMXdT2gP9g79Jo7XHI5E-i-qaDgdIQCHBNfUcuA6tKs,9154
148
150
  common/wltPb_pb2.pyi,sha256=qCTgOrf9Og_y6ilwWwkpK_D-qDFOagNpRc35mgT-_C4,12214
149
151
  common/wlt_logo.png,sha256=21DEhCEOOBU7Zt7ocwVIKU_CKUoHXScc3ej5VAzVsjM,132154
150
152
  common/api_if/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
- common/api_if/api_validation.py,sha256=F620ln1bYI-zidLcxIS-LyRgASJBJiTDZ91Fpy_28wQ,4057
153
+ common/api_if/api_validation.py,sha256=4-WLog_JvLZ52bLDxHGJZbVoeLtxgpWxG5VQ091ok9c,4043
152
154
  common/api_if/202/data.json,sha256=A_nTONHIvPsOIqTM0X-ON0s2i2Um7bmv7b1zZzGD0nA,2423
153
155
  common/api_if/202/logs.json,sha256=vfVi4hkxKGcSiupTSS2Er8wn4hZ8_MTaO5xbirNF5-0,219
154
156
  common/api_if/202/status.json,sha256=fV51wzaMLk3BfnwzPr6oA7pwnEacZ8vYr-C37KhYFnM,1953
@@ -174,9 +176,9 @@ gui_certificate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
174
176
  gui_certificate/gui_certificate_cli.py,sha256=371nNCVmRtUePYKp_w-DVTr3C8hLAzKR2q5ZAMsaxt0,448
175
177
  gui_certificate/server.py,sha256=Gr9eGot_atmMkQxE7qzLbWBWUMYSjdXeCOce1H3uf8M,49522
176
178
  gui_certificate/templates/cert_run.html,sha256=4fd7OXyiZa8JIqdKk_4GdC4kjSI-x6iHVdRChjYatoE,66503
177
- wiliot_certificate-4.5.0a1.dist-info/licenses/LICENSE,sha256=OL5ajUNVx888yC2ogol0BKwPRLdQAF1noGuQ7WrYiAA,1068
178
- wiliot_certificate-4.5.0a1.dist-info/METADATA,sha256=S84_Fgi0giiiV9cdozXymJVykN3sJbWO8J2Y3IvLkc0,3779
179
- wiliot_certificate-4.5.0a1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
180
- wiliot_certificate-4.5.0a1.dist-info/entry_points.txt,sha256=_wnYk2F4bFn9H7ZGRwYV6WcpK8a3WNon8K7Y5xusFz4,274
181
- wiliot_certificate-4.5.0a1.dist-info/top_level.txt,sha256=WF6PUfxJ5n2-DxcXTA4oFrTlV6PX_pOYkYaQDk4Mk3g,35
182
- wiliot_certificate-4.5.0a1.dist-info/RECORD,,
179
+ wiliot_certificate-4.5.0a2.dist-info/licenses/LICENSE,sha256=OL5ajUNVx888yC2ogol0BKwPRLdQAF1noGuQ7WrYiAA,1068
180
+ wiliot_certificate-4.5.0a2.dist-info/METADATA,sha256=3enxA-11DeQYr61353acN1i_fAobhmUGWasZoYIZHdo,4124
181
+ wiliot_certificate-4.5.0a2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
182
+ wiliot_certificate-4.5.0a2.dist-info/entry_points.txt,sha256=_wnYk2F4bFn9H7ZGRwYV6WcpK8a3WNon8K7Y5xusFz4,274
183
+ wiliot_certificate-4.5.0a2.dist-info/top_level.txt,sha256=WF6PUfxJ5n2-DxcXTA4oFrTlV6PX_pOYkYaQDk4Mk3g,35
184
+ wiliot_certificate-4.5.0a2.dist-info/RECORD,,