wiliot-certificate 4.5.0a4__py3-none-any.whl → 4.5.0a6__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 (28) hide show
  1. certificate/cert_common.py +30 -19
  2. certificate/cert_config.py +10 -7
  3. certificate/cert_defines.py +1 -0
  4. certificate/cert_gw_sim.py +23 -4
  5. certificate/cert_mqtt.py +8 -0
  6. certificate/cert_prints.py +1 -0
  7. certificate/certificate_cli.py +1 -1
  8. certificate/certificate_eth_test_list.txt +1 -1
  9. certificate/certificate_test_list.txt +1 -1
  10. certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py +1 -1
  11. certificate/tests/cloud_connectivity/connection_test/connection_test.py +2 -0
  12. certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py +5 -9
  13. certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py +2 -3
  14. certificate/tests/cloud_connectivity/reboot_test/reboot_test.py +2 -0
  15. certificate/tests/cloud_connectivity/stress_test/stress_test.py +2 -3
  16. certificate/tests/cloud_connectivity/uplink_test/uplink_test.py +4 -3
  17. certificate/tests/datapath/aging_test/aging_test.py +7 -3
  18. certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json +1 -1
  19. certificate/tests/datapath/num_of_tags_test/num_of_tags_test.py +9 -5
  20. certificate/tests/datapath/stress_gen3_test/stress_gen3_test.py +3 -0
  21. certificate/tests/datapath/stress_test/stress_test.py +3 -0
  22. gui_certificate/server.py +7 -4
  23. {wiliot_certificate-4.5.0a4.dist-info → wiliot_certificate-4.5.0a6.dist-info}/METADATA +4 -14
  24. {wiliot_certificate-4.5.0a4.dist-info → wiliot_certificate-4.5.0a6.dist-info}/RECORD +28 -28
  25. {wiliot_certificate-4.5.0a4.dist-info → wiliot_certificate-4.5.0a6.dist-info}/WHEEL +0 -0
  26. {wiliot_certificate-4.5.0a4.dist-info → wiliot_certificate-4.5.0a6.dist-info}/entry_points.txt +0 -0
  27. {wiliot_certificate-4.5.0a4.dist-info → wiliot_certificate-4.5.0a6.dist-info}/licenses/LICENSE +0 -0
  28. {wiliot_certificate-4.5.0a4.dist-info → wiliot_certificate-4.5.0a6.dist-info}/top_level.txt +0 -0
@@ -479,8 +479,8 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
479
479
  # In non-sterile runs - rssi is less stable and can trigger more events
480
480
  max_count_threshold = float('inf')
481
481
  else:
482
- # In rssi movement events the alpha filter takes about 10 packets to stabilize
483
- max_count_threshold = 1 + (10 / expected_event_pkt_count)
482
+ # In rssi movement events the alpha filter takes about 13 packets to stabilize
483
+ max_count_threshold = 1 + (RSSI_EVENT_PKTS_TO_STABILIZE / expected_event_pkt_count)
484
484
  else:
485
485
  max_count_threshold = PACER_INTERVAL_CEIL_THRESHOLD
486
486
 
@@ -490,12 +490,14 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
490
490
 
491
491
  if not (PACER_INTERVAL_THRESHOLD <= len(event_pkts) / expected_event_pkt_count <= max_count_threshold):
492
492
  test.rc = TEST_FAILED
493
- test.add_reason(f"Packet count for dynamic tag {tag} is wrong!")
494
- print(f"expected_event_pkt_count = {expected_event_pkt_count}, received pkt count = {len(event_pkts)}")
493
+ msg = f"Packet count for dynamic tag {tag} is wrong! expected_event_pkt_count = {expected_event_pkt_count}, received pkt count = {len(event_pkts)}"
494
+ test.add_reason(msg)
495
+ utPrint(msg, "RED")
495
496
  if not (PACER_INTERVAL_THRESHOLD <= avg_event_pacer / event_pacing <= PACER_INTERVAL_CEIL_THRESHOLD):
496
497
  test.rc = TEST_FAILED
497
- print(f"Tag {tag} with diff_time {list(event_pkts.timestamp.diff().div(1000))}, avg_event_pacer={avg_event_pacer} exceeds threshold!")
498
- test.add_reason(f"Tag {tag} has a wrong avg time diff")
498
+ msg = f"Tag {tag} has a wrong avg time diff. diff_time {list(event_pkts.timestamp.diff().div(1000))}, avg_event_pacer={avg_event_pacer} exceeds threshold!"
499
+ test.add_reason(msg)
500
+ utPrint(msg, "RED")
499
501
 
500
502
  # Verify the tags pacer interval (without event)
501
503
  failed_tags = 0
@@ -510,8 +512,9 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
510
512
  if ((avg_pacer / pacer_interval) < PACER_INTERVAL_THRESHOLD_HIGH and (pacer_interval - avg_pacer) > 1):
511
513
  failed_tags += 1
512
514
  test.rc = TEST_FAILED
513
- print(f"Tag {tag} with diff_time {list(pkts.timestamp.diff().div(1000))}, avg_pacer={avg_pacer} exceeds {PACER_INTERVAL_THRESHOLD_HIGH} minimum threshold!")
514
- test.add_reason(f"{failed_tags}/{tags_count} tags with wrong time diff")
515
+ msg = f"Tag {tag} with diff_time {list(pkts.timestamp.diff().div(1000))}, avg_pacer={avg_pacer} exceeds {PACER_INTERVAL_THRESHOLD_HIGH} minimum threshold!"
516
+ utPrint(msg, "RED")
517
+ test.add_reason(msg)
515
518
  # Pass the test with real tags when less than 5% tag failed
516
519
  if test.data != DATA_SIMULATION and failed_tags / tags_count < 0.05:
517
520
  test.rc = TEST_PASSED
@@ -520,7 +523,9 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
520
523
  if max_received_pkts == len(pkts):
521
524
  # we fail the tag only if it received all expected pkts and pacer caluculation is valid
522
525
  failed_tags += 1
523
- print(f"Tag {tag} with diff_time {list(pkts.timestamp.diff().div(1000))}, avg_pacer={avg_pacer} exceeds {PACER_INTERVAL_CEIL_THRESHOLD} maximum threshold!")
526
+ msg = f"Tag {tag} with diff_time {list(pkts.timestamp.diff().div(1000))}, avg_pacer={avg_pacer} exceeds {PACER_INTERVAL_CEIL_THRESHOLD} maximum threshold!"
527
+ utPrint(msg, "RED")
528
+ test.add_reason(msg)
524
529
  else:
525
530
  print(f"Tag {tag} received only {len(pkts)} pkts out of {max_received_pkts}, avg_pacer failed but skipping pacer ceil validation")
526
531
  if failed_tags / tags_count > 0.2: # Fail the test on ceil threshold only when more than 20% tag failed
