mirror of
https://github.com/espressif/openthread.git
synced 2026-10-02 22:07:36 +00:00
[style] change python yapf column_limit to 119 (#5339)
This commit is contained in:
@@ -154,8 +154,7 @@ class HarnessCase(unittest.TestCase):
|
||||
auto_dut = settings.AUTO_DUT
|
||||
"""bool: whether use harness auto dut feature"""
|
||||
|
||||
timeout = hasattr(settings,
|
||||
'TIMEOUT') and settings.TIMEOUT or DEFAULT_TIMEOUT
|
||||
timeout = hasattr(settings, 'TIMEOUT') and settings.TIMEOUT or DEFAULT_TIMEOUT
|
||||
"""number: timeout in seconds to stop running this test case"""
|
||||
|
||||
started = 0
|
||||
@@ -171,19 +170,16 @@ class HarnessCase(unittest.TestCase):
|
||||
self.dut = None
|
||||
self._browser = None
|
||||
self._hc = None
|
||||
self.result_dir = '%s\\%s' % (settings.OUTPUT_PATH,
|
||||
self.__class__.__name__)
|
||||
self.result_dir = '%s\\%s' % (settings.OUTPUT_PATH, self.__class__.__name__)
|
||||
self.history = HistoryHelper()
|
||||
self.add_all_devices = False
|
||||
self.new_th = False
|
||||
|
||||
harness_info = ConfigParser.ConfigParser()
|
||||
harness_info.read('%s\\info.ini' % settings.HARNESS_HOME)
|
||||
if harness_info.has_option('Thread_Harness_Info',
|
||||
'Version') and harness_info.has_option(
|
||||
'Thread_Harness_Info', 'Mode'):
|
||||
harness_version = harness_info.get('Thread_Harness_Info',
|
||||
'Version').rsplit(' ', 1)[1]
|
||||
if harness_info.has_option('Thread_Harness_Info', 'Version') and harness_info.has_option(
|
||||
'Thread_Harness_Info', 'Mode'):
|
||||
harness_version = harness_info.get('Thread_Harness_Info', 'Version').rsplit(' ', 1)[1]
|
||||
harness_mode = harness_info.get('Thread_Harness_Info', 'Mode')
|
||||
|
||||
if harness_mode == 'External' and harness_version > '1.4.0':
|
||||
@@ -221,8 +217,7 @@ class HarnessCase(unittest.TestCase):
|
||||
|
||||
while True:
|
||||
try:
|
||||
pdu = pdu_factory.create_pdu_controller(
|
||||
settings.PDU_CONTROLLER_TYPE)
|
||||
pdu = pdu_factory.create_pdu_controller(settings.PDU_CONTROLLER_TYPE)
|
||||
pdu.open(**settings.PDU_CONTROLLER_OPEN_PARAMS)
|
||||
except EOFError:
|
||||
logger.warning('Failed to connect to telnet')
|
||||
@@ -252,25 +247,17 @@ class HarnessCase(unittest.TestCase):
|
||||
time.sleep(2)
|
||||
|
||||
harness_config = ConfigParser.ConfigParser()
|
||||
harness_config.read('%s\\Config\\Configuration.ini' %
|
||||
settings.HARNESS_HOME)
|
||||
if harness_config.has_option(
|
||||
'THREAD_HARNESS_CONFIG',
|
||||
'BrowserAutoNavigate') and harness_config.getboolean(
|
||||
'THREAD_HARNESS_CONFIG', 'BrowserAutoNavigate'):
|
||||
logger.error(
|
||||
'BrowserAutoNavigate in Configuration.ini should be False')
|
||||
raise FailError(
|
||||
'BrowserAutoNavigate in Configuration.ini should be False')
|
||||
harness_config.read('%s\\Config\\Configuration.ini' % settings.HARNESS_HOME)
|
||||
if harness_config.has_option('THREAD_HARNESS_CONFIG', 'BrowserAutoNavigate') and harness_config.getboolean(
|
||||
'THREAD_HARNESS_CONFIG', 'BrowserAutoNavigate'):
|
||||
logger.error('BrowserAutoNavigate in Configuration.ini should be False')
|
||||
raise FailError('BrowserAutoNavigate in Configuration.ini should be False')
|
||||
if settings.MIXED_DEVICE_TYPE:
|
||||
if harness_config.has_option(
|
||||
'THREAD_HARNESS_CONFIG',
|
||||
'EnableDeviceSelection') and not harness_config.getboolean(
|
||||
'THREAD_HARNESS_CONFIG', 'EnableDeviceSelection'):
|
||||
logger.error(
|
||||
'EnableDeviceSelection in Configuration.ini should be True')
|
||||
raise FailError(
|
||||
'EnableDeviceSelection in Configuration.ini should be True')
|
||||
if harness_config.has_option('THREAD_HARNESS_CONFIG',
|
||||
'EnableDeviceSelection') and not harness_config.getboolean(
|
||||
'THREAD_HARNESS_CONFIG', 'EnableDeviceSelection'):
|
||||
logger.error('EnableDeviceSelection in Configuration.ini should be True')
|
||||
raise FailError('EnableDeviceSelection in Configuration.ini should be True')
|
||||
|
||||
def _destroy_harness(self):
|
||||
"""Stop harness backend service
|
||||
@@ -309,9 +296,8 @@ class HarnessCase(unittest.TestCase):
|
||||
chrome_options.add_argument('--disable-extensions')
|
||||
chrome_options.add_argument('--disable-infobars')
|
||||
chrome_options.add_argument('--ignore-certificate-errors')
|
||||
chrome_options.add_experimental_option(
|
||||
'prefs',
|
||||
{'profile.managed_default_content_settings.notifications': 1})
|
||||
chrome_options.add_experimental_option('prefs',
|
||||
{'profile.managed_default_content_settings.notifications': 1})
|
||||
|
||||
browser = webdriver.Chrome(chrome_options=chrome_options)
|
||||
browser.set_page_load_timeout(20)
|
||||
@@ -334,11 +320,9 @@ class HarnessCase(unittest.TestCase):
|
||||
self._browser = None
|
||||
|
||||
def _init_rf_shield(self):
|
||||
if getattr(settings, 'SHIELD_CONTROLLER_TYPE', None) and getattr(
|
||||
settings, 'SHIELD_CONTROLLER_PARAMS', None):
|
||||
self.rf_shield = get_rf_shield_controller(
|
||||
shield_type=settings.SHIELD_CONTROLLER_TYPE,
|
||||
params=settings.SHIELD_CONTROLLER_PARAMS)
|
||||
if getattr(settings, 'SHIELD_CONTROLLER_TYPE', None) and getattr(settings, 'SHIELD_CONTROLLER_PARAMS', None):
|
||||
self.rf_shield = get_rf_shield_controller(shield_type=settings.SHIELD_CONTROLLER_TYPE,
|
||||
params=settings.SHIELD_CONTROLLER_PARAMS)
|
||||
else:
|
||||
self.rf_shield = None
|
||||
|
||||
@@ -367,8 +351,7 @@ class HarnessCase(unittest.TestCase):
|
||||
os.system('del /q "%s\\Reports\\*.*"' % settings.HARNESS_HOME)
|
||||
else:
|
||||
logger.info('Empty files in temps')
|
||||
os.system('del /q "%s\\Thread_Harness\\temp\\*.*"' %
|
||||
settings.HARNESS_HOME)
|
||||
os.system('del /q "%s\\Thread_Harness\\temp\\*.*"' % settings.HARNESS_HOME)
|
||||
|
||||
# create directory
|
||||
os.system('mkdir %s' % self.result_dir)
|
||||
@@ -406,19 +389,16 @@ class HarnessCase(unittest.TestCase):
|
||||
if dialog and dialog.get_attribute('aria-hidden') == 'false':
|
||||
times = 100
|
||||
while times:
|
||||
status = dialog.find_element_by_class_name(
|
||||
'status-notify').text
|
||||
status = dialog.find_element_by_class_name('status-notify').text
|
||||
if 'Searching' in status:
|
||||
logger.info('Still detecting..')
|
||||
elif 'Not' in status:
|
||||
logger.warning('Sniffer device not verified!')
|
||||
button = dialog.find_element_by_id(
|
||||
'snifferAutoDetectBtn')
|
||||
button = dialog.find_element_by_id('snifferAutoDetectBtn')
|
||||
button.click()
|
||||
elif 'Verified' in status:
|
||||
logger.info('Verified!')
|
||||
button = dialog.find_element_by_id(
|
||||
'saveCaptureSettings')
|
||||
button = dialog.find_element_by_id('saveCaptureSettings')
|
||||
button.click()
|
||||
break
|
||||
else:
|
||||
@@ -462,14 +442,12 @@ class HarnessCase(unittest.TestCase):
|
||||
if dialog.get_attribute('aria-hidden') != 'false':
|
||||
raise Exception('Missing General Setup dialog')
|
||||
|
||||
field = dialog.find_element_by_id(
|
||||
'inp_general_child_update_wait_time')
|
||||
field = dialog.find_element_by_id('inp_general_child_update_wait_time')
|
||||
field.clear()
|
||||
if self.child_timeout:
|
||||
field.send_keys(str(self.child_timeout))
|
||||
|
||||
field = dialog.find_element_by_id(
|
||||
'inp_general_sed_polling_rate')
|
||||
field = dialog.find_element_by_id('inp_general_sed_polling_rate')
|
||||
field.clear()
|
||||
if self.sed_polling_interval:
|
||||
field.send_keys(str(self.sed_polling_interval))
|
||||
@@ -526,28 +504,22 @@ class HarnessCase(unittest.TestCase):
|
||||
selected_hw_num = len(selected_hw_set)
|
||||
|
||||
while selected_hw_num:
|
||||
remove_button = selected_hw_set[selected_hw_num -
|
||||
1].find_element_by_class_name(
|
||||
'removeSelectedDevice')
|
||||
remove_button = selected_hw_set[selected_hw_num - 1].find_element_by_class_name('removeSelectedDevice')
|
||||
remove_button.click()
|
||||
selected_hw_num = selected_hw_num - 1
|
||||
|
||||
devices = [
|
||||
device for device in settings.GOLDEN_DEVICES
|
||||
if not self.history.is_bad_golden_device(device[0]) and
|
||||
device for device in settings.GOLDEN_DEVICES if not self.history.is_bad_golden_device(device[0]) and
|
||||
not (settings.DUT_DEVICE and device[0] == settings.DUT_DEVICE[0])
|
||||
]
|
||||
logger.info('Available golden devices: %s', json.dumps(devices,
|
||||
indent=2))
|
||||
logger.info('Available golden devices: %s', json.dumps(devices, indent=2))
|
||||
|
||||
shield_devices = [
|
||||
shield_device for shield_device in settings.SHIELD_GOLDEN_DEVICES
|
||||
if not self.history.is_bad_golden_device(shield_device[0]) and
|
||||
not (settings.DUT2_DEVICE and
|
||||
shield_device[0] == settings.DUT2_DEVICE[0])
|
||||
not (settings.DUT2_DEVICE and shield_device[0] == settings.DUT2_DEVICE[0])
|
||||
]
|
||||
logger.info('Available shield golden devices: %s',
|
||||
json.dumps(shield_devices, indent=2))
|
||||
logger.info('Available shield golden devices: %s', json.dumps(shield_devices, indent=2))
|
||||
golden_devices_required = self.golden_devices_required
|
||||
|
||||
dut_device = ()
|
||||
@@ -582,11 +554,9 @@ class HarnessCase(unittest.TestCase):
|
||||
logger.info('Must set DUT2_DEVICE')
|
||||
raise FailError('DUT2_DEVICE must be set in settings.py')
|
||||
if isinstance(self.device_order, list) and self.device_order:
|
||||
logger.info('case %s devices ordered by %s ', self.case,
|
||||
self.device_order)
|
||||
logger.info('case %s devices ordered by %s ', self.case, self.device_order)
|
||||
else:
|
||||
logger.info('case %s uses %s as DUT', self.case,
|
||||
settings.DUT2_DEVICE)
|
||||
logger.info('case %s uses %s as DUT', self.case, settings.DUT2_DEVICE)
|
||||
|
||||
# for test bed with multi-vendor devices
|
||||
if settings.MIXED_DEVICE_TYPE:
|
||||
@@ -608,8 +578,7 @@ class HarnessCase(unittest.TestCase):
|
||||
case_id = match_line.group(1)
|
||||
|
||||
if re.sub(r'\.', ' ', case_id) == self.case:
|
||||
logger.info('Get line by case %s: %s', case_id,
|
||||
topo_line)
|
||||
logger.info('Get line by case %s: %s', case_id, topo_line)
|
||||
topo_device_list = re.split(',', match_line.group(2))
|
||||
for i in range(len(topo_device_list)):
|
||||
topo_device = re.split(':', topo_device_list[i])
|
||||
@@ -618,12 +587,9 @@ class HarnessCase(unittest.TestCase):
|
||||
else:
|
||||
continue
|
||||
except Exception as e:
|
||||
logger.info('Get devices from topology config file error: %s',
|
||||
e)
|
||||
logger.info('Get devices from topology config file error: %s', e)
|
||||
raise GoldenDeviceNotEnoughError()
|
||||
logger.info(
|
||||
'Golden devices in topology config file for case %s: %s',
|
||||
case_id, topo_mixed_devices)
|
||||
logger.info('Golden devices in topology config file for case %s: %s', case_id, topo_mixed_devices)
|
||||
f_topo.close()
|
||||
golden_device_candidates = []
|
||||
missing_golden_devices = topo_mixed_devices[:]
|
||||
@@ -637,15 +603,13 @@ class HarnessCase(unittest.TestCase):
|
||||
# mapping device in device_order which needs to be shielded
|
||||
if device_order_item[1]:
|
||||
if 'DUT' in device_order_item[0]:
|
||||
golden_device_candidates.append(
|
||||
settings.DUT2_DEVICE)
|
||||
golden_device_candidates.append(settings.DUT2_DEVICE)
|
||||
dut_device = settings.DUT2_DEVICE
|
||||
matched_dut = True
|
||||
matched = True
|
||||
break
|
||||
for device_item in shield_devices:
|
||||
if (device_order_item[0] == mixed_device_item[0]
|
||||
and
|
||||
if (device_order_item[0] == mixed_device_item[0] and
|
||||
mixed_device_item[1] == device_item[1]):
|
||||
golden_device_candidates.append(device_item)
|
||||
shield_devices.remove(device_item)
|
||||
@@ -654,22 +618,19 @@ class HarnessCase(unittest.TestCase):
|
||||
# mapping device in device_order which does not need to be shielded
|
||||
else:
|
||||
if 'DUT' in device_order_item[0]:
|
||||
golden_device_candidates.append(
|
||||
settings.DUT_DEVICE)
|
||||
golden_device_candidates.append(settings.DUT_DEVICE)
|
||||
matched_dut = True
|
||||
matched = True
|
||||
break
|
||||
for device_item in devices:
|
||||
if (device_order_item[0] == mixed_device_item[0]
|
||||
and
|
||||
if (device_order_item[0] == mixed_device_item[0] and
|
||||
mixed_device_item[1] == device_item[1]):
|
||||
golden_device_candidates.append(device_item)
|
||||
devices.remove(device_item)
|
||||
matched = True
|
||||
break
|
||||
if not matched:
|
||||
logger.info('Golden device not enough in : no %s',
|
||||
device_order_item)
|
||||
logger.info('Golden device not enough in : no %s', device_order_item)
|
||||
raise GoldenDeviceNotEnoughError()
|
||||
if not matched_dut:
|
||||
raise FailError('Failed to find DUT in device_order')
|
||||
@@ -683,9 +644,7 @@ class HarnessCase(unittest.TestCase):
|
||||
devices.remove(device_item)
|
||||
missing_golden_devices.remove(mixed_device_item)
|
||||
break
|
||||
logger.info(
|
||||
'Golden devices in topology config file mapped in settings : %s',
|
||||
golden_device_candidates)
|
||||
logger.info('Golden devices in topology config file mapped in settings : %s', golden_device_candidates)
|
||||
if len(topo_mixed_devices) != len(golden_device_candidates):
|
||||
device_dict = dict()
|
||||
for missing_device in missing_golden_devices:
|
||||
@@ -698,8 +657,7 @@ class HarnessCase(unittest.TestCase):
|
||||
else:
|
||||
devices = golden_device_candidates
|
||||
golden_devices_required = len(devices)
|
||||
logger.info('All case-needed golden devices: %s',
|
||||
json.dumps(devices, indent=2))
|
||||
logger.info('All case-needed golden devices: %s', json.dumps(devices, indent=2))
|
||||
# for test bed with single vendor devices
|
||||
else:
|
||||
golden_device_candidates = []
|
||||
@@ -710,8 +668,7 @@ class HarnessCase(unittest.TestCase):
|
||||
# choose device which needs to be shielded
|
||||
if device_order_item[1]:
|
||||
if 'DUT' in device_order_item[0]:
|
||||
golden_device_candidates.append(
|
||||
settings.DUT2_DEVICE)
|
||||
golden_device_candidates.append(settings.DUT2_DEVICE)
|
||||
dut_device = settings.DUT2_DEVICE
|
||||
matched_dut = True
|
||||
matched = True
|
||||
@@ -734,8 +691,7 @@ class HarnessCase(unittest.TestCase):
|
||||
matched = True
|
||||
break
|
||||
if not matched:
|
||||
logger.info('Golden device not enough in : no %s',
|
||||
device_order_item)
|
||||
logger.info('Golden device not enough in : no %s', device_order_item)
|
||||
raise GoldenDeviceNotEnoughError()
|
||||
if not matched_dut:
|
||||
raise FailError('Failed to find DUT in device_order')
|
||||
@@ -752,8 +708,7 @@ class HarnessCase(unittest.TestCase):
|
||||
raise GoldenDeviceNotEnoughError()
|
||||
|
||||
# add golden devices
|
||||
number_of_devices_to_add = len(
|
||||
devices) if self.add_all_devices else golden_devices_required
|
||||
number_of_devices_to_add = len(devices) if self.add_all_devices else golden_devices_required
|
||||
for i in range(number_of_devices_to_add):
|
||||
self._add_device(*devices.pop())
|
||||
|
||||
@@ -767,29 +722,24 @@ class HarnessCase(unittest.TestCase):
|
||||
|
||||
# enable AUTO DUT
|
||||
if self.auto_dut:
|
||||
checkbox_auto_dut = browser.find_element_by_id(
|
||||
'EnableAutoDutSelection')
|
||||
checkbox_auto_dut = browser.find_element_by_id('EnableAutoDutSelection')
|
||||
if not checkbox_auto_dut.is_selected():
|
||||
checkbox_auto_dut.click()
|
||||
time.sleep(1)
|
||||
|
||||
if settings.DUT_DEVICE:
|
||||
radio_auto_dut = browser.find_element_by_class_name(
|
||||
'AutoDUT_RadBtns')
|
||||
radio_auto_dut = browser.find_element_by_class_name('AutoDUT_RadBtns')
|
||||
if not radio_auto_dut.is_selected() and not self.device_order:
|
||||
radio_auto_dut.click()
|
||||
|
||||
if self.device_order:
|
||||
selected_hw_set = test_bed.find_elements_by_class_name(
|
||||
'selected-hw')
|
||||
selected_hw_set = test_bed.find_elements_by_class_name('selected-hw')
|
||||
for selected_hw in selected_hw_set:
|
||||
form_inputs = selected_hw.find_elements_by_tag_name(
|
||||
'input')
|
||||
form_inputs = selected_hw.find_elements_by_tag_name('input')
|
||||
form_port = form_inputs[0]
|
||||
port = form_port.get_attribute('value').encode('utf8')
|
||||
if port == dut_device[0]:
|
||||
radio_auto_dut = selected_hw.find_element_by_class_name(
|
||||
'AutoDUT_RadBtns')
|
||||
radio_auto_dut = selected_hw.find_element_by_class_name('AutoDUT_RadBtns')
|
||||
if not radio_auto_dut.is_selected():
|
||||
radio_auto_dut.click()
|
||||
|
||||
@@ -798,23 +748,19 @@ class HarnessCase(unittest.TestCase):
|
||||
self._connect_devices()
|
||||
button_next = browser.find_element_by_id('nextBtn')
|
||||
if not wait_until(
|
||||
lambda: 'disabled' not in button_next.get_attribute(
|
||||
'class'),
|
||||
lambda: 'disabled' not in button_next.get_attribute('class'),
|
||||
times=(30 + 4 * number_of_devices_to_add),
|
||||
):
|
||||
bad_ones = []
|
||||
selected_hw_set = test_bed.find_elements_by_class_name(
|
||||
'selected-hw')
|
||||
selected_hw_set = test_bed.find_elements_by_class_name('selected-hw')
|
||||
for selected_hw in selected_hw_set:
|
||||
form_inputs = selected_hw.find_elements_by_tag_name(
|
||||
'input')
|
||||
form_inputs = selected_hw.find_elements_by_tag_name('input')
|
||||
form_port = form_inputs[0]
|
||||
if form_port.is_enabled():
|
||||
bad_ones.append(selected_hw)
|
||||
|
||||
for selected_hw in bad_ones:
|
||||
form_inputs = selected_hw.find_elements_by_tag_name(
|
||||
'input')
|
||||
form_inputs = selected_hw.find_elements_by_tag_name('input')
|
||||
form_port = form_inputs[0]
|
||||
port = form_port.get_attribute('value').encode('utf8')
|
||||
if port == dut_device[0]:
|
||||
@@ -830,8 +776,7 @@ class HarnessCase(unittest.TestCase):
|
||||
self.history.mark_bad_golden_device(port)
|
||||
|
||||
# remove the bad one
|
||||
selected_hw.find_element_by_class_name(
|
||||
'removeSelectedDevice').click()
|
||||
selected_hw.find_element_by_class_name('removeSelectedDevice').click()
|
||||
time.sleep(0.1)
|
||||
|
||||
if len(devices):
|
||||
@@ -847,17 +792,14 @@ class HarnessCase(unittest.TestCase):
|
||||
continue
|
||||
|
||||
if self.auto_dut and not settings.DUT_DEVICE:
|
||||
radio_auto_dut = browser.find_element_by_class_name(
|
||||
'AutoDUT_RadBtns')
|
||||
radio_auto_dut = browser.find_element_by_class_name('AutoDUT_RadBtns')
|
||||
if not radio_auto_dut.is_selected():
|
||||
radio_auto_dut.click()
|
||||
|
||||
time.sleep(5)
|
||||
|
||||
button_next.click()
|
||||
if not wait_until(
|
||||
lambda: self._browser.current_url.endswith(
|
||||
'TestExecution.html'), 20):
|
||||
if not wait_until(lambda: self._browser.current_url.endswith('TestExecution.html'), 20):
|
||||
raise Exception('Failed to load TestExecution page')
|
||||
except FailError:
|
||||
raise
|
||||
@@ -875,10 +817,8 @@ class HarnessCase(unittest.TestCase):
|
||||
time.sleep(1)
|
||||
|
||||
checkbox = None
|
||||
wait_until(lambda: self._browser.find_elements_by_css_selector(
|
||||
'.tree-node .tree-title') and True)
|
||||
elems = self._browser.find_elements_by_css_selector(
|
||||
'.tree-node .tree-title')
|
||||
wait_until(lambda: self._browser.find_elements_by_css_selector('.tree-node .tree-title') and True)
|
||||
elems = self._browser.find_elements_by_css_selector('.tree-node .tree-title')
|
||||
finder = re.compile(r'.*\b' + case + r'\b')
|
||||
finder_dotted = re.compile(r'.*\b' + case.replace(' ', r'\.') + r'\b')
|
||||
for elem in elems:
|
||||
@@ -910,9 +850,7 @@ class HarnessCase(unittest.TestCase):
|
||||
|
||||
elem = self._browser.find_element_by_id('runTest')
|
||||
elem.click()
|
||||
if not wait_until(
|
||||
lambda: self._browser.find_element_by_id('stopTest') and True,
|
||||
10):
|
||||
if not wait_until(lambda: self._browser.find_element_by_id('stopTest') and True, 10):
|
||||
raise Exception('Failed to start test case')
|
||||
|
||||
def _collect_result(self):
|
||||
@@ -922,14 +860,11 @@ class HarnessCase(unittest.TestCase):
|
||||
"""
|
||||
|
||||
if self.new_th:
|
||||
os.system('copy "%s\\Reports\\*.*" "%s"' %
|
||||
(settings.HARNESS_HOME, self.result_dir))
|
||||
os.system('copy "%s\\Reports\\*.*" "%s"' % (settings.HARNESS_HOME, self.result_dir))
|
||||
else:
|
||||
os.system('copy "%s\\Thread_Harness\\temp\\*.*" "%s"' %
|
||||
(settings.HARNESS_HOME, self.result_dir))
|
||||
os.system('copy "%s\\Thread_Harness\\temp\\*.*" "%s"' % (settings.HARNESS_HOME, self.result_dir))
|
||||
|
||||
os.system('copy "%s\\Captures\\*.pcapng" %s\\' %
|
||||
(settings.HARNESS_HOME, self.result_dir))
|
||||
os.system('copy "%s\\Captures\\*.pcapng" %s\\' % (settings.HARNESS_HOME, self.result_dir))
|
||||
|
||||
def _wait_dialog(self):
|
||||
"""Wait for dialogs and handle them until done.
|
||||
@@ -946,8 +881,7 @@ class HarnessCase(unittest.TestCase):
|
||||
logger.exception('Failed to get dialog.')
|
||||
else:
|
||||
if dialog and dialog.get_attribute('aria-hidden') == 'false':
|
||||
title = dialog.find_element_by_class_name(
|
||||
'modal-title').text
|
||||
title = dialog.find_element_by_class_name('modal-title').text
|
||||
time.sleep(1)
|
||||
logger.info('Handling dialog[%s]', title)
|
||||
|
||||
@@ -981,21 +915,15 @@ class HarnessCase(unittest.TestCase):
|
||||
if self.timeout % 10 == 0:
|
||||
lines = self._hc.tail()
|
||||
if 'SUCCESS: The process "dumpcap.exe" with PID ' in lines:
|
||||
logger.info(
|
||||
'Tshark should be ended now, lets wait at most 30 seconds.'
|
||||
)
|
||||
if not wait_until(
|
||||
lambda: 'tshark.exe' not in subprocess.check_output(
|
||||
'tasklist'), 30):
|
||||
res = subprocess.check_output(
|
||||
'taskkill /t /f /im tshark.exe',
|
||||
stderr=subprocess.STDOUT,
|
||||
shell=True)
|
||||
logger.info('Tshark should be ended now, lets wait at most 30 seconds.')
|
||||
if not wait_until(lambda: 'tshark.exe' not in subprocess.check_output('tasklist'), 30):
|
||||
res = subprocess.check_output('taskkill /t /f /im tshark.exe',
|
||||
stderr=subprocess.STDOUT,
|
||||
shell=True)
|
||||
logger.info(res)
|
||||
|
||||
# Wait until case really stopped
|
||||
wait_until(lambda: self._browser.find_element_by_id('runTest') and True,
|
||||
30)
|
||||
wait_until(lambda: self._browser.find_element_by_id('runTest') and True, 30)
|
||||
|
||||
if error:
|
||||
raise FailError('Fail for previous exceptions')
|
||||
@@ -1032,8 +960,7 @@ class HarnessCase(unittest.TestCase):
|
||||
self.dut.extpanid = settings.THREAD_EXTPANID
|
||||
self.dut.start()
|
||||
|
||||
elif title.startswith('MAC Address Required') or title.startswith(
|
||||
'DUT Random Extended MAC Address Required'):
|
||||
elif title.startswith('MAC Address Required') or title.startswith('DUT Random Extended MAC Address Required'):
|
||||
mac = self.dut.mac
|
||||
inp = dialog.find_element_by_id('cnfrmInpText')
|
||||
inp.clear()
|
||||
@@ -1043,8 +970,7 @@ class HarnessCase(unittest.TestCase):
|
||||
ll64 = None
|
||||
for addr in self.dut.addrs:
|
||||
addr = addr.lower()
|
||||
if addr.startswith('fe80') and not re.match(
|
||||
'.+ff:fe00:[0-9a-f]{0,4}$', addr):
|
||||
if addr.startswith('fe80') and not re.match('.+ff:fe00:[0-9a-f]{0,4}$', addr):
|
||||
ll64 = addr
|
||||
break
|
||||
|
||||
@@ -1077,8 +1003,7 @@ class HarnessCase(unittest.TestCase):
|
||||
elif title.startswith('ML64 Address'):
|
||||
ml64 = None
|
||||
for addr in self.dut.addrs:
|
||||
if addr.startswith('fd') and not re.match(
|
||||
'.+ff:fe00:[0-9a-f]{0,4}$', addr):
|
||||
if addr.startswith('fd') and not re.match('.+ff:fe00:[0-9a-f]{0,4}$', addr):
|
||||
ml64 = addr
|
||||
break
|
||||
|
||||
@@ -1090,21 +1015,18 @@ class HarnessCase(unittest.TestCase):
|
||||
inp.clear()
|
||||
inp.send_keys(ml64)
|
||||
|
||||
elif title.startswith('Shield Devices') or title.startswith(
|
||||
'Shield DUT'):
|
||||
elif title.startswith('Shield Devices') or title.startswith('Shield DUT'):
|
||||
time.sleep(2)
|
||||
if self.rf_shield:
|
||||
logger.info('Shielding devices')
|
||||
with self.rf_shield:
|
||||
self.rf_shield.shield()
|
||||
elif self.dut and settings.SHIELD_SIMULATION:
|
||||
self.dut.channel = (self.channel == THREAD_CHANNEL_MAX and
|
||||
THREAD_CHANNEL_MIN) or (self.channel + 1)
|
||||
self.dut.channel = (self.channel == THREAD_CHANNEL_MAX and THREAD_CHANNEL_MIN) or (self.channel + 1)
|
||||
else:
|
||||
input('Shield DUT and press enter to continue..')
|
||||
|
||||
elif title.startswith('Unshield Devices') or title.startswith(
|
||||
'Bring DUT back to network'):
|
||||
elif title.startswith('Unshield Devices') or title.startswith('Bring DUT back to network'):
|
||||
time.sleep(5)
|
||||
if self.rf_shield:
|
||||
logger.info('Unshielding devices')
|
||||
@@ -1119,8 +1041,7 @@ class HarnessCase(unittest.TestCase):
|
||||
body = dialog.find_element_by_id('cnfrmMsg').text
|
||||
body = body.split(': ')[1]
|
||||
params = reduce(
|
||||
lambda params, param: params.update(
|
||||
((param[0].strip(' '), param[1]),)) or params,
|
||||
lambda params, param: params.update(((param[0].strip(' '), param[1]),)) or params,
|
||||
[it.split('=') for it in body.split(', ')],
|
||||
{},
|
||||
)
|
||||
|
||||
@@ -88,12 +88,11 @@ class HarnessController(object):
|
||||
else:
|
||||
env = dict(
|
||||
os.environ,
|
||||
PYTHONPATH='%s\\Thread_Harness;%s\\ThirdParty\\hsdk-python\\src'
|
||||
% (settings.HARNESS_HOME, settings.HARNESS_HOME),
|
||||
PYTHONPATH='%s\\Thread_Harness;%s\\ThirdParty\\hsdk-python\\src' %
|
||||
(settings.HARNESS_HOME, settings.HARNESS_HOME),
|
||||
)
|
||||
|
||||
self.harness_file = '%s\\harness-%s.log' % (
|
||||
self.result_dir, time.strftime('%Y%m%d%H%M%S'))
|
||||
self.harness_file = '%s\\harness-%s.log' % (self.result_dir, time.strftime('%Y%m%d%H%M%S'))
|
||||
with open(self.harness_file, 'w') as harness_out:
|
||||
self.harness = subprocess.Popen(
|
||||
[
|
||||
@@ -113,10 +112,7 @@ class HarnessController(object):
|
||||
if self.miniweb:
|
||||
logger.warning('Miniweb already started')
|
||||
else:
|
||||
with open(
|
||||
'%s\\miniweb-%s.log' %
|
||||
(self.result_dir, time.strftime('%Y%m%d%H%M%S')),
|
||||
'w') as miniweb_out:
|
||||
with open('%s\\miniweb-%s.log' % (self.result_dir, time.strftime('%Y%m%d%H%M%S')), 'w') as miniweb_out:
|
||||
self.miniweb = subprocess.Popen(
|
||||
[settings.HARNESS_HOME + '\\MiniWeb\\miniweb.exe'],
|
||||
stdout=miniweb_out,
|
||||
|
||||
@@ -106,10 +106,7 @@ class OpenThreadController(threading.Thread):
|
||||
self.handle.setblocking(0)
|
||||
self._is_net = True
|
||||
else:
|
||||
self.handle = serial.Serial(self.port,
|
||||
115200,
|
||||
timeout=0,
|
||||
xonxoff=True)
|
||||
self.handle = serial.Serial(self.port, 115200, timeout=0, xonxoff=True)
|
||||
self._is_net = False
|
||||
|
||||
def _read(self, size=512):
|
||||
|
||||
@@ -45,9 +45,7 @@ logger = logging.getLogger(__name__)
|
||||
try:
|
||||
from pysnmp.hlapi import SnmpEngine, CommunityData, UdpTransportTarget, ContextData, getCmd, setCmd, ObjectType, ObjectIdentity, Integer32
|
||||
except ImportError:
|
||||
logger.warning(
|
||||
'PySNMP module is not installed. Install if EATON_PDU_CONTROLLER is used'
|
||||
)
|
||||
logger.warning('PySNMP module is not installed. Install if EATON_PDU_CONTROLLER is used')
|
||||
|
||||
|
||||
class PduController(object):
|
||||
@@ -188,8 +186,7 @@ class NordicBoardPduController(PduController):
|
||||
boards_serial_numbers = params['boards_serial_numbers']
|
||||
|
||||
for serial_number in boards_serial_numbers:
|
||||
logger.info('Resetting board with the serial number: %s',
|
||||
serial_number)
|
||||
logger.info('Resetting board with the serial number: %s', serial_number)
|
||||
self._pin_reset(serial_number)
|
||||
|
||||
def close(self):
|
||||
@@ -208,12 +205,9 @@ class EatonPduController(PduController):
|
||||
|
||||
def open(self, **params):
|
||||
missing_fields = ['ip', 'port']
|
||||
missing_fields = [
|
||||
field for field in missing_fields if field not in params.keys()
|
||||
]
|
||||
missing_fields = [field for field in missing_fields if field not in params.keys()]
|
||||
if missing_fields:
|
||||
raise KeyError(
|
||||
'Missing keys in PDU params: {}'.format(missing_fields))
|
||||
raise KeyError('Missing keys in PDU params: {}'.format(missing_fields))
|
||||
self.params = params
|
||||
self.type = 'pdu'
|
||||
self.ip = self.params['ip']
|
||||
@@ -221,8 +215,7 @@ class EatonPduController(PduController):
|
||||
self._community = 'public'
|
||||
self._snmp_engine = SnmpEngine()
|
||||
self._community_data = CommunityData(self._community, mpModel=0)
|
||||
self._udp_transport_target = UdpTransportTarget(
|
||||
(self.ip, self.snmp_agent_port))
|
||||
self._udp_transport_target = UdpTransportTarget((self.ip, self.snmp_agent_port))
|
||||
self._context = ContextData()
|
||||
|
||||
def _outlet_oid_get(self, param, socket):
|
||||
@@ -237,16 +230,11 @@ class EatonPduController(PduController):
|
||||
full OID identifying the SNMP object (str)
|
||||
"""
|
||||
parameters = {
|
||||
'get_state':
|
||||
self.outlet_oid_cmd_get_state_base,
|
||||
'set_on':
|
||||
self.outlet_oid_cmd_set_on_base,
|
||||
'set_off':
|
||||
self.outlet_oid_cmd_set_off_base,
|
||||
'set_reboot_delay':
|
||||
self.outlet_oid_cmd_set_reboot_delay_seconds_base,
|
||||
'reboot':
|
||||
self.outlet_oid_cmd_reboot_base
|
||||
'get_state': self.outlet_oid_cmd_get_state_base,
|
||||
'set_on': self.outlet_oid_cmd_set_on_base,
|
||||
'set_off': self.outlet_oid_cmd_set_off_base,
|
||||
'set_reboot_delay': self.outlet_oid_cmd_set_reboot_delay_seconds_base,
|
||||
'reboot': self.outlet_oid_cmd_reboot_base
|
||||
}
|
||||
|
||||
return parameters[param.lower()] + str(socket)
|
||||
@@ -261,8 +249,7 @@ class EatonPduController(PduController):
|
||||
value (int): Value to be written to the OID as Integer32.
|
||||
"""
|
||||
errorIndication, errorStatus, errorIndex, varBinds = next(
|
||||
setCmd(self._snmp_engine, self._community_data,
|
||||
self._udp_transport_target, self._context,
|
||||
setCmd(self._snmp_engine, self._community_data, self._udp_transport_target, self._context,
|
||||
ObjectType(ObjectIdentity(oid), Integer32(value))))
|
||||
|
||||
if errorIndication:
|
||||
@@ -285,8 +272,7 @@ class EatonPduController(PduController):
|
||||
OID value (int)
|
||||
"""
|
||||
errorIndication, errorStatus, errorIndex, varBinds = next(
|
||||
getCmd(self._snmp_engine, self._community_data,
|
||||
self._udp_transport_target, self._context,
|
||||
getCmd(self._snmp_engine, self._community_data, self._udp_transport_target, self._context,
|
||||
ObjectType(ObjectIdentity(oid))))
|
||||
|
||||
if errorIndication:
|
||||
@@ -349,16 +335,13 @@ class EatonPduController(PduController):
|
||||
time.sleep(2)
|
||||
|
||||
timeout = time.time() + self.PDU_COMMAND_TIMEOUT
|
||||
while ((time.time() < timeout) and
|
||||
not self.validate_state(socket, 0)):
|
||||
while ((time.time() < timeout) and not self.validate_state(socket, 0)):
|
||||
time.sleep(0.1)
|
||||
|
||||
if self.validate_state(socket, 0):
|
||||
logger.debug('Turned OFF socket {} at {}'.format(
|
||||
socket, self.ip))
|
||||
logger.debug('Turned OFF socket {} at {}'.format(socket, self.ip))
|
||||
else:
|
||||
logger.error('Failed to turn OFF socket {} at {}'.format(
|
||||
socket, self.ip))
|
||||
logger.error('Failed to turn OFF socket {} at {}'.format(socket, self.ip))
|
||||
|
||||
def turn_on(self, sockets):
|
||||
"""
|
||||
@@ -375,16 +358,13 @@ class EatonPduController(PduController):
|
||||
time.sleep(2)
|
||||
|
||||
timeout = time.time() + self.PDU_COMMAND_TIMEOUT
|
||||
while ((time.time() < timeout) and
|
||||
not self.validate_state(socket, 1)):
|
||||
while ((time.time() < timeout) and not self.validate_state(socket, 1)):
|
||||
time.sleep(0.1)
|
||||
|
||||
if self.validate_state(socket, 1):
|
||||
logger.debug('Turned ON socket {} at {}'.format(
|
||||
socket, self.ip))
|
||||
logger.debug('Turned ON socket {} at {}'.format(socket, self.ip))
|
||||
else:
|
||||
logger.error('Failed to turn ON socket {} at {}'.format(
|
||||
socket, self.ip))
|
||||
logger.error('Failed to turn ON socket {} at {}'.format(socket, self.ip))
|
||||
|
||||
def close(self):
|
||||
self._community = None
|
||||
@@ -413,8 +393,7 @@ class IpPowerSocketPduController(PduController):
|
||||
def open(self, **params):
|
||||
self._base_url = 'http://{}/outs.cgi?out'.format(params['ip'])
|
||||
password_manager = HTTPPasswordMgrWithDefaultRealm()
|
||||
password_manager.add_password(None, self._base_url, params['user'],
|
||||
params['pass'])
|
||||
password_manager.add_password(None, self._base_url, params['user'], params['pass'])
|
||||
authentication_handler = HTTPBasicAuthHandler(password_manager)
|
||||
self._opener = build_opener(authentication_handler)
|
||||
|
||||
|
||||
@@ -97,5 +97,4 @@ CONTROLLERS = {'RF_SWITCH': RfSwitchController}
|
||||
def get_rf_shield_controller(shield_type, params):
|
||||
if shield_type in CONTROLLERS:
|
||||
return CONTROLLERS[shield_type](**params)
|
||||
logger.exception(
|
||||
'Unknown RF shield controller type: {}'.format(shield_type))
|
||||
logger.exception('Unknown RF shield controller type: {}'.format(shield_type))
|
||||
|
||||
@@ -56,11 +56,7 @@ class SimpleTestResult(unittest.TestResult):
|
||||
|
||||
executions = 0
|
||||
|
||||
def __init__(self,
|
||||
path,
|
||||
auto_reboot_args=None,
|
||||
keep_explorer=False,
|
||||
add_all_devices=False):
|
||||
def __init__(self, path, auto_reboot_args=None, keep_explorer=False, add_all_devices=False):
|
||||
"""Record test results in json file
|
||||
|
||||
Args:
|
||||
@@ -88,21 +84,16 @@ class SimpleTestResult(unittest.TestResult):
|
||||
# create start up script if auto reboot enabled
|
||||
if self.auto_reboot_args:
|
||||
test.auto_reboot = True
|
||||
os.system(
|
||||
'echo %s > "%s"' %
|
||||
(' '.join(self.auto_reboot_args +
|
||||
['-c', test.__class__.__name__]), RESUME_SCRIPT_PATH))
|
||||
os.system('echo %s > "%s"' %
|
||||
(' '.join(self.auto_reboot_args + ['-c', test.__class__.__name__]), RESUME_SCRIPT_PATH))
|
||||
|
||||
# record start timestamp
|
||||
self.started = time.strftime('%Y-%m-%dT%H:%M:%S')
|
||||
|
||||
os.system('mkdir %s' % test.result_dir)
|
||||
self.log_handler = logging.FileHandler(
|
||||
'%s\\auto-%s.log' %
|
||||
(test.result_dir, time.strftime('%Y%m%d%H%M%S')))
|
||||
self.log_handler = logging.FileHandler('%s\\auto-%s.log' % (test.result_dir, time.strftime('%Y%m%d%H%M%S')))
|
||||
self.log_handler.setLevel(logging.DEBUG)
|
||||
self.log_handler.setFormatter(
|
||||
logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
|
||||
self.log_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
|
||||
logger.addHandler(self.log_handler)
|
||||
|
||||
def add_result(self, test, passed, error=None):
|
||||
@@ -126,9 +117,7 @@ class SimpleTestResult(unittest.TestResult):
|
||||
if self.auto_reboot_args:
|
||||
os.system('del "%s"' % RESUME_SCRIPT_PATH)
|
||||
|
||||
json.dump(OrderedDict(sorted(self.result.items(), key=lambda t: t[0])),
|
||||
open(self.path, 'w'),
|
||||
indent=2)
|
||||
json.dump(OrderedDict(sorted(self.result.items(), key=lambda t: t[0])), open(self.path, 'w'), indent=2)
|
||||
|
||||
# save logs
|
||||
logger.removeHandler(self.log_handler)
|
||||
@@ -169,10 +158,7 @@ def list_devices(names=None, continue_from=None, **kwargs):
|
||||
"""List devices in settings file and print versions"""
|
||||
|
||||
if not names:
|
||||
names = [
|
||||
device for device, _type in settings.GOLDEN_DEVICES
|
||||
if _type == 'OpenThread'
|
||||
]
|
||||
names = [device for device, _type in settings.GOLDEN_DEVICES if _type == 'OpenThread']
|
||||
|
||||
if continue_from:
|
||||
continue_from = names.index(continue_from)
|
||||
@@ -218,11 +204,7 @@ def discover(
|
||||
|
||||
if blacklist:
|
||||
try:
|
||||
excludes = [
|
||||
line.strip('\n')
|
||||
for line in open(blacklist, 'r').readlines()
|
||||
if not line.startswith('#')
|
||||
]
|
||||
excludes = [line.strip('\n') for line in open(blacklist, 'r').readlines() if not line.startswith('#')]
|
||||
except BaseException:
|
||||
logger.exception('Failed to open test case black list file')
|
||||
raise
|
||||
@@ -243,11 +225,9 @@ def discover(
|
||||
new_th = False
|
||||
harness_info = ConfigParser.ConfigParser()
|
||||
harness_info.read('%s\\info.ini' % settings.HARNESS_HOME)
|
||||
if harness_info.has_option('Thread_Harness_Info',
|
||||
'Version') and harness_info.has_option(
|
||||
'Thread_Harness_Info', 'Mode'):
|
||||
harness_version = harness_info.get('Thread_Harness_Info',
|
||||
'Version').rsplit(' ', 1)[1]
|
||||
if harness_info.has_option('Thread_Harness_Info', 'Version') and harness_info.has_option(
|
||||
'Thread_Harness_Info', 'Mode'):
|
||||
harness_version = harness_info.get('Thread_Harness_Info', 'Version').rsplit(' ', 1)[1]
|
||||
harness_mode = harness_info.get('Thread_Harness_Info', 'Mode')
|
||||
|
||||
if harness_mode == 'External' and harness_version > '1.4.0':
|
||||
@@ -273,9 +253,7 @@ def discover(
|
||||
case_name = str(case.__class__.__name__)
|
||||
|
||||
# grep name
|
||||
if name_greps and not any(
|
||||
fnmatch.fnmatch(case_name, name_grep)
|
||||
for name_grep in name_greps):
|
||||
if name_greps and not any(fnmatch.fnmatch(case_name, name_grep) for name_grep in name_greps):
|
||||
logger.info('case[%s] skipped by name greps', case_name)
|
||||
continue
|
||||
|
||||
@@ -287,17 +265,15 @@ def discover(
|
||||
# skip cases
|
||||
if case_name in log:
|
||||
if ((log[case_name]['passed'] and ('p' in skip)) or
|
||||
(log[case_name]['passed'] is False and ('f' in skip)) or
|
||||
(log[case_name]['passed'] is None and ('e' in skip))):
|
||||
logger.warning('case[%s] skipped for its status[%s]',
|
||||
case_name, log[case_name]['passed'])
|
||||
(log[case_name]['passed'] is False and ('f' in skip)) or (log[case_name]['passed'] is None and
|
||||
('e' in skip))):
|
||||
logger.warning('case[%s] skipped for its status[%s]', case_name, log[case_name]['passed'])
|
||||
continue
|
||||
|
||||
# continue from
|
||||
if continue_from:
|
||||
if continue_from != case_name:
|
||||
logger.warning('case[%s] skipped for continue from[%s]',
|
||||
case_name, continue_from)
|
||||
logger.warning('case[%s] skipped for continue from[%s]', case_name, continue_from)
|
||||
continue
|
||||
else:
|
||||
continue_from = None
|
||||
@@ -309,9 +285,8 @@ def discover(
|
||||
|
||||
# max devices
|
||||
if max_devices and case.golden_devices_required > max_devices:
|
||||
logger.warning(
|
||||
'case[%s] skipped for exceeding max golden devices allowed[%d]',
|
||||
case_name, max_devices)
|
||||
logger.warning('case[%s] skipped for exceeding max golden devices allowed[%d]', case_name,
|
||||
max_devices)
|
||||
continue
|
||||
|
||||
suite.addTest(case)
|
||||
@@ -343,8 +318,7 @@ def discover(
|
||||
settings.PDU_CONTROLLER_OPEN_PARAMS = {}
|
||||
settings.PDU_CONTROLLER_REBOOT_PARAMS = {}
|
||||
|
||||
result = SimpleTestResult(result_file, auto_reboot_args, keep_explorer,
|
||||
add_all_devices)
|
||||
result = SimpleTestResult(result_file, auto_reboot_args, keep_explorer, add_all_devices)
|
||||
for case in suite:
|
||||
logger.info(case.__class__.__name__)
|
||||
|
||||
@@ -356,8 +330,7 @@ def discover(
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Thread harness test case runner')
|
||||
parser = argparse.ArgumentParser(description='Thread harness test case runner')
|
||||
parser.add_argument('--auto-reboot',
|
||||
'-a',
|
||||
action='store_true',
|
||||
@@ -375,31 +348,15 @@ def main():
|
||||
type=str,
|
||||
help='file to list test cases to skip',
|
||||
default=None)
|
||||
parser.add_argument('--continue-from',
|
||||
'-c',
|
||||
type=str,
|
||||
default=None,
|
||||
help='first case to test')
|
||||
parser.add_argument('--delete-history',
|
||||
'-d',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='clear history on startup')
|
||||
parser.add_argument('--continue-from', '-c', type=str, default=None, help='first case to test')
|
||||
parser.add_argument('--delete-history', '-d', action='store_true', default=False, help='clear history on startup')
|
||||
parser.add_argument('--keep-explorer',
|
||||
'-e',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='do not restart explorer.exe at the end')
|
||||
parser.add_argument('--name-greps',
|
||||
'-g',
|
||||
action='append',
|
||||
default=None,
|
||||
help='grep case by names')
|
||||
parser.add_argument('--list-file',
|
||||
'-i',
|
||||
type=str,
|
||||
default=None,
|
||||
help='file to list cases names to test')
|
||||
parser.add_argument('--name-greps', '-g', action='append', default=None, help='grep case by names')
|
||||
parser.add_argument('--list-file', '-i', type=str, default=None, help='file to list cases names to test')
|
||||
parser.add_argument(
|
||||
'--skip',
|
||||
'-k',
|
||||
@@ -408,21 +365,9 @@ def main():
|
||||
help='type of results to skip. e for error, f for fail, p for pass.',
|
||||
default='',
|
||||
)
|
||||
parser.add_argument('--list-devices',
|
||||
'-l',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='list devices')
|
||||
parser.add_argument('--manual-reset',
|
||||
'-m',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='reset devices manually')
|
||||
parser.add_argument('--dry-run',
|
||||
'-n',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='just show what to run')
|
||||
parser.add_argument('--list-devices', '-l', action='store_true', default=False, help='list devices')
|
||||
parser.add_argument('--manual-reset', '-m', action='store_true', default=False, help='reset devices manually')
|
||||
parser.add_argument('--dry-run', '-n', action='store_true', default=False, help='just show what to run')
|
||||
parser.add_argument(
|
||||
'--result-file',
|
||||
'-o',
|
||||
@@ -436,31 +381,19 @@ def main():
|
||||
type=str,
|
||||
help='file name pattern, default to "*.py"',
|
||||
default='*.py')
|
||||
parser.add_argument('--rerun-fails',
|
||||
'-r',
|
||||
type=int,
|
||||
default=0,
|
||||
help='number of times to rerun failed test cases')
|
||||
parser.add_argument('--rerun-fails', '-r', type=int, default=0, help='number of times to rerun failed test cases')
|
||||
parser.add_argument('--add-all-devices',
|
||||
'-t',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='add all devices to the test bed')
|
||||
parser.add_argument('--max-devices',
|
||||
'-u',
|
||||
type=int,
|
||||
default=0,
|
||||
help='max golden devices allowed')
|
||||
parser.add_argument('--max-devices', '-u', type=int, default=0, help='max golden devices allowed')
|
||||
|
||||
args = vars(parser.parse_args())
|
||||
|
||||
if args['list_file']:
|
||||
try:
|
||||
names = [
|
||||
line.strip('\n')
|
||||
for line in open(args['list_file'], 'r').readlines()
|
||||
if not line.startswith('#')
|
||||
]
|
||||
names = [line.strip('\n') for line in open(args['list_file'], 'r').readlines() if not line.startswith('#')]
|
||||
except BaseException:
|
||||
logger.exception('Failed to open test case list file')
|
||||
raise
|
||||
@@ -478,10 +411,7 @@ def main():
|
||||
|
||||
if rerun_fails > 0:
|
||||
for i in range(rerun_fails):
|
||||
failed_names = {
|
||||
name for name in result.result
|
||||
if result.result[name]['passed'] is False
|
||||
}
|
||||
failed_names = {name for name in result.result if result.result[name]['passed'] is False}
|
||||
if not failed_names:
|
||||
break
|
||||
logger.info('Rerunning failed test cases')
|
||||
|
||||
@@ -37,8 +37,7 @@ class Leader_9_2_9(HarnessCase):
|
||||
case = '9 2 9'
|
||||
golden_devices_required = 3
|
||||
case_need_shield = True
|
||||
device_order = [('Router_2', False), ('Commissioner', True),
|
||||
('Router_1', False), ('DUT', True)]
|
||||
device_order = [('Router_2', False), ('Commissioner', True), ('Router_1', False), ('DUT', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class MED_9_2_10(HarnessCase):
|
||||
case = '9 2 10'
|
||||
golden_devices_required = 4
|
||||
case_need_shield = True
|
||||
device_order = [('SED_1', False), ('DUT', False), ('Router_1', False),
|
||||
('Commissioner', True), ('Leader', True)]
|
||||
device_order = [('SED_1', False), ('DUT', False), ('Router_1', False), ('Commissioner', True), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class Router_9_2_10(HarnessCase):
|
||||
case = '9 2 10'
|
||||
golden_devices_required = 4
|
||||
case_need_shield = True
|
||||
device_order = [('SED_1', False), ('MED_1', False), ('DUT', False),
|
||||
('Commissioner', True), ('Leader', True)]
|
||||
device_order = [('SED_1', False), ('MED_1', False), ('DUT', False), ('Commissioner', True), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class Router_9_2_9(HarnessCase):
|
||||
case = '9 2 9'
|
||||
golden_devices_required = 3
|
||||
case_need_shield = True
|
||||
device_order = [('Router_2', False), ('Commissioner', True), ('DUT', False),
|
||||
('Leader', True)]
|
||||
device_order = [('Router_2', False), ('Commissioner', True), ('DUT', False), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class SED_9_2_10(HarnessCase):
|
||||
case = '9 2 10'
|
||||
golden_devices_required = 4
|
||||
case_need_shield = True
|
||||
device_order = [('DUT', False), ('MED_1', False), ('Router_1', False),
|
||||
('Commissioner', True), ('Leader', True)]
|
||||
device_order = [('DUT', False), ('MED_1', False), ('Router_1', False), ('Commissioner', True), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class Leader_9_2_9(HarnessCase):
|
||||
case = '9 2 9'
|
||||
golden_devices_required = 3
|
||||
case_need_shield = True
|
||||
device_order = [('Router_2', False), ('Commissioner', True),
|
||||
('Router_1', False), ('DUT', True)]
|
||||
device_order = [('Router_2', False), ('Commissioner', True), ('Router_1', False), ('DUT', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class MED_9_2_10(HarnessCase):
|
||||
case = '9 2 10'
|
||||
golden_devices_required = 4
|
||||
case_need_shield = True
|
||||
device_order = [('SED_1', False), ('DUT', False), ('Router_1', False),
|
||||
('Commissioner', True), ('Leader', True)]
|
||||
device_order = [('SED_1', False), ('DUT', False), ('Router_1', False), ('Commissioner', True), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class Router_9_2_10(HarnessCase):
|
||||
case = '9 2 10'
|
||||
golden_devices_required = 4
|
||||
case_need_shield = True
|
||||
device_order = [('SED_1', False), ('MED_1', False), ('DUT', False),
|
||||
('Commissioner', True), ('Leader', True)]
|
||||
device_order = [('SED_1', False), ('MED_1', False), ('DUT', False), ('Commissioner', True), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class Router_9_2_9(HarnessCase):
|
||||
case = '9 2 9'
|
||||
golden_devices_required = 3
|
||||
case_need_shield = True
|
||||
device_order = [('Router_2', False), ('Commissioner', True), ('DUT', False),
|
||||
('Leader', True)]
|
||||
device_order = [('Router_2', False), ('Commissioner', True), ('DUT', False), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -37,8 +37,7 @@ class SED_9_2_10(HarnessCase):
|
||||
case = '9 2 10'
|
||||
golden_devices_required = 4
|
||||
case_need_shield = True
|
||||
device_order = [('DUT', False), ('MED_1', False), ('Router_1', False),
|
||||
('Commissioner', True), ('Leader', True)]
|
||||
device_order = [('DUT', False), ('MED_1', False), ('Router_1', False), ('Commissioner', True), ('Leader', True)]
|
||||
|
||||
def on_dialog(self, dialog, title):
|
||||
pass
|
||||
|
||||
@@ -105,8 +105,7 @@ def device_calculate(topo_file, case_list):
|
||||
|
||||
matched_case = re.match(r'(.*)-(.*)', line, re.M | re.I)
|
||||
|
||||
if 'all' not in case_list and matched_case.group(
|
||||
1) not in case_list:
|
||||
if 'all' not in case_list and matched_case.group(1) not in case_list:
|
||||
continue
|
||||
|
||||
logging.info('case %s:' % matched_case.group(1))
|
||||
@@ -126,8 +125,7 @@ def device_calculate(topo_file, case_list):
|
||||
|
||||
for _, vendor in role_vendor_list:
|
||||
case_vendor_dict[vendor] += 1
|
||||
testbed_vendor_dict[vendor] = max(testbed_vendor_dict[vendor],
|
||||
case_vendor_dict[vendor])
|
||||
testbed_vendor_dict[vendor] = max(testbed_vendor_dict[vendor], case_vendor_dict[vendor])
|
||||
|
||||
logging.info('\tvendor devices : %s' % dict(case_vendor_dict))
|
||||
|
||||
@@ -143,19 +141,16 @@ def device_calculate(topo_file, case_list):
|
||||
if 'Any' in testbed_vendor_dict:
|
||||
testbed_vendor_dict['Any'] = count_any
|
||||
|
||||
logging.info('\nTestbed needed vendor devices:%s' %
|
||||
dict(testbed_vendor_dict))
|
||||
logging.info('\nTestbed needed vendor devices:%s' % dict(testbed_vendor_dict))
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='parse TopologyConfig file and list all devices by case')
|
||||
parser = argparse.ArgumentParser(description='parse TopologyConfig file and list all devices by case')
|
||||
parser.add_argument(
|
||||
'-f',
|
||||
dest='topo_file',
|
||||
default='C:/GRL/Thread1.1/Thread_Harness/TestScripts/TopologyConfig.txt',
|
||||
help=
|
||||
'Topology config file (default: C:/GRL/Thread1.1/Thread_Harness/TestScripts/TopologyConfig.txt)',
|
||||
help='Topology config file (default: C:/GRL/Thread1.1/Thread_Harness/TestScripts/TopologyConfig.txt)',
|
||||
)
|
||||
|
||||
parser.add_argument('-c',
|
||||
|
||||
@@ -43,27 +43,20 @@ class OT_Sniffer(ISniffer):
|
||||
self.is_active = False
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('OT_Sniffer: [intialize] --> ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('OT_Sniffer: [intialize] --> ' + str(e))
|
||||
|
||||
def discoverSniffer(self):
|
||||
sniffers = []
|
||||
|
||||
p_discover = subprocess.Popen('extcap_ot.bat --extcap-interfaces',
|
||||
stdout=subprocess.PIPE,
|
||||
shell=True)
|
||||
p_discover = subprocess.Popen('extcap_ot.bat --extcap-interfaces', stdout=subprocess.PIPE, shell=True)
|
||||
for line in p_discover.stdout.readlines():
|
||||
if line.startswith('interface'):
|
||||
try:
|
||||
# e.g. interface {value=COM10:460800}{display=OpenThread Sniffer COM10}
|
||||
interface_port = line[line.index('value=') +
|
||||
6:line.index('}{display')]
|
||||
sniffers.append(
|
||||
OT_Sniffer(addressofDevice=interface_port,
|
||||
channel=ModuleHelper.Default_Channel))
|
||||
interface_port = line[line.index('value=') + 6:line.index('}{display')]
|
||||
sniffers.append(OT_Sniffer(addressofDevice=interface_port, channel=ModuleHelper.Default_Channel))
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'OT_Sniffer: [discoverSniffer] --> Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('OT_Sniffer: [discoverSniffer] --> Error: ' + str(e))
|
||||
|
||||
p_discover.wait()
|
||||
return sniffers
|
||||
@@ -88,8 +81,7 @@ class OT_Sniffer(ISniffer):
|
||||
|
||||
if python_exe.endswith(".exe"):
|
||||
# sniffer_py: e.g. C:\Python37\Scripts\sniffer.py
|
||||
sniffer_py = str(
|
||||
os.path.dirname(python_exe)) + '\\Scripts\\sniffer.py'
|
||||
sniffer_py = str(os.path.dirname(python_exe)) + '\\Scripts\\sniffer.py'
|
||||
|
||||
cmd = [
|
||||
python_exe,
|
||||
@@ -105,13 +97,11 @@ class OT_Sniffer(ISniffer):
|
||||
captureFileLocation,
|
||||
]
|
||||
self.is_active = True
|
||||
ModuleHelper.WriteIntoDebugLogger('OT_Sniffer: [cmd] --> %s' %
|
||||
str(cmd))
|
||||
ModuleHelper.WriteIntoDebugLogger('OT_Sniffer: [cmd] --> %s' % str(cmd))
|
||||
self.subprocess = subprocess.Popen(cmd)
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'OT_Sniffer: [startSniffer] --> Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('OT_Sniffer: [startSniffer] --> Error: ' + str(e))
|
||||
|
||||
def stopSniffer(self):
|
||||
"""
|
||||
|
||||
@@ -62,8 +62,7 @@ from IThci import IThci
|
||||
LINESEPX = re.compile(r'\r\n|\n')
|
||||
"""regex: used to split lines"""
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format="%(asctime)s - %(levelname)s - %(message)s")
|
||||
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
|
||||
|
||||
_callStackDepth = 0
|
||||
|
||||
@@ -74,8 +73,8 @@ def watched(func):
|
||||
@functools.wraps(func)
|
||||
def wrapped_api_func(self, *args, **kwargs):
|
||||
global _callStackDepth
|
||||
callstr = '====' * _callStackDepth + "> %s%s%s" % (
|
||||
func_name, str(args) if args else "", str(kwargs) if kwargs else "")
|
||||
callstr = '====' * _callStackDepth + "> %s%s%s" % (func_name, str(args) if args else "",
|
||||
str(kwargs) if kwargs else "")
|
||||
|
||||
_callStackDepth += 1
|
||||
try:
|
||||
@@ -84,8 +83,7 @@ def watched(func):
|
||||
self.log("%s returns %r", callstr, ret)
|
||||
return ret
|
||||
except Exception as ex:
|
||||
self.log("FUNC %s failed: %s\n%s", func_name, str(ex),
|
||||
traceback.format_exc())
|
||||
self.log("FUNC %s failed: %s\n%s", func_name, str(ex), traceback.format_exc())
|
||||
raise
|
||||
finally:
|
||||
_callStackDepth -= 1
|
||||
@@ -230,8 +228,7 @@ class OpenThreadTHCI(object):
|
||||
break
|
||||
|
||||
if line != 'Done':
|
||||
raise Exception('%s: failed to find end of response: %s' %
|
||||
(self.port, response))
|
||||
raise Exception('%s: failed to find end of response: %s' % (self.port, response))
|
||||
|
||||
return response
|
||||
|
||||
@@ -316,11 +313,9 @@ class OpenThreadTHCI(object):
|
||||
if self.firmwarePrefix in self.UIStatusMsg:
|
||||
self.deviceConnected = True
|
||||
else:
|
||||
self.UIStatusMsg = ('Firmware Not Matching Expecting ' +
|
||||
self.firmwarePrefix + ', Now is ' +
|
||||
self.UIStatusMsg = ('Firmware Not Matching Expecting ' + self.firmwarePrefix + ', Now is ' +
|
||||
self.UIStatusMsg)
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'Err: OpenThread device Firmware not matching..')
|
||||
ModuleHelper.WriteIntoDebugLogger('Err: OpenThread device Firmware not matching..')
|
||||
|
||||
@API
|
||||
def closeConnection(self):
|
||||
@@ -335,8 +330,7 @@ class OpenThreadTHCI(object):
|
||||
cmd = 'routereligible disable'
|
||||
self.__executeCommand(cmd)
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'__disableRouterEligible() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('__disableRouterEligible() Error: ' + str(e))
|
||||
|
||||
def __setDeviceMode(self, mode):
|
||||
"""set thread device mode:
|
||||
@@ -358,8 +352,7 @@ class OpenThreadTHCI(object):
|
||||
cmd = 'mode %s' % mode
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setDeviceMode() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setDeviceMode() Error: ' + str(e))
|
||||
|
||||
def __setRouterUpgradeThreshold(self, iThreshold):
|
||||
"""set router upgrade threshold
|
||||
@@ -378,8 +371,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'setRouterUpgradeThreshold() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setRouterUpgradeThreshold() Error: ' + str(e))
|
||||
|
||||
def __setRouterDowngradeThreshold(self, iThreshold):
|
||||
"""set router downgrade threshold
|
||||
@@ -399,8 +391,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'setRouterDowngradeThreshold() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setRouterDowngradeThreshold() Error: ' + str(e))
|
||||
|
||||
def __setRouterSelectionJitter(self, iRouterJitter):
|
||||
"""set ROUTER_SELECTION_JITTER parameter for REED to upgrade to Router
|
||||
@@ -418,8 +409,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'setRouterSelectionJitter() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setRouterSelectionJitter() Error: ' + str(e))
|
||||
|
||||
def __setAddressfilterMode(self, mode):
|
||||
"""set address filter mode
|
||||
@@ -435,8 +425,7 @@ class OpenThreadTHCI(object):
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'__setAddressFilterMode() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('__setAddressFilterMode() Error: ' + str(e))
|
||||
|
||||
def __startOpenThread(self):
|
||||
"""start OpenThread stack
|
||||
@@ -479,8 +468,7 @@ class OpenThreadTHCI(object):
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('startOpenThread() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('startOpenThread() Error: ' + str(e))
|
||||
|
||||
def __stopOpenThread(self):
|
||||
"""stop OpenThread stack
|
||||
@@ -496,8 +484,7 @@ class OpenThreadTHCI(object):
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('stopOpenThread() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('stopOpenThread() Error: ' + str(e))
|
||||
|
||||
def __isOpenThreadRunning(self):
|
||||
"""check whether or not OpenThread is running
|
||||
@@ -568,9 +555,7 @@ class OpenThreadTHCI(object):
|
||||
prefix2 = self.__lstrip0x(prefix1)
|
||||
hexPrefix = str(prefix2).ljust(16, '0')
|
||||
hexIter = iter(hexPrefix)
|
||||
finalMac = ':'.join(
|
||||
a + b + c + d
|
||||
for a, b, c, d in zip(hexIter, hexIter, hexIter, hexIter))
|
||||
finalMac = ':'.join(a + b + c + d for a, b, c, d in zip(hexIter, hexIter, hexIter, hexIter))
|
||||
prefix = str(finalMac)
|
||||
strIp6Prefix = prefix[:19]
|
||||
return strIp6Prefix + '::'
|
||||
@@ -636,8 +621,7 @@ class OpenThreadTHCI(object):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
self.joinCommissionedStatus = self.joinStatus[
|
||||
'succeed'] if joinSucceed else self.joinStatus['failed']
|
||||
self.joinCommissionedStatus = self.joinStatus['succeed'] if joinSucceed else self.joinStatus['failed']
|
||||
self.logThreadStatus = self.logStatus['stop']
|
||||
return logs
|
||||
|
||||
@@ -665,8 +649,7 @@ class OpenThreadTHCI(object):
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setChannelMask() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setChannelMask() Error: ' + str(e))
|
||||
|
||||
def __setSecurityPolicy(self, securityPolicySecs, securityPolicyFlags):
|
||||
print('call _setSecurityPolicy')
|
||||
@@ -678,8 +661,7 @@ class OpenThreadTHCI(object):
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setSecurityPolicy() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setSecurityPolicy() Error: ' + str(e))
|
||||
|
||||
def __setKeySwitchGuardTime(self, iKeySwitchGuardTime):
|
||||
""" set the Key switch guard time
|
||||
@@ -701,8 +683,7 @@ class OpenThreadTHCI(object):
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'setKeySwitchGuardTime() Error; ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setKeySwitchGuardTime() Error; ' + str(e))
|
||||
|
||||
def __getCommissionerSessionId(self):
|
||||
""" get the commissioner session id allocated from Leader """
|
||||
@@ -741,11 +722,9 @@ class OpenThreadTHCI(object):
|
||||
cmd = 'networkname %s' % networkName
|
||||
datasetCmd = 'dataset networkname %s' % networkName
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and
|
||||
self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setNetworkName() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setNetworkName() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setChannel(self, channel=11):
|
||||
@@ -767,8 +746,7 @@ class OpenThreadTHCI(object):
|
||||
cmd = 'channel %s' % channel
|
||||
datasetCmd = 'dataset channel %s' % channel
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and
|
||||
self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setChannel() Error: ' + str(e))
|
||||
|
||||
@@ -914,11 +892,9 @@ class OpenThreadTHCI(object):
|
||||
|
||||
self.networkKey = masterKey
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and
|
||||
self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setNetworkkey() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setNetworkkey() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def addBlockedMAC(self, xEUI):
|
||||
@@ -959,8 +935,7 @@ class OpenThreadTHCI(object):
|
||||
|
||||
return ret
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('addBlockedMAC() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('addBlockedMAC() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def addAllowMAC(self, xEUI):
|
||||
@@ -1024,8 +999,7 @@ class OpenThreadTHCI(object):
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('clearBlockList() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('clearBlockList() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def clearAllowList(self):
|
||||
@@ -1053,8 +1027,7 @@ class OpenThreadTHCI(object):
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('clearAllowList() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('clearAllowList() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def getDeviceRole(self):
|
||||
@@ -1128,9 +1101,7 @@ class OpenThreadTHCI(object):
|
||||
if self._update_router_status and eRoleId == Thread_Device_Role.Router:
|
||||
self.__updateRouterStatus()
|
||||
|
||||
self.sleep(
|
||||
5
|
||||
) # increase delay temporally (+5s) to remedy TH's delay updates
|
||||
self.sleep(5) # increase delay temporally (+5s) to remedy TH's delay updates
|
||||
|
||||
return True
|
||||
except Exception as e:
|
||||
@@ -1234,9 +1205,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
self.__sendCommand(cmd)
|
||||
# wait echo reply
|
||||
self.sleep(
|
||||
6
|
||||
) # increase delay temporally (+5s) to remedy TH's delay updates
|
||||
self.sleep(6) # increase delay temporally (+5s) to remedy TH's delay updates
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('ping() Error: ' + str(e))
|
||||
|
||||
@@ -1258,8 +1227,7 @@ class OpenThreadTHCI(object):
|
||||
# wait echo reply
|
||||
self.sleep(1)
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('multicast_ping() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('multicast_ping() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setPANID(self, xPAN):
|
||||
@@ -1283,8 +1251,7 @@ class OpenThreadTHCI(object):
|
||||
cmd = 'panid %s' % panid
|
||||
datasetCmd = 'dataset panid %s' % panid
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and
|
||||
self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setPANID() Error: ' + str(e))
|
||||
|
||||
@@ -1362,8 +1329,7 @@ class OpenThreadTHCI(object):
|
||||
try:
|
||||
self.setMAC(self.mac)
|
||||
self.__setChannelMask(self.channelMask)
|
||||
self.__setSecurityPolicy(self.securityPolicySecs,
|
||||
self.securityPolicyFlags)
|
||||
self.__setSecurityPolicy(self.securityPolicySecs, self.securityPolicyFlags)
|
||||
self.setChannel(self.channel)
|
||||
self.setPANID(self.panId)
|
||||
self.setXpanId(self.xpanId)
|
||||
@@ -1373,8 +1339,7 @@ class OpenThreadTHCI(object):
|
||||
self.setPSKc(self.pskc)
|
||||
self.setActiveTimestamp(self.activetimestamp)
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setDefaultValue() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setDefaultValue() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def getDeviceConncetionStatus(self):
|
||||
@@ -1422,8 +1387,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('__setPollPeriod() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('__setPollPeriod() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setLinkQuality(self, EUIadr, LinkQuality):
|
||||
@@ -1462,8 +1426,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setLinkQuality() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setLinkQuality() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setOutBoundLinkQuality(self, LinkQuality):
|
||||
@@ -1488,8 +1451,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'setOutBoundLinkQuality() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setOutBoundLinkQuality() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def removeRouterPrefix(self, prefixEntry):
|
||||
@@ -1515,8 +1477,7 @@ class OpenThreadTHCI(object):
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('removeRouterPrefix() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('removeRouterPrefix() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def resetAndRejoin(self, timeout):
|
||||
@@ -1547,8 +1508,7 @@ class OpenThreadTHCI(object):
|
||||
return False
|
||||
return True
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('resetAndRejoin() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('resetAndRejoin() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def configBorderRouter(
|
||||
@@ -1619,13 +1579,11 @@ class OpenThreadTHCI(object):
|
||||
return True
|
||||
else:
|
||||
# send server data ntf to leader
|
||||
return self.__executeCommand(
|
||||
'netdataregister')[-1] == 'Done'
|
||||
return self.__executeCommand('netdataregister')[-1] == 'Done'
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('configBorderRouter() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('configBorderRouter() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setNetworkIDTimeout(self, iNwkIDTimeOut):
|
||||
@@ -1646,8 +1604,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setNetworkIDTimeout() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setNetworkIDTimeout() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setKeepAliveTimeOut(self, iTimeOut):
|
||||
@@ -1669,8 +1626,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setKeepAliveTimeOut() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setKeepAliveTimeOut() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setKeySequenceCounter(self, iKeySequenceValue):
|
||||
@@ -1696,8 +1652,7 @@ class OpenThreadTHCI(object):
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'setKeySequenceCounter() Error; ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setKeySequenceCounter() Error; ' + str(e))
|
||||
|
||||
@API
|
||||
def getKeySequenceCounter(self):
|
||||
@@ -1729,8 +1684,7 @@ class OpenThreadTHCI(object):
|
||||
print(keySequence)
|
||||
return self.setKeySequenceCounter(keySequence)
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'incrementKeySequenceCounter() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('incrementKeySequenceCounter() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setNetworkDataRequirement(self, eDataRequirement):
|
||||
@@ -1791,8 +1745,7 @@ class OpenThreadTHCI(object):
|
||||
# send server data ntf to leader
|
||||
return self.__executeCommand('netdataregister')[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('configExternalRouter() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('configExternalRouter() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def getNeighbouringRouters(self):
|
||||
@@ -1835,8 +1788,7 @@ class OpenThreadTHCI(object):
|
||||
print(routerInfo)
|
||||
return routerInfo
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger(
|
||||
'getNeighbouringDevice() Error: ' + str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('getNeighbouringDevice() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def getChildrenInfo(self):
|
||||
@@ -1885,8 +1837,7 @@ class OpenThreadTHCI(object):
|
||||
print(childrenInfoAll)
|
||||
return childrenInfoAll
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('getChildrenInfo() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('getChildrenInfo() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setXpanId(self, xPanId):
|
||||
@@ -1914,8 +1865,7 @@ class OpenThreadTHCI(object):
|
||||
|
||||
self.xpanId = xpanid
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and
|
||||
self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
return (self.__executeCommand(cmd)[-1] == 'Done' and self.__executeCommand(datasetCmd)[-1] == 'Done')
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setXpanId() Error: ' + str(e))
|
||||
|
||||
@@ -2056,8 +2006,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('forceSetSlaac() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('forceSetSlaac() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setSleepyNodePollTime(self):
|
||||
@@ -2180,8 +2129,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
if self.__executeCommand(cmd)[-1] == 'Done':
|
||||
if self.logThreadStatus == self.logStatus['stop']:
|
||||
self.logThread = ThreadRunner.run(
|
||||
target=self.__readCommissioningLogs, args=(120,))
|
||||
self.logThread = ThreadRunner.run(target=self.__readCommissioningLogs, args=(120,))
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@@ -2224,8 +2172,7 @@ class OpenThreadTHCI(object):
|
||||
else:
|
||||
return False
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('allowcommission() error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('allowcommission() error: ' + str(e))
|
||||
|
||||
@API
|
||||
def joinCommissioned(self, strPSKd='THREADJPAKETEST', waitTime=20):
|
||||
@@ -2247,8 +2194,7 @@ class OpenThreadTHCI(object):
|
||||
self.joinCommissionedStatus = self.joinStatus['ongoing']
|
||||
|
||||
if self.logThreadStatus == self.logStatus['stop']:
|
||||
self.logThread = ThreadRunner.run(
|
||||
target=self.__readCommissioningLogs, args=(maxDuration,))
|
||||
self.logThread = ThreadRunner.run(target=self.__readCommissioningLogs, args=(maxDuration,))
|
||||
|
||||
t_end = time.time() + maxDuration
|
||||
while time.time() < t_end:
|
||||
@@ -2289,28 +2235,20 @@ class OpenThreadTHCI(object):
|
||||
infoType = info[0].strip()
|
||||
infoValue = info[1].strip()
|
||||
if 'direction' in infoType:
|
||||
EncryptedPacket.Direction = (
|
||||
PlatformDiagnosticPacket_Direction.IN
|
||||
if 'recv' in infoValue else
|
||||
PlatformDiagnosticPacket_Direction.OUT
|
||||
if 'send' in infoValue else
|
||||
PlatformDiagnosticPacket_Direction.UNKNOWN)
|
||||
EncryptedPacket.Direction = (PlatformDiagnosticPacket_Direction.IN
|
||||
if 'recv' in infoValue else PlatformDiagnosticPacket_Direction.OUT if
|
||||
'send' in infoValue else PlatformDiagnosticPacket_Direction.UNKNOWN)
|
||||
elif 'type' in infoType:
|
||||
EncryptedPacket.Type = (
|
||||
PlatformDiagnosticPacket_Type.JOIN_FIN_req
|
||||
if 'JOIN_FIN.req' in infoValue else
|
||||
PlatformDiagnosticPacket_Type.JOIN_FIN_rsp
|
||||
if 'JOIN_FIN.rsp' in infoValue else
|
||||
PlatformDiagnosticPacket_Type.JOIN_ENT_req
|
||||
if 'JOIN_ENT.ntf' in infoValue else
|
||||
PlatformDiagnosticPacket_Type.
|
||||
JOIN_ENT_rsp if 'JOIN_ENT.rsp' in
|
||||
infoValue else PlatformDiagnosticPacket_Type.UNKNOWN)
|
||||
EncryptedPacket.Type = (PlatformDiagnosticPacket_Type.JOIN_FIN_req
|
||||
if 'JOIN_FIN.req' in infoValue else
|
||||
PlatformDiagnosticPacket_Type.JOIN_FIN_rsp if 'JOIN_FIN.rsp' in infoValue
|
||||
else PlatformDiagnosticPacket_Type.JOIN_ENT_req if 'JOIN_ENT.ntf' in
|
||||
infoValue else PlatformDiagnosticPacket_Type.JOIN_ENT_rsp if 'JOIN_ENT.rsp'
|
||||
in infoValue else PlatformDiagnosticPacket_Type.UNKNOWN)
|
||||
elif 'len' in infoType:
|
||||
bytesInEachLine = 16
|
||||
EncryptedPacket.TLVsLength = int(infoValue)
|
||||
payloadLineCount = (int(infoValue) + bytesInEachLine -
|
||||
1) / bytesInEachLine
|
||||
payloadLineCount = (int(infoValue) + bytesInEachLine - 1) / bytesInEachLine
|
||||
while payloadLineCount > 0:
|
||||
payloadLineCount = payloadLineCount - 1
|
||||
payloadLine = rawLogs.get()
|
||||
@@ -2322,8 +2260,8 @@ class OpenThreadTHCI(object):
|
||||
if '..' not in payloadValues[num]:
|
||||
payload.append(int(payloadValues[num], 16))
|
||||
|
||||
EncryptedPacket.TLVs = (PlatformPackets.read(
|
||||
EncryptedPacket.Type, payload) if payload != [] else [])
|
||||
EncryptedPacket.TLVs = (PlatformPackets.read(EncryptedPacket.Type, payload)
|
||||
if payload != [] else [])
|
||||
|
||||
ProcessedLogs.append(EncryptedPacket)
|
||||
return ProcessedLogs
|
||||
@@ -2354,8 +2292,7 @@ class OpenThreadTHCI(object):
|
||||
"""
|
||||
print('%s call MGMT_ED_SCAN' % self.port)
|
||||
channelMask = ''
|
||||
channelMask = '0x' + self.__convertLongToHex(
|
||||
self.__convertChannelMask(listChannelMask))
|
||||
channelMask = '0x' + self.__convertLongToHex(self.__convertChannelMask(listChannelMask))
|
||||
try:
|
||||
cmd = 'commissioner energy %s %s %s %s %s' % (
|
||||
channelMask,
|
||||
@@ -2370,8 +2307,7 @@ class OpenThreadTHCI(object):
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ED_SCAN() error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_PANID_QUERY(self, sAddr, xCommissionerSessionId, listChannelMask,
|
||||
xPanId):
|
||||
def MGMT_PANID_QUERY(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId):
|
||||
"""send MGMT_PANID_QUERY message to a given destination
|
||||
|
||||
Args:
|
||||
@@ -2384,8 +2320,7 @@ class OpenThreadTHCI(object):
|
||||
print('%s call MGMT_PANID_QUERY' % self.port)
|
||||
panid = ''
|
||||
channelMask = ''
|
||||
channelMask = '0x' + self.__convertLongToHex(
|
||||
self.__convertChannelMask(listChannelMask))
|
||||
channelMask = '0x' + self.__convertLongToHex(self.__convertChannelMask(listChannelMask))
|
||||
|
||||
if not isinstance(xPanId, str):
|
||||
panid = str(hex(xPanId))
|
||||
@@ -2395,12 +2330,10 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_PANID_QUERY() error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_PANID_QUERY() error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_ANNOUNCE_BEGIN(self, sAddr, xCommissionerSessionId,
|
||||
listChannelMask, xCount, xPeriod):
|
||||
def MGMT_ANNOUNCE_BEGIN(self, sAddr, xCommissionerSessionId, listChannelMask, xCount, xPeriod):
|
||||
"""send MGMT_ANNOUNCE_BEGIN message to a given destination
|
||||
|
||||
Returns:
|
||||
@@ -2409,8 +2342,7 @@ class OpenThreadTHCI(object):
|
||||
"""
|
||||
print('%s call MGMT_ANNOUNCE_BEGIN' % self.port)
|
||||
channelMask = ''
|
||||
channelMask = '0x' + self.__convertLongToHex(
|
||||
self.__convertChannelMask(listChannelMask))
|
||||
channelMask = '0x' + self.__convertLongToHex(self.__convertChannelMask(listChannelMask))
|
||||
try:
|
||||
cmd = 'commissioner announce %s %s %s %s' % (
|
||||
channelMask,
|
||||
@@ -2421,8 +2353,7 @@ class OpenThreadTHCI(object):
|
||||
print(cmd)
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ANNOUNCE_BEGIN() error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ANNOUNCE_BEGIN() error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_ACTIVE_GET(self, Addr='', TLVs=[]):
|
||||
@@ -2450,8 +2381,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_GET() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_GET() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_ACTIVE_SET(
|
||||
@@ -2518,13 +2448,11 @@ class OpenThreadTHCI(object):
|
||||
|
||||
if listChannelMask is not None:
|
||||
cmd += ' channelmask '
|
||||
cmd += '0x' + self.__convertLongToHex(
|
||||
self.__convertChannelMask(listChannelMask))
|
||||
cmd += '0x' + self.__convertLongToHex(self.__convertChannelMask(listChannelMask))
|
||||
|
||||
if (sPSKc is not None or listSecurityPolicy is not None or
|
||||
xCommissioningSessionId is not None or
|
||||
xTmfPort is not None or xSteeringData is not None or
|
||||
xBorderRouterLocator is not None or BogusTLV is not None):
|
||||
if (sPSKc is not None or listSecurityPolicy is not None or xCommissioningSessionId is not None or
|
||||
xTmfPort is not None or xSteeringData is not None or xBorderRouterLocator is not None or
|
||||
BogusTLV is not None):
|
||||
cmd += ' binary '
|
||||
|
||||
if sPSKc is not None:
|
||||
@@ -2610,8 +2538,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_SET() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_ACTIVE_SET() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_PENDING_GET(self, Addr='', TLVs=[]):
|
||||
@@ -2639,8 +2566,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_GET() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_GET() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_PENDING_SET(
|
||||
@@ -2716,8 +2642,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_SET() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_PENDING_SET() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_COMM_GET(self, Addr='ff02::1', TLVs=[]):
|
||||
@@ -2741,8 +2666,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_GET() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_GET() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def MGMT_COMM_SET(
|
||||
@@ -2793,8 +2717,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_SET() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('MGMT_COMM_SET() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setActiveDataset(self, listActiveDataset=[]):
|
||||
@@ -2823,8 +2746,7 @@ class OpenThreadTHCI(object):
|
||||
self.hasActiveDatasetToCommit = True
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
except Exception as e:
|
||||
ModuleHelper.WriteIntoDebugLogger('setActiveTimestamp() Error: ' +
|
||||
str(e))
|
||||
ModuleHelper.WriteIntoDebugLogger('setActiveTimestamp() Error: ' + str(e))
|
||||
|
||||
@API
|
||||
def setUdpJoinerPort(self, portNumber):
|
||||
@@ -2856,8 +2778,7 @@ class OpenThreadTHCI(object):
|
||||
return self.__executeCommand(cmd)[-1] == 'Done'
|
||||
|
||||
@API
|
||||
def sendBeacons(self, sAddr, xCommissionerSessionId, listChannelMask,
|
||||
xPanId):
|
||||
def sendBeacons(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId):
|
||||
print('%s call sendBeacons' % self.port)
|
||||
self.__sendCommand('scan', expectEcho=False)
|
||||
return True
|
||||
|
||||
@@ -53,9 +53,7 @@ assert LOGX.match('[57522.618196] Under-voltage detected! (0x00050005)')
|
||||
OTBR_AGENT_SYSLOG_PATTERN = re.compile(r'raspberrypi otbr-agent\[\d+\]: (.*)')
|
||||
assert OTBR_AGENT_SYSLOG_PATTERN.search(
|
||||
'Jun 23 05:21:22 raspberrypi otbr-agent[323]: =========[[THCI] direction=send | type=JOIN_FIN.req | len=039]==========]'
|
||||
).group(
|
||||
1
|
||||
) == '=========[[THCI] direction=send | type=JOIN_FIN.req | len=039]==========]'
|
||||
).group(1) == '=========[[THCI] direction=send | type=JOIN_FIN.req | len=039]==========]'
|
||||
|
||||
|
||||
class OpenThread_BR(OpenThreadTHCI, IThci):
|
||||
@@ -126,8 +124,7 @@ class OpenThread_BR(OpenThreadTHCI, IThci):
|
||||
@watched
|
||||
def _onCommissionStart(self):
|
||||
assert self.__syslog_skip_lines is None
|
||||
self.__syslog_skip_lines = int(
|
||||
self.bash('wc -l /var/log/syslog')[0].split()[0])
|
||||
self.__syslog_skip_lines = int(self.bash('wc -l /var/log/syslog')[0].split()[0])
|
||||
self.__syslog_last_read_ts = 0
|
||||
|
||||
@watched
|
||||
@@ -191,10 +188,7 @@ class OpenThread_BR(OpenThreadTHCI, IThci):
|
||||
self.__bashWrite('\x03')
|
||||
raise Exception('%s: failed to find end of response' % self.port)
|
||||
|
||||
def __bashExpect(self,
|
||||
expected,
|
||||
timeout=DEFAULT_COMMAND_TIMEOUT,
|
||||
endswith=False):
|
||||
def __bashExpect(self, expected, timeout=DEFAULT_COMMAND_TIMEOUT, endswith=False):
|
||||
print('[%s] Expecting [%r]' % (self.port, expected))
|
||||
|
||||
deadline = time.time() + timeout
|
||||
@@ -248,10 +242,8 @@ class OpenThread_BR(OpenThreadTHCI, IThci):
|
||||
try:
|
||||
tail += self.__bashRead(timeout=timeout)
|
||||
tail = tail.replace(RPI_FULL_PROMPT, RPI_FULL_PROMPT + '\r\n')
|
||||
tail = tail.replace(RPI_USERNAME_PROMPT,
|
||||
RPI_USERNAME_PROMPT + '\r\n')
|
||||
tail = tail.replace(RPI_PASSWORD_PROMPT,
|
||||
RPI_PASSWORD_PROMPT + '\r\n')
|
||||
tail = tail.replace(RPI_USERNAME_PROMPT, RPI_USERNAME_PROMPT + '\r\n')
|
||||
tail = tail.replace(RPI_PASSWORD_PROMPT, RPI_PASSWORD_PROMPT + '\r\n')
|
||||
finally:
|
||||
self.__lines += [l.rstrip('\r') for l in LINESEPX.split(tail)]
|
||||
assert len(self.__lines) >= 1, self.__lines
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user