From 97fbca2063a964531a7c00cd504a24512c2dd20d Mon Sep 17 00:00:00 2001 From: Buke Po Date: Tue, 20 Dec 2016 13:47:57 +0800 Subject: [PATCH] support interop and harness r34 (#1092) --- .../autothreadharness/harness_case.py | 107 +++++++++--------- .../autothreadharness/harness_controller.py | 10 +- .../autothreadharness/settings_sample.py | 18 +-- .../harness-automation/cases/router_5_2_7.py | 43 ------- tools/harness-thci/deviceInputFields.xml | 2 +- 5 files changed, 70 insertions(+), 110 deletions(-) delete mode 100644 tools/harness-automation/cases/router_5_2_7.py diff --git a/tools/harness-automation/autothreadharness/harness_case.py b/tools/harness-automation/autothreadharness/harness_case.py index 427c01d10..0f90caae2 100644 --- a/tools/harness-automation/autothreadharness/harness_case.py +++ b/tools/harness-automation/autothreadharness/harness_case.py @@ -172,6 +172,9 @@ class HarnessCase(unittest.TestCase): logger.warning('All golden devices may not be resetted') return + if settings.AUTO_DUT: + return + for device in settings.GOLDEN_DEVICES: try: with OpenThreadController(device) as otc: @@ -213,6 +216,7 @@ class HarnessCase(unittest.TestCase): time.sleep(1) self._hc.start() time.sleep(2) + os.system('taskkill /t /f /im chrome.exe') def _destroy_harness(self): """Stop harness backend service @@ -231,7 +235,7 @@ class HarnessCase(unittest.TestCase): self.dut = None return - dut_port = settings.DUT_DEVICE + dut_port = settings.DUT_DEVICE[0] dut = OpenThreadController(dut_port) self.dut = dut @@ -262,7 +266,8 @@ class HarnessCase(unittest.TestCase): browser.maximize_window() browser.get(settings.HARNESS_URL) self._browser = browser - self.assertIn('Thread', browser.title) + if not self.wait_until(lambda: 'Thread' in browser.title, 30): + self.assertIn('Thread', browser.title) def _destroy_browser(self): """Close the browser. @@ -345,6 +350,14 @@ class HarnessCase(unittest.TestCase): time.sleep(1) + try: + skip_button = self._browser.find_element_by_id('SkipPrepareDevice') + if skip_button.is_enabled(): + skip_button.click() + time.sleep(1) + except: + logger.info('Still detecting sniffers') + try: next_button = self._browser.find_element_by_id('nextButton') except: @@ -389,6 +402,29 @@ class HarnessCase(unittest.TestCase): connect_all = self._browser.find_element_by_link_text('Connect All') connect_all.click() + def _add_device(self, port, device_type_id): + browser = self._browser + test_bed = browser.find_element_by_id('test-bed') + device = browser.find_element_by_id(device_type_id) + # drag + action_chains = ActionChains(browser) + action_chains.click_and_hold(device) + action_chains.move_to_element(test_bed).perform() + time.sleep(1) + + # drop + drop_hw = browser.find_element_by_class_name('drop-hw') + action_chains = ActionChains(browser) + action_chains.move_to_element(drop_hw) + action_chains.release(drop_hw).perform() + + time.sleep(0.5) + selected_hw = browser.find_element_by_class_name('selected-hw') + form_inputs = selected_hw.find_elements_by_tag_name('input') + form_port = form_inputs[0] + form_port.clear() + form_port.send_keys(port) + def _test_bed(self): """Set up the test bed. @@ -406,43 +442,29 @@ class HarnessCase(unittest.TestCase): remove_button.click() selected_hw_num = selected_hw_num - 1 - devices = filter(lambda port: not (self.history.is_bad_golden_device(port) or (not self.auto_dut and port == settings.DUT_DEVICE )), - settings.GOLDEN_DEVICES) + devices = list(settings.GOLDEN_DEVICES) + for index, device in enumerate(devices): + port = device[0] + if (self.history.is_bad_golden_device(port) or (settings.DUT_DEVICE and port == settings.DUT_DEVICE[0])): + devices.remove(device) + logger.info('Available golden devices: %s', json.dumps(devices, indent=2)) golden_devices_required = self.golden_devices_required - if self.auto_dut: - golden_devices_required = golden_devices_required + 1 + if self.auto_dut and not settings.DUT_DEVICE: + golden_devices_required += 1 if len(devices) < golden_devices_required: raise Exception('Golden devices is not enough') - device_type_id = settings.GOLDEN_DEVICE_TYPE - + # add golden devices while golden_devices_required: - device = browser.find_element_by_id(device_type_id) - # drag - action_chains = ActionChains(browser) - action_chains.click_and_hold(device) - action_chains.move_to_element(test_bed).perform() - time.sleep(1) - - # drop - drop_hw = browser.find_element_by_class_name('drop-hw') - action_chains = ActionChains(browser) - action_chains.move_to_element(drop_hw) - action_chains.release(drop_hw).perform() - - time.sleep(0.5) + self._add_device(*devices.pop()) golden_devices_required = golden_devices_required - 1 - 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_port = form_inputs[0] - form_port.clear() - device = devices.pop() - form_port.send_keys(device) + # add DUT + if settings.DUT_DEVICE: + self._add_device(*settings.DUT_DEVICE) while True: try: @@ -459,6 +481,9 @@ class HarnessCase(unittest.TestCase): for selected_hw in bad_ones: port = form_port.get_attribute('value').encode('utf8') + if settings.DUT_DEVICE and port == settings.DUT_DEVICE[0]: + raise Exception('DUT device failed') + if not settings.APC_HOST: # port cannot recover without power off self.history.mark_bad_golden_device(port) @@ -467,28 +492,8 @@ class HarnessCase(unittest.TestCase): selected_hw.find_element_by_class_name('removeSelectedDevice').click() time.sleep(0.1) - device = browser.find_element_by_id(device_type_id) - # drag - action_chains = ActionChains(browser) - action_chains.click_and_hold(device) - action_chains.move_to_element(test_bed).perform() - time.sleep(1) - - # drop - drop_hw = browser.find_element_by_class_name('drop-hw') - action_chains = ActionChains(browser) - action_chains.move_to_element(drop_hw) - action_chains.release(drop_hw).perform() - - time.sleep(0.5) - - selected_hw = browser.find_element_by_class_name('selected-hw') - form_inputs = selected_hw.find_elements_by_tag_name('input') - form_port = form_inputs[0] - if devices: - device = devices.pop() - form_port.clear() - form_port.send_keys(device) + if len(devices): + self._add_device(*devices.pop()) else: devices = None diff --git a/tools/harness-automation/autothreadharness/harness_controller.py b/tools/harness-automation/autothreadharness/harness_controller.py index 4fde3aad6..780e0a593 100644 --- a/tools/harness-automation/autothreadharness/harness_controller.py +++ b/tools/harness-automation/autothreadharness/harness_controller.py @@ -70,14 +70,17 @@ class HarnessController(object): env=env) time.sleep(2) + if settings.HARNESS_VERSION > 33: + return + 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 miniwebOut: - self.miniweb = subprocess.Popen([settings.HARNESS_HOME + '\\miniweb\\miniweb.exe'], + self.miniweb = subprocess.Popen([settings.HARNESS_HOME + '\\MiniWeb\\miniweb.exe'], stdout=miniwebOut, stderr=miniwebOut, - cwd=settings.HARNESS_HOME + '\\miniweb') + cwd=settings.HARNESS_HOME + '\\MiniWeb') def stop(self): logger.info('Stopping harness service') @@ -88,6 +91,9 @@ class HarnessController(object): else: logger.warning('Harness not started yet') + if settings.HARNESS_VERSION > 33: + return + if self.miniweb: self._try_kill(self.miniweb) self.miniweb = None diff --git a/tools/harness-automation/autothreadharness/settings_sample.py b/tools/harness-automation/autothreadharness/settings_sample.py index 0c3ecb6c1..645897782 100644 --- a/tools/harness-automation/autothreadharness/settings_sample.py +++ b/tools/harness-automation/autothreadharness/settings_sample.py @@ -31,8 +31,9 @@ AUTO_DUT = False """bool: Whether use the auto DUT feature of thread harness.""" -DUT_DEVICE = 'COM16' -"""str: Serial port of the DUT, must be set if AUTO_DUT=False.""" +DUT_DEVICE = ('COM16', 'OpenThread') +"""(str,str): The first element is serial port of the DUT, and the second is +the device type. This must be set if AUTO_DUT=False.""" DUT_VERSION = 'g12345' """str: Version of DUT, must be set if AUTO_DUT=False.""" @@ -79,19 +80,10 @@ TESTER_NAME = 'Thread Open' TESTER_REMARKS = 'OpenThread is great' """str: Any comments in the final PDF""" -SER2NET_HOSTNAME = '192.168.1.1' -"""str: ser2net hostname, used by items in `GOLDEN_DEVICES` with prefix `NET`.""" - -SER2NET_PORTBASE = 9000 -"""str: ser2net port base, `NET1` will be mapped to `SER2NET_PORTBASE + 1`.""" - -GOLDEN_DEVICE_TYPE = 'OpenThread' -"""str: Golden device type. Possible values are: `OpenThread`, `ARM`, `SiLabs` and `Freescale`.""" - GOLDEN_DEVICES = [] -"""[str]: Golden devices list. +"""[(str, str)]: devices list. -It should be something like ['COM1', 'COM2'] on Windows and can be found on Windows Device Manager.""" +It should be something like [('COM1', 'OpenThread'), ('COM2', 'ARM')] on Windows and can be found on Windows Device Manager.""" OUTPUT_PATH = '.\\output' """str: Path to store results and logs, MUST be writable.""" diff --git a/tools/harness-automation/cases/router_5_2_7.py b/tools/harness-automation/cases/router_5_2_7.py deleted file mode 100644 index 38e00f1a5..000000000 --- a/tools/harness-automation/cases/router_5_2_7.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (c) 2016, The OpenThread Authors. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the copyright holder nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - - -import unittest - -from autothreadharness.harness_case import HarnessCase - -class Router_5_2_7(HarnessCase): - role = HarnessCase.ROLE_ROUTER - case = '5 2 7' - golden_devices_required = 16 - def on_dialog(self, dialog, title): - pass - -if __name__ == '__main__': - unittest.main() diff --git a/tools/harness-thci/deviceInputFields.xml b/tools/harness-thci/deviceInputFields.xml index 80ec8f8cc..098922ca4 100644 --- a/tools/harness-thci/deviceInputFields.xml +++ b/tools/harness-thci/deviceInputFields.xml @@ -13,7 +13,7 @@ hint="eg: 115200">115200 - +