@@ -600,6 +605,7 @@ def run_event_test_phase(test, phase, datapath_module, values, scan_time, event_
600
605
  scan_time_multiplier = 1
601
606
  delay = DATA_SIM_EVENT_TESTING_DELAY_MS
602
607
  if "rssi" in phase:
608
+ test.sterile_run = is_quiet_setup_running()
603
609
  delay = DATA_SIM_RSSI_EVENT_TESTING_DELAY_MS
604
610
  scan_time_multiplier = (1 / 3)
605
611
  fields += [BRG_RSSI_MOVEMENT_THRESHOLD]
@@ -1057,6 +1063,15 @@ def get_module_if_pkt(test):
1057
1063
  print(pkts[-1][MGMT_PKT].pkt)
1058
1064
  return test, pkts[-1][MGMT_PKT].pkt
1059
1065
 
1066
+ def get_gw_api_version(mqttc):
1067
+ messages = cert_mqtt.get_all_status_pkts(mqttc)
1068
+ for msg in messages:
1069
+ if GW_CONF in msg: # JSON
1070
+ return msg[GW_CONF][GW_API_VERSION]
1071
+ if GW_STATUS in msg: # protobuf
1072
+ return msg[GW_STATUS][GW_API_VERSION]
1073
+ return None
1074
+
1060
1075
  def get_cfg_hash(test):
1061
1076
  utPrint(f"Fetching BRG cfg hash for BRG {test.active_brg.id_str}", "BLUE")
1062
1077
  test, module_if_pkt = get_module_if_pkt(test)
@@ -1374,7 +1389,7 @@ def timestamps_validation(wiliot_pkts_validation_phase, all_messages_in_test, up
1374
1389
  return wiliot_pkts_validation_phase
1375
1390
  previous_ts = inner_pkt[TIMESTAMP]
1376
1391
  else:
1377
- if inner_pkt[TIMESTAMP] <= previous_ts:
1392
+ if inner_pkt[TIMESTAMP] < previous_ts:
1378
1393
  wiliot_pkts_validation_phase.rc = TEST_FAILED
1379
1394
  wiliot_pkts_validation_phase.reason = f'Timestamp is not incremental for inner packet {inner_pkt[PAYLOAD]}'
1380
1395
  return wiliot_pkts_validation_phase
@@ -1433,11 +1448,8 @@ def generate_graph_stress_test(test, results, test_pkts_received):
1433
1448
 
1434
1449
 
1435
1450
  def stress_analysis(test, pps, sent_pkts, received_pkts):
1436
- _sent_pkts = []
1437
- for pkt in sent_pkts:
1438
- adva_endianness_change = change_endianness(pkt[:12]) + pkt[12:] # Switch to big endian adva
1439
- _sent_pkts.append(adva_endianness_change)
1440
-
1451
+
1452
+ _sent_pkts = [p[12:] for p in sent_pkts]
1441
1453
  sent_df = pd.DataFrame(_sent_pkts, columns=[PACKETS])
1442
1454
  received_df = pd.DataFrame(received_pkts, columns=[PACKETS])
1443
1455
 
@@ -1446,16 +1458,15 @@ def stress_analysis(test, pps, sent_pkts, received_pkts):
1446
1458
  pkts_sent_count = len(sent_df)
1447
1459
  pkts_received_count = len(merged_df)
1448
1460
 
1449
- # Prints
1450
- print(f'Number of packets sent: {pkts_sent_count}')
1451
- print(f'Number of packets received: {pkts_received_count}')
1461
+ # Prints and calculations
1452
1462
  percentage_received = round(pkts_received_count * 100 / pkts_sent_count)
1463
+ utPrint(f'Sent: {pkts_sent_count}, Received: {pkts_received_count} ({percentage_received}%)', "BLUE")
1453
1464
  received_pps = pps * percentage_received / 100
1454
1465
 
1455
1466
  # PASS/FAIL logic
1456
1467
  if percentage_received < 1: # If less than 1% of the packets were received, fail the test
1457
1468
  test.set_phase_rc(str(pps), TEST_FAILED)
1458
- test.add_phase_reason(str(pps), "Insufficient amount of packets were scanned & uploaded by the gateway")
1469
+ test.add_phase_reason(str(pps), f"{percentage_received}% of the packets were scanned & uploaded by the gateway")
1459
1470
  else:
1460
1471
  test.set_phase_rc(str(pps), TEST_PASSED)
1461
1472
  test.add_phase_reason(str(pps), f"received pps: {received_pps} ({percentage_received}% of packets)")
@@ -40,7 +40,7 @@ def gw_configure(test, cfg={}, version="", extended_cfg={}, ret_pkt=False, wait=
40
40
  while (datetime.datetime.now() - start_time).seconds < DEFAULT_GW_FIELD_UPDATE_TIMEOUT:
41
41
  for p in cert_mqtt.get_all_status_pkts(mqttc):
42
42
  if GW_CONF in p or GW_STATUS in p:
43
- test.gw_api_version = p[GW_CONF][GW_API_VERSION] if GW_CONF in p else p[GW_STATUS][GW_API_VERSION]
43
+ test.gw_api_version = (p.get(GW_CONF, {}).get(GW_API_VERSION) or p.get(GW_STATUS, {}).get(GW_API_VERSION))
44
44
  if target == DUT and is_gw(test.dut):
45
45
  test.dut.gw_api_version = test.gw_api_version
46
46
  print_pkt(p)
@@ -79,15 +79,18 @@ def gw_fw_upgrade(test, version, board_type, target=DUT):
79
79
  def create_gw_config(test, cfg, target=DUT, version=""):
80
80
  gw = test.dut if is_gw(test.dut) and target == DUT else test.tester
81
81
  if version:
82
- return dict({GW_CONF:{LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, WIFI_VERSION: version[WIFI_VERSION],
83
- BLE_VERSION: version[BLE_VERSION], GW_API_VERSION: gw.gw_api_version, ADDITIONAL:dict(cfg)}})
82
+ conf = {LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, WIFI_VERSION: version[WIFI_VERSION],
83
+ BLE_VERSION: version[BLE_VERSION], ADDITIONAL: dict(cfg)}
84
84
  elif gw.gw_orig_versions:
85
- return dict({GW_CONF:{LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, WIFI_VERSION: gw.gw_orig_versions[WIFI_VERSION],
86
- BLE_VERSION: gw.gw_orig_versions[BLE_VERSION], GW_API_VERSION: gw.gw_api_version, ADDITIONAL:dict(cfg)}})
85
+ conf = {LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, WIFI_VERSION: gw.gw_orig_versions[WIFI_VERSION],
86
+ BLE_VERSION: gw.gw_orig_versions[BLE_VERSION], ADDITIONAL: dict(cfg)}
87
87
  # Protection for FDM gw config
88
88
  else:
89
- return dict({GW_CONF:{LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, GW_API_VERSION: gw.gw_api_version,
90
- ADDITIONAL:dict(cfg)}})
89
+ conf = {LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, ADDITIONAL: dict(cfg)}
90
+ # If api version was not sent in gw info then the gw_api_version is None, we don't want to set it in the config
91
+ if gw.gw_api_version is not None:
92
+ conf[GW_API_VERSION] = gw.gw_api_version
93
+ return dict({GW_CONF: conf})
91
94
 
92
95
  def gw_downlink(test, raw_tx_data="", is_ota=False, version="", max_duration=100, max_retries=8, target=DUT):
93
96
  mqttc = test.get_mqttc_by_target(target)
@@ -307,6 +307,7 @@ BLE5_MAX_DURATION_SEC = BLE5_MAX_DURATION_MS // 1000
307
307
  DATA_SIM_EVENT_TESTING_DELAY_SEC = DATA_SIM_EVENT_TESTING_DELAY_MS / 1000
308
308
  DATA_SIM_RSSI_EVENT_TESTING_DELAY_SEC = DATA_SIM_RSSI_EVENT_TESTING_DELAY_MS / 1000
309
309
  DATA_SIM_EVENT_PACER_INTERVAL_TESTING = 10
310
+ RSSI_EVENT_PKTS_TO_STABILIZE = 13 # The alpha filter takes about 13 packets to stabilize
310
311
  PACKETS_ECHO_OFF = 16
311
312
  TEST_PASSED = 0
312
313
  TEST_FAILED = -1
@@ -198,7 +198,7 @@ def gw_app_reponse(ble_serial):
198
198
  start_time = datetime.datetime.now()
199
199
  while (datetime.datetime.now() - start_time).seconds < 2:
200
200
  input = read_from_ble(ble_serial)
201
- if GW_APP_VERSION_HEADER in input:
201
+ if input is not None and GW_APP_VERSION_HEADER in input:
202
202
  print(input)
203
203
  ble_chip_sw_ver = re.search(r'WILIOT_GW_BLE_CHIP_SW_VER=(\d+\.\d+\.\d+)', input).group(1)
204
204
  ble_mac_address = re.search(r'WILIOT_GW_BLE_CHIP_MAC_ADDRESS=([0-9A-F]{12})', input).group(1)
@@ -333,6 +333,22 @@ def handle_cmds(input, ble_serial):
333
333
  utPrint(f"COM tester recovered", "CYAN")
334
334
  write_to_ble(ble_serial, f"{CONNECTIVITY_STATUS} 1 1")
335
335
 
336
+ def validate_port(port):
337
+ try:
338
+ with serial.serial_for_url(url=port, baudrate=921600, timeout=SERIAL_TIMEOUT) as ser:
339
+ ser.flushInput()
340
+ write_to_ble(ser, txt=VERSION, print_enable=True)
341
+ start_time = datetime.datetime.now()
342
+ while (datetime.datetime.now() - start_time).seconds < 2:
343
+ input = read_from_ble(ser)
344
+ if input is not None and GW_APP_VERSION_HEADER in input:
345
+ return True
346
+ return False
347
+ except Exception as e:
348
+ utPrint(f"Failed to open serial: {e}", "RED")
349
+ return False
350
+
351
+
336
352
  def gw_sim_run(port, gw_id, custom_broker, disable_interference_analyzer=False):
337
353
 
338
354
  # Init serial side
@@ -340,8 +356,11 @@ def gw_sim_run(port, gw_id, custom_broker, disable_interference_analyzer=False):
340
356
  print("\nNo COM port given. Scanning for available ports:")
341
357
  for port, desc, hwid in sorted(serial.tools.list_ports.comports()):
342
358
  print("{}: {} [{}]".format(port, desc, hwid))
359
+ if validate_port(port):
360
+ utPrint(f"Found the tester's port ({port})", "GREEN")
361
+ break
343
362
  if not port:
344
- print("\nNo available COM port found!")
363
+ print("\nNo available COM port found! Please verify a tester is connected and set the correct --port parameter.")
345
364
  sys.exit(-1)
346
365
  print(f"###>>> GW SIM STARTED WITH PORT {port}")
347
366
  ble_serial = serial.serial_for_url(url=port, baudrate=921600, timeout=SERIAL_TIMEOUT)
@@ -370,8 +389,8 @@ def gw_sim_run(port, gw_id, custom_broker, disable_interference_analyzer=False):
370
389
  write_to_ble(ble_serial, RESET_GW, sleep=5)
371
390
  gw_app_res = gw_app_reponse(ble_serial)
372
391
  if gw_app_res[0] == TEST_FAILED:
373
- print("ERROR: didn't get version response!")
374
- return
392
+ utPrint("ERROR: didn't get version response! Please verify a tester is connected and set the correct --port parameter.", "RED")
393
+ sys.exit(1)
375
394
  os.environ[GW_SIM_BLE_MAC_ADDRESS] = gw_app_res[1]
376
395
  os.environ[GW_APP_VERSION_HEADER] = gw_app_res[2]
377
396
  write_to_ble(ble_serial, STOP_ADVERTISING, sleep=2)
certificate/cert_mqtt.py CHANGED
@@ -299,6 +299,14 @@ def mqttc_init(gw_id, custom_broker, data=DATA_REAL_TAGS):
299
299
  mqttc.subscribe(mqttc.status_topic)
300
300
  print(f"Subscribed to status topic: {mqttc.status_topic}")
301
301
 
302
+ # v2 protobuf topics
303
+ mqttc.data_topic_pb = re.sub(r'^([^/]+)', r'\1-v2', custom_broker[CUSTOM_BROKER_DATA_TOPIC])
304
+ mqttc.subscribe(mqttc.data_topic_pb)
305
+ print(f"Subscribed to data topic: {mqttc.data_topic_pb}")
306
+ mqttc.status_topic_pb = re.sub(r'^([^/]+)', r'\1-v2', custom_broker[CUSTOM_BROKER_STATUS_TOPIC])
307
+ mqttc.subscribe(mqttc.status_topic_pb)
308
+ print(f"Subscribed to status topic: {mqttc.status_topic_pb}")
309
+
302
310
  mqttc.flush_pkts = mqttc._userdata[PKTS].flush
303
311
  mqttc.flush_data_pkts = mqttc._userdata[PKTS].flush_data
304
312
  mqttc.flush_status_pkts = mqttc._userdata[PKTS].flush_status
@@ -18,6 +18,7 @@ COLORS = {
18
18
  }
19
19
  color = lambda c, t : COLORS["BOLD"]+COLORS[c]+t+COLORS["ENDC"]
20
20
  pipeline_running = lambda : True if 'BITBUCKET_BUILD_NUMBER' in os.environ else False
21
+ is_quiet_setup_running = lambda : True if 'CI_GW' in os.environ else False
21
22
  camelcase_to_title = lambda s: ' '.join(word.capitalize() for word in re.split('(?=[A-Z])', s))
22
23
  SEP = '\n' + '#'*100 + '\n'
23
24
  SEP2 = '\n' + '#'*100 + '\n' + '#'*100 + '\n'
@@ -40,7 +40,7 @@ class CertificateCLI:
40
40
  self.parser.add_argument('--dut', required=True, help="Tested device ID. When DUT is a combo device, use <Gateway_ID>:<BLE_MAC>")
41
41
  self.parser.add_argument('--combo_ble_addr', default="", help="Combo device BLE MAC address" + argparse.SUPPRESS)
42
42
  self.parser.add_argument('--tester', default=GW_SIM_PREFIX, help='Tester id to run on the test, SIM prefix is default and used for COM tester')
43
- self.parser.add_argument('--port', '-p', default='', help='UART PORT connection to use for the run, if not provided last available port is used')
43
+ self.parser.add_argument('--port', '-p', default='', help='UART PORT connection to use for the run, if not provided tries to scan for tester port')
44
44
  self.parser.add_argument('--custom_broker', '-cb', required=True, help='Choose custom MQTT broker configuration json file to use for the run,' \
45
45
  ' for explanation of the format see https://community.wiliot.com/customers/s/article/Wiliot-Gateway-Certification')
46
46
  self.parser.add_argument('--clean', default=False, action='store_true', help='Clean old logs before running the tests')
@@ -49,7 +49,7 @@ datapath/rx_rate_gen2_test mid_values diff_pacer min_value max_value diff_rate
49
49
  datapath/rx_rate_gen3_test mid_values diff_pacer min_value max_value diff_rate
50
50
  datapath/stress_test rep3 rep2 rep1
51
51
  datapath/stress_gen3_test rep3 rep2 rep1
52
- datapath/num_of_tags_test 5000
52
+ datapath/num_of_tags_test 2500
53
53
 
54
54
  # ------------- pwr_mgmt -------------
55
55
  pwr_mgmt/pwr_mgmt_test
@@ -49,7 +49,7 @@ datapath/rx_rate_gen2_test mid_values diff_pacer min_value max_value diff_rate
49
49
  datapath/rx_rate_gen3_test mid_values diff_pacer min_value max_value diff_rate
50
50
  datapath/stress_test rep3 rep2 rep1
51
51
  datapath/stress_gen3_test rep3 rep2 rep1
52
- datapath/num_of_tags_test 5000
52
+ datapath/num_of_tags_test 4500
53
53
 
54
54
  # ------------- pwr_mgmt -------------
55
55
  pwr_mgmt/pwr_mgmt_test
@@ -188,7 +188,7 @@ def run(test):
188
188
  payload = cert_common.generate_adv_payload(SCAN_TEST_INDICATOR, unique_pkt=True)
189
189
 
190
190
  # Transmitting packets on all channels
191
- utPrint(f"Transmitting in parallel on all 3 main cahnnels for {ADV_DURATION} seconds", "WARNING")
191
+ utPrint(f"Transmitting in parallel on all 3 main channels for {ADV_DURATION} seconds", "WARNING")
192
192
  num_of_sent_pkts = ADV_DURATION * PPS
193
193
  strat_trans_time_ms = time.time() * 1000
194
194
 
@@ -41,9 +41,11 @@ def run(test):
41
41
  timeout = datetime.datetime.now() + datetime.timedelta(minutes=TIMEOUT_IN_MINUTES)
42
42
  while datetime.datetime.now() < timeout:
43
43
  gw_type, msg = cert_common.get_gw_type(dut_mqttc)
44
+ gw_api_version = cert_common.get_gw_api_version(dut_mqttc)
44
45
  if gw_type is not None:
45
46
  break
46
47
  print_update_wait(5)
48
+ test.dut.gw_api_version = gw_api_version
47
49
 
48
50
  # generate logs
49
51
  cert_mqtt.generate_log_file(test, "connection")
@@ -14,19 +14,15 @@ NUM_OF_BRGS = 3
14
14
 
15
15
 
16
16
  # HELPER FUNCTIONS
17
- def duplication_analysis(test, pkts, received_pkts):
17
+ def duplication_analysis(test, sent_pkts, received_pkts):
18
18
  if len(received_pkts) == 0:
19
19
  test.rc = TEST_FAILED
20
20
  test.reason = "No packets were received!"
21
21
  return test
22
22
 
23
- _sent_pkts = []
24
- for pkt in pkts:
25
- pkt_str = pkt.get_pkt()
26
- adva_endianness_change = cert_common.change_endianness(pkt_str[:12]) + pkt_str[12:] # Switch to big endian adva
27
- _sent_pkts.append(adva_endianness_change)
28
-
23
+ _sent_pkts = [p.get_pkt()[12:] for p in sent_pkts]
29
24
  sent_df = pd.DataFrame(_sent_pkts, columns=[PACKETS])
25
+ received_pkts = [p[PAYLOAD] for p in received_pkts]
30
26
  received_df = pd.DataFrame(received_pkts, columns=[PACKETS])
31
27
 
32
28
  merged_df = pd.merge(sent_df, received_df, on=PACKETS, how='inner')
@@ -74,11 +70,11 @@ def run(test):
74
70
  pixel_sim_thread = cert_data_sim.GenericSimThread(test=test, pkts=pkts, send_single_cycle=True)
75
71
  pixel_sim_thread.start()
76
72
 
77
- mqtt_scan_wait(test, 10 + test.dut.upload_wait_time)
73
+ mqtt_scan_wait(test, 12 + test.dut.upload_wait_time)
78
74
  cert_mqtt.dump_pkts(test, log="deduplication_test")
79
75
  recieved_pkts = cert_mqtt.get_all_data_pkts(dut_mqttc, indicator=UPLINK_TEST_INDICATOR)
80
76
  pixel_sim_thread.stop()
81
77
 
82
- test = duplication_analysis(test, pkts, [p[ALIAS_BRIDGE_ID] + p[PAYLOAD] for p in recieved_pkts])
78
+ test = duplication_analysis(test, pkts, recieved_pkts)
83
79
 
84
80
  return cert_common.test_epilog(test)
@@ -83,9 +83,8 @@ def run(test):
83
83
  test.add_phase_reason(str(pps), reason)
84
84
  utPrint(f"Phase {pps} failed validation: {reason}", "RED")
85
85
  continue
86
- test, received_pps = cert_common.stress_analysis(
87
- test, pps, generated_payloads,
88
- [(p[ALIAS_BRIDGE_ID] + p[AGGREGATED_PAYLOAD]) for p in phase_pkts_received])
86
+ phase_pkts_received = [p[AGGREGATED_PAYLOAD] for p in phase_pkts_received]
87
+ test, received_pps = cert_common.stress_analysis(test, pps, generated_payloads, phase_pkts_received)
89
88
  results.extend([pps, received_pps])
90
89
  cert_mqtt.generate_log_file(test, str(pps))
91
90
 
@@ -33,9 +33,11 @@ def run(test):
33
33
  timeout = datetime.datetime.now() + datetime.timedelta(minutes=TIMEOUT_IN_MINUTES)
34
34
  while datetime.datetime.now() < timeout:
35
35
  gw_type, msg = cert_common.get_gw_type(dut_mqttc)
36
+ gw_api_version = cert_common.get_gw_api_version(dut_mqttc)
36
37
  if gw_type is not None:
37
38
  break
38
39
  print_update_wait(5)
40
+ test.dut.gw_api_version = gw_api_version
39
41
 
40
42
  # generate logs
41
43
  cert_mqtt.generate_log_file(test, "reboot")
@@ -81,9 +81,8 @@ def run(test):
81
81
  test.add_phase_reason(str(pps), reason)
82
82
  utPrint(f"Phase {pps} failed validation: {reason}", "RED")
83
83
  continue
84
- test, received_pps = cert_common.stress_analysis(
85
- test, pps, generated_payloads,
86
- [(p[ALIAS_BRIDGE_ID] + p[PAYLOAD]) for p in phase_pkts_received])
84
+ phase_pkts_received = [p[PAYLOAD] for p in phase_pkts_received]
85
+ test, received_pps = cert_common.stress_analysis(test, pps, generated_payloads, phase_pkts_received)
87
86
  results.extend([pps, received_pps])
88
87
  cert_mqtt.generate_log_file(test, str(pps))
89
88
 
@@ -24,10 +24,11 @@ def uplink_analysis(test, sent_pkts, received_pkts, pkt_type):
24
24
  return test
25
25
 
26
26
  # Verify packets were received from NUM_OF_BRGS bridges
27
- received_brgs = len(set([p[ALIAS_BRIDGE_ID] for p in received_pkts]))
28
- if received_brgs != NUM_OF_BRGS:
27
+ received_brgs = set([p[ALIAS_BRIDGE_ID] for p in received_pkts])
28
+ if len(received_brgs) != NUM_OF_BRGS:
29
29
  test.set_phase_rc(pkt_type, TEST_FAILED)
30
- test.add_phase_reason(pkt_type, f"Received packets from {received_brgs} bridges instead of {NUM_OF_BRGS} bridges!")
30
+ test.add_phase_reason(pkt_type, f"Received packets from {len(received_brgs)} bridges instead of {NUM_OF_BRGS} bridges!")
31
+ utPrint(f"Received packets from {received_brgs} bridges instead of {NUM_OF_BRGS} bridges!", "RED")
31
32
  return test
32
33
 
33
34
  _sent_pkts = [p.get_pkt()[12:] for p in sent_pkts]
@@ -105,11 +105,15 @@ def aging_analysis(test, datapath_module, pacer_interval, num_of_sim_tags):
105
105
  if test.rc == TEST_FAILED:
106
106
  return test
107
107
  utPrint(f"\nEnd of aging time pixels count: {second_floor_tags_ctr}\n", "BLUE")
108
- if ((test.sterile_run and second_floor_tags_ctr != 0) or
109
- (not test.sterile_run and second_floor_tags_ctr > TAGS_CTR_OVER_THRESHOLD * first_floor_tags_ctr)):
108
+ if test.sterile_run and second_floor_tags_ctr != 0:
110
109
  test.rc = TEST_FAILED
111
110
  test.add_reason("Pixel count is higher than expected. Looks like aging time is too long.\n"
112
- f"tags_ctr value: {second_peak_tags_ctr}\nFloor number of pixels: {second_floor_tags_ctr}")
111
+ f"Number of pixels after aging time: {second_floor_tags_ctr}")
112
+ elif not test.sterile_run and (second_floor_tags_ctr > TAGS_CTR_OVER_THRESHOLD * first_floor_tags_ctr):
113
+ test.rc = TEST_FAILED
114
+ test.add_reason("Pixel count is higher than expected. Looks like aging time is too long.\n"
115
+ f"Number of pixels after aging time: {second_floor_tags_ctr},"
116
+ f" before tags simulation was: {second_peak_tags_ctr}\n")
113
117
  return test
114
118
 
115
119
 
@@ -14,5 +14,5 @@
14
14
  "multiBridgeTest": 0,
15
15
  "gwOnlyTest": 0,
16
16
  "dataSimOnlyTest": 1,
17
- "allSupportedValues": [500, 1000, 2500, 5000]
17
+ "allSupportedValues": [500, 1000, 2500, 4500]
18
18
  }
@@ -51,9 +51,11 @@ def run(test):
51
51
  cert_config.send_brg_action(test, ag.ACTION_SEND_HB)
52
52
  test, mgmt_pkts = cert_common.scan_for_mgmt_pkts(test, [eval_pkt(f'Brg2GwHbV{test.active_brg.api_version}')])
53
53
  if not mgmt_pkts:
54
- test.rc = TEST_FAILED
55
- test.add_reason("Didn't find ACTION HB pkt")
56
- break
54
+ reason = "Didn't find ACTION HB pkt"
55
+ utPrint(reason, "RED")
56
+ test.set_phase_rc(param.name, TEST_FAILED)
57
+ test.add_phase_reason(param.name, "Didn't find ACTION HB pkt")
58
+ continue
57
59
 
58
60
  num_of_tags_HB = mgmt_pkts[0][MGMT_PKT].pkt.tags_ctr
59
61
  print(f"Tags from HB: {num_of_tags_HB}\n ")
@@ -62,11 +64,13 @@ def run(test):
62
64
 
63
65
  # compare the numbers of tags that come from the brg, success in 95% from number of tags (value) or more.
64
66
  if num_of_tags < (param.value * 0.95):
65
- test.add_reason(f"Received {num_of_tags} pixels, expected: {param.name} pixels!")
67
+ test.add_reason(f"Received {num_of_tags} different pixels, expected: {param.name} pixels!")
68
+ test.rc = TEST_FAILED
66
69
 
67
70
  # compare the counter tags in the HB packet
68
71
  if num_of_tags_HB < 0.95 * param.value or num_of_tags_HB > (param.value + 100):
69
- test.add_reason(f"HB counter: {num_of_tags_HB}, expected: {param.name}!")
72
+ test.add_reason(f"HB counter num_of_tags: {num_of_tags_HB}, expected: {param.name}!")
73
+ test.rc = TEST_FAILED
70
74
  # param epilog
71
75
  time.sleep(10)
72
76
  cert_mqtt.generate_log_file(test, param.name)
@@ -206,4 +206,7 @@ def run(test):
206
206
  # Re-enable unified packets deduplication
207
207
  cert_config.gw_action(test, f"{DEDUPLICATION_PKTS} 1")
208
208
 
209
+ # wait a few seconds to ensure bridge relaxed before next test
210
+ wait_time_n_print(60)
211
+
209
212
  return cert_common.test_epilog(test, revert_brgs=True, modules=[datapath_module])
@@ -205,4 +205,7 @@ def run(test):
205
205
  # Re-enable unified packets deduplication
206
206
  cert_config.gw_action(test, f"{DEDUPLICATION_PKTS} 1")
207
207
 
208
+ # wait a few seconds to ensure bridge relaxed before next test
209
+ wait_time_n_print(60)
210
+
208
211
  return cert_common.test_epilog(test, revert_brgs=True, modules=[datapath_module])
gui_certificate/server.py CHANGED
@@ -42,9 +42,7 @@ DEFAULT_CUSTOM_BROKER = {
42
42
  "brokerUrl": "mqtts://broker.hivemq.com",
43
43
  "username": "",
44
44
  "password": "",
45
- "updateTopic": "update/wiliot/<gatewayId>",
46
- "statusTopic": "status/wiliot/<gatewayId>",
47
- "dataTopic": "data/wiliot/<gatewayId>"
45
+ "ownerId": ""
48
46
  }
49
47
 
50
48
  app = Flask(__name__)
@@ -496,12 +494,17 @@ def _write_custom_broker_config(form_data, cert_schema_title="cert_run") -> str:
496
494
  field_name = f"{field_prefix}{field}"
497
495
  value = form_data.get(field_name, "")
498
496
 
499
- # Convert port to int if it's a number
500
497
  if field == "port":
498
+ # Convert port to int if it's a number
501
499
  try:
502
500
  broker_config[field] = int(value) if value else DEFAULT_CUSTOM_BROKER[field]
503
501
  except (ValueError, TypeError):
504
502
  broker_config[field] = DEFAULT_CUSTOM_BROKER[field]
503
+ elif field == "ownerId":
504
+ # Convert ownerId to topics
505
+ broker_config[CUSTOM_BROKER_UPDATE_TOPIC] = f'update/{value}/<{GW_ID}>'
506
+ broker_config[CUSTOM_BROKER_DATA_TOPIC] = f'data/{value}/<{GW_ID}>'
507
+ broker_config[CUSTOM_BROKER_STATUS_TOPIC] = f'status/{value}/<{GW_ID}>'
505
508
  else:
506
509
  broker_config[field] = value
507
510
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wiliot_certificate
3
- Version: 4.5.0a4
3
+ Version: 4.5.0a6
4
4
  Summary: A library for certifying Wiliot-compliant boards
5
5
  Author-email: Wiliot <support@wiliot.com>
6
6
  License-Expression: MIT
@@ -38,10 +38,10 @@ 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`)
41
- - Registration Certificate (`wlt-cert-reg`)
41
+ - Registration Certificate Test (`wlt-cert-reg`)
42
42
 
43
43
  # Versioning:
44
- wiliot-certificate versions 4.5.x are compatible with firmware version >=4.5.0 (API VERSION: 13)
44
+ wiliot-certificate versions 4.5.x are compatible with firmware version >=4.4.0 (API VERSION: 12)
45
45
 
46
46
  ## Installing wiliot-certificate
47
47
  ````commandline
@@ -55,7 +55,7 @@ wlt-cert
55
55
  ````
56
56
  This tool is the default to test and certify your device.
57
57
  It runs a setup wizard that walks you through the initialization steps before running the tests.
58
- 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-Certification)).
58
+ You'll need a [validation schema](https://community.wiliot.com/customers/s/article/Validation-Schema) and a [tester device](https://community.wiliot.com/customers/s/article/Wiliot-Certification).
59
59
  Once set up it opens a terminal and tests your device.
60
60
 
61
61
 
@@ -87,10 +87,6 @@ Use -h for details on the arguments (see [Registration](https://community.wiliot
87
87
  ##### Cloud Connectivity & Misc
88
88
  - Board type registered within the Board Type Management system
89
89
  - Bridge OTA progress reporting
90
- ##### Power management
91
- - Functionality of energize and transmit in sleep mode
92
- ##### Edge management
93
- - Timing of heartbeat and interface packets
94
90
  ##### Module Energy 2400
95
91
  - Functionality of energy pattern, output power and duty cycle
96
92
  ##### Module Energy SUB1G
@@ -98,12 +94,6 @@ Use -h for details on the arguments (see [Registration](https://community.wiliot
98
94
  ##### Module Datapath
99
95
  - RSSI edge cases: -127 and 0
100
96
  - Functionality of transmission pattern, output power
101
- - Pacer interval with channel 10 and 500k modulation
102
- - Pacer interval using GEN3 Pixels
103
- - Packet filter: the following configuration - DEBUG, TEMP & DEBUG, TEMPS & DEBUG & ADVANCE
104
- - Rx rate feature with extended advertising
105
- - Functionality of adaptive pacer algorithm
106
- - Supported Pixels for extended advertising and GEN3
107
97
  ##### Calibration
108
98
  - Functionality of output power and interval calibration
109
99
  - 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=M28Jt7ehM3K4KYc1ZdrRNMV0gtK4iiihPhF7bmpP_m0,72124
3
- certificate/cert_config.py,sha256=zgs0taYur_tKX18B8PHLREwrf1XWTUCVszCUzVkz-mY,22318
2
+ certificate/cert_common.py,sha256=rY1Y2nvGu-AtYvyJUrMiJ9LHrkNhI0nmVcV3ZCrNiM4,72462
3
+ certificate/cert_config.py,sha256=Z2F2EV6Ow0nVBrlBRkAM7H7dcyZtFU0eq8hNKPob4ss,22380
4
4
  certificate/cert_data_sim.py,sha256=Oe8sUaIh-NqLFr3QUkhcyUu8ZH0osy1VoOY3fRx-mmk,13785
5
- certificate/cert_defines.py,sha256=v1PTOAz6v9lTzGUoR6S5COlBcn7DyP8ds6pEmCa9S_Y,17386
6
- certificate/cert_gw_sim.py,sha256=c1OdfVWRphLL6ZA1J-TgSqwMrfckRyvm1lOxWqxIl_E,16641
7
- certificate/cert_mqtt.py,sha256=l7of-UGvZiVTHorq3SN8aKc4kESQKaLjElr8I6ndrxI,22445
8
- certificate/cert_prints.py,sha256=z8Bw3ZHiLr6yN3EbRkVvmUMkwLt6VNj0MUX1mUvdHQI,7025
5
+ certificate/cert_defines.py,sha256=jmyAVA1ypy2VW9JNooiO7scQGSUPwpThfVcfTi3FXII,17496
6
+ certificate/cert_gw_sim.py,sha256=mxa591grg-JhcSKXiqgBwjTm6xuqekVFEpwBaqD1lyU,17568
7
+ certificate/cert_mqtt.py,sha256=kUYVoyMonbcos7s8BHulA54eX7z6WYU9hR3wsYz0UMg,22881
8
+ certificate/cert_prints.py,sha256=uuaLjleRmbPVh-k0KDjyfIjQd0VtVIAe401UODBLLv8,7100
9
9
  certificate/cert_protobuf.py,sha256=j8Tmm86VXONMvSTBl4Tmwt5G1jJRcJg05nJj7YHbpoM,3824
10
10
  certificate/cert_results.py,sha256=Lux5UQGSZG_0wq1uSO7ETri-JrYT4nXNOHdriZUmcCg,30051
11
11
  certificate/cert_utils.py,sha256=ADPFJXLOZFzKtJoql3j1OKpkB9JgnJiv8VwEJW7kYJk,29038
12
12
  certificate/certificate.py,sha256=KYOtROsBIZE9vYZKtPMnU9LyvQQ60fXodi3WZqRMluA,9310
13
- certificate/certificate_cli.py,sha256=gQdvXkzcC9TScqOCqvfQxl1eOKWZ8jCRKALBpvlS2pc,5028
14
- certificate/certificate_eth_test_list.txt,sha256=xlfEd7AMDG1d30c6AxKUZg2uDfI5YtkqpRWEfYgJAwQ,6216
13
+ certificate/certificate_cli.py,sha256=wd4X-ih6gPVGUWKLIXluIW40wYPJnMGfP_rD-dwPWk8,5030
14
+ certificate/certificate_eth_test_list.txt,sha256=KxG08Ry2SuwHnq3ovGWEo4utxIIPkQoEzHdbksOQcuU,6216
15
15
  certificate/certificate_sanity_test_list.txt,sha256=JjpFxyxjWbylxnH8FyjPFgO2w-WaT3Nm0bcYhD0shhk,3487
16
- certificate/certificate_test_list.txt,sha256=O1nA_QUgFujppEQURlrMpfYh0jWXmU6JwgoI4ZLfzhs,6156
16
+ certificate/certificate_test_list.txt,sha256=7hA9hrhhy0oLC1EPgpP7IvCkMdrQkdr0osmiJkYwKZ4,6156
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
@@ -30,34 +30,34 @@ certificate/tests/cloud_connectivity/acl_test/acl_test.py,sha256=NBC9E1h2agpKYEs
30
30
  certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.json,sha256=0U1RIjBFsfGtl_nTabNzRRPQYJs3F4JIivKIImuR1Y8,850
31
31
  certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.py,sha256=xqB65yWM754UfWF1N_h4bI4kuEajAqMvcdFjRu0OFfI,1873
32
32
  certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json,sha256=Sc4Xp3VPY9GjNKsQFcjAr9fyD9_MZMBfxsgpo31Jk-Y,755
33
- certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py,sha256=Q1VKsCofRImeOysN6ZweZcVLYHWf5t1_hgKh9VfZtRU,10179
33
+ certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py,sha256=K6G1j4XKEbFWgPl_DWlbYUJw07I78EenJxFS60uQLek,10179
34
34
  certificate/tests/cloud_connectivity/connection_test/connection_test.json,sha256=xr-d-DnzbItkXE8oBTZ31Fr0huhILdxXTQFJyqd6FYc,939
35
- certificate/tests/cloud_connectivity/connection_test/connection_test.py,sha256=VMG3-c9BpWYzVvp3amKMh8THP5Tl_hGsLUG9eaS42aE,2456
35
+ certificate/tests/cloud_connectivity/connection_test/connection_test.py,sha256=Gl8VWlbOQxdnvqPEUbAe4Wakk7CLE3byRFhJoxObqi4,2568
36
36
  certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.json,sha256=-6va5_YT-IDdEJZjJUlV3L6CcGODPcLWgcZUE5Dv01k,710
37
- certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py,sha256=FUS572_B3U-EjGUJNkxFpQyOjzm7x3J5FH0Bass8EhQ,3514
37
+ certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py,sha256=Dbnah1fhaidnwLbPj9qz1H_lKr4-3jg8BvN7dsNg3oQ,3342
38
38
  certificate/tests/cloud_connectivity/downlink_test/downlink_test.json,sha256=VR2EHtOLHuh0ETSbgRGOuorHcuJPKBkk1hwM_7g_Dj4,878
39
39
  certificate/tests/cloud_connectivity/downlink_test/downlink_test.py,sha256=73uszwCvY2Rkg71Rqmco-meYLNBuh0vBIPxAeDo7zoU,8508
40
40
  certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json,sha256=W0kAvLyzxUsaEKiuGu2Eq-Al5g-ov2zapFF3FXlgdq0,954
41
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py,sha256=-NFnFJ2PZxWalCg1umhP3KG_phidocJFhpH0j7Mu9xk,4291
41
+ certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py,sha256=q68BmQtOtauiUgZAC2TK7XXjRLyDkeT9IkfQ5Q8ZewI,4293
42
42
  certificate/tests/cloud_connectivity/reboot_test/reboot_test.json,sha256=QZMqxrUul_jEvoQJKdWjzXxa_m49a3rVyDTDbREYhik,781
43
- certificate/tests/cloud_connectivity/reboot_test/reboot_test.py,sha256=h8Uhn6NQExb9pLRytrd7UvLO0ScxTOfM3sdCwSCWKqg,1924
43
+ certificate/tests/cloud_connectivity/reboot_test/reboot_test.py,sha256=BWZU8NCWhkRor8tXe-crp25bN0aWcWqYL17qjkKU1Pg,2036
44
44
  certificate/tests/cloud_connectivity/registration_test/registration_test.json,sha256=fT-IHk0CRid8EDgo9bDtO7jl_1JDcVK0bQSHBz8CpZw,1039
45
45
  certificate/tests/cloud_connectivity/registration_test/registration_test.py,sha256=uzLwNQFffLJQhzuUx0l1-xsk7r0X1z4xBk7zjkzlTlE,15115
46
46
  certificate/tests/cloud_connectivity/registration_test/registration_test_cli.py,sha256=PA43jADoqfnkEwOzeggl6mmo5nIQT6M_8j32IIxhQb0,3141
47
47
  certificate/tests/cloud_connectivity/stress_test/stress_test.json,sha256=rXDA1AgdSgMdBZhDvKHyO4p1KoqJxDfKJzvwSVLcONA,804
48
- certificate/tests/cloud_connectivity/stress_test/stress_test.py,sha256=K68fvwvTIIxuQHPak6oJ_HLv0amsGEM1NbqyePSpI3A,4175
48
+ certificate/tests/cloud_connectivity/stress_test/stress_test.py,sha256=rl63dFNFBb-9o6wqdQrLFAzCLAbDt29b_IliZMhHbp8,4177
49
49
  certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.json,sha256=4yiEHa1sxz6-xnQDtaBU4JHNDsPZ_p9Jpgqpy8s9QJY,1326
50
50
  certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.py,sha256=R6EvyRbBzfy3XjHrnR0HFSZHL7xM-ccDYZuBmrncIGU,4368
51
51
  certificate/tests/cloud_connectivity/uplink_test/uplink_test.json,sha256=F28h9EjUxLYOiYH1mk_o8hUqHyer4Mc7BhvfU4VnhYQ,955
52
- certificate/tests/cloud_connectivity/uplink_test/uplink_test.py,sha256=jEFkH6_UGiEcP4i3nyxYN2oqRQaJjiK165mbB2gF4kk,7227
52
+ certificate/tests/cloud_connectivity/uplink_test/uplink_test.py,sha256=AuOnFAkowDtU2Wdkg4c2cCldazzTG05o4XUz8agHoOw,7339
53
53
  certificate/tests/datapath/aging_test/aging_test.json,sha256=n1LmPKJWzfSOmjNFMVMeIdFS59kteUDce6a55gEM4Zk,901
54
- certificate/tests/datapath/aging_test/aging_test.py,sha256=hxWlCd9XOJP9M14T9XRPpJ8_Af6SNaUs9ZDJNLRg7ms,6682
54
+ certificate/tests/datapath/aging_test/aging_test.py,sha256=oBNdp0GMPSILEqEwPuv7nNOOCswyamn91BJIV2JCYDc,6943
55
55
  certificate/tests/datapath/event_ble5_test/event_ble5_test.json,sha256=oK-HyLS8Re_D4MYppi6ZehhJTMVZ2-iW4gwlGaRu4bg,944
56
56
  certificate/tests/datapath/event_ble5_test/event_ble5_test.py,sha256=BsCuVFFjL5U3s2cBxjeGygw5j9MmUWF51s_afmvyEII,4601
57
57
  certificate/tests/datapath/event_test/event_test.json,sha256=moxR8vxvTX5p2PyP4d1P9f-wFjJbERhFn0nJAZw8AgA,949
58
58
  certificate/tests/datapath/event_test/event_test.py,sha256=IigGoxk4rNM9CVRSnT0KWdEWg1CT2NZXyHd2SIIzqeA,3783
59
- certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json,sha256=lho1x44X3MJDvKPX3ZouWIJPednp0MyTabcqhPaU9aE,805
60
- certificate/tests/datapath/num_of_tags_test/num_of_tags_test.py,sha256=Ecaf-8yQQX1ZybbgMstiNPrVhZz7-BSF4MSiUiE6tTc,3481
59
+ certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json,sha256=THXxkPXB27P7KEWk8us-kkTIs7kCuBixVcra-edPiFg,805
60
+ certificate/tests/datapath/num_of_tags_test/num_of_tags_test.py,sha256=in7NrVYRF7l08INHf6w-_hRbIaJnqqyaqQtJpM698BA,3697
61
61
  certificate/tests/datapath/output_power_test/output_power_test.json,sha256=1B_glQf7GUgjdqnAwnKE2_iyinNGuW3mtiglp2XlLvQ,1449
62
62
  certificate/tests/datapath/output_power_test/output_power_test.py,sha256=09Ug3nhLm3SFTdfZnoKSN1wR5Dc9yRKbRlaNn7Gt9Rw,1704
63
63
  certificate/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.json,sha256=5TIAiLQ5RRzRzYImh4Hk5iv0-skqdpuJALff3Z75j_s,948
@@ -87,9 +87,9 @@ certificate/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.py,sha256=mNXskD7
87
87
  certificate/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.json,sha256=vz2DOmPwgpBBNuFMKHm26zz_UX8eYK4vMF0zmm8TpXU,1423
88
88
  certificate/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.py,sha256=MPztd0r9R36rnkx1EYRhK4xqELeqsqkduyohQQTukho,12016
89
89
  certificate/tests/datapath/stress_gen3_test/stress_gen3_test.json,sha256=hliFx-0HCLudJwzjkVIsLxeTRGxDE8nsnnEBxgOjeZE,1315
90
- certificate/tests/datapath/stress_gen3_test/stress_gen3_test.py,sha256=zqjNGFe_SSRrNE4fDPybpgWBwGJwQrO5A8Fphg4x6bg,10996
90
+ certificate/tests/datapath/stress_gen3_test/stress_gen3_test.py,sha256=ZV7Rw5uRohzUeaQsosuI9UsjpSChZ-qHd43NTOZZV64,11090
91
91
  certificate/tests/datapath/stress_test/stress_test.json,sha256=oOrNKTZ1pObnQJuZfSCxORk_o9SVbg4_uEWghp7rQUA,1315
92
- certificate/tests/datapath/stress_test/stress_test.py,sha256=ZfztrKpL02wyEFM8plS04b9TpC-5HFUUD6WbCUPc7c0,10995
92
+ certificate/tests/datapath/stress_test/stress_test.py,sha256=XiwBVHe3rMtvWHaBfBYStdDgvJs0zy6MNsxoaRL7YnM,11089
93
93
  certificate/tests/datapath/tx_repetition_test/tx_repetition_test.json,sha256=5WfRTpR0HBs_7zr8YNxSWAe9Njk8WV5NTtqloDajtII,994
94
94
  certificate/tests/datapath/tx_repetition_test/tx_repetition_test.py,sha256=nb1o8mge5QDSyw731fZbKyhmaSlvGjO1fnsYb-9jVfk,3642
95
95
  certificate/tests/edge_mgmt/action_blink_test/action_blink_test.json,sha256=tZJAxmSuYQg8KIPBytzB7QLh24SCkHycn5sLPAR1SX8,587
@@ -158,11 +158,11 @@ common/web/templates/parser.html,sha256=0J2WX5QTD_EZJUtmNq6--wrnpP0-I09iE3rB02eu
158
158
  common/web/templates/wlt_types.html,sha256=FKxlJ08H7IgNPdsT36RbpMKRw29t-tuwqGaQ4HHhBEM,432230
159
159
  gui_certificate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
160
  gui_certificate/gui_certificate_cli.py,sha256=371nNCVmRtUePYKp_w-DVTr3C8hLAzKR2q5ZAMsaxt0,448
161
- gui_certificate/server.py,sha256=qlKlpgBSAQa9zlPR12k3rB2m0mAvxO9aZxUVgGLfoRE,60159
161
+ gui_certificate/server.py,sha256=-4YETUzq_aDz-l4qreuF5mH0uBwKtFU7kUAncGuG_tM,60363
162
162
  gui_certificate/templates/cert_run.html,sha256=nnfolVZ2u1bsiH-u3vbKt1HCcP7CvAzWRZnJe-g3yyo,68803
163
- wiliot_certificate-4.5.0a4.dist-info/licenses/LICENSE,sha256=OL5ajUNVx888yC2ogol0BKwPRLdQAF1noGuQ7WrYiAA,1068
164
- wiliot_certificate-4.5.0a4.dist-info/METADATA,sha256=XWkz7Lm5XPljS47WzgtlGhaDZ-nCVfaLjS0mHLB8eEU,4015
165
- wiliot_certificate-4.5.0a4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
166
- wiliot_certificate-4.5.0a4.dist-info/entry_points.txt,sha256=_wnYk2F4bFn9H7ZGRwYV6WcpK8a3WNon8K7Y5xusFz4,274
167
- wiliot_certificate-4.5.0a4.dist-info/top_level.txt,sha256=WF6PUfxJ5n2-DxcXTA4oFrTlV6PX_pOYkYaQDk4Mk3g,35
168
- wiliot_certificate-4.5.0a4.dist-info/RECORD,,
163
+ wiliot_certificate-4.5.0a6.dist-info/licenses/LICENSE,sha256=OL5ajUNVx888yC2ogol0BKwPRLdQAF1noGuQ7WrYiAA,1068
164
+ wiliot_certificate-4.5.0a6.dist-info/METADATA,sha256=q_ZhlDMTu5JkI4COHfkK-2-4WhLN2nQnTxc8YtvC5d8,3496
165
+ wiliot_certificate-4.5.0a6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
166
+ wiliot_certificate-4.5.0a6.dist-info/entry_points.txt,sha256=_wnYk2F4bFn9H7ZGRwYV6WcpK8a3WNon8K7Y5xusFz4,274
167
+ wiliot_certificate-4.5.0a6.dist-info/top_level.txt,sha256=WF6PUfxJ5n2-DxcXTA4oFrTlV6PX_pOYkYaQDk4Mk3g,35
168
+ wiliot_certificate-4.5.0a6.dist-info/RECORD,,