From ba813c2ac3a976f429b0571c60569d8e0b226fac Mon Sep 17 00:00:00 2001 From: Buke Po Date: Thu, 11 Aug 2016 01:02:42 +0800 Subject: [PATCH] create harness automation (#355) --- configure.ac | 1 + tools/Makefile.am | 1 + tools/harness-automation/Makefile.am | 41 + tools/harness-automation/README.rst | 64 ++ .../autothreadharness/__init__.py | 31 + .../autothreadharness/apc_pdu_controller.py | 122 +++ .../autothreadharness/harness_case.py | 713 ++++++++++++++++++ .../autothreadharness/harness_controller.py | 107 +++ .../autothreadharness/helpers.py | 58 ++ .../open_thread_controller.py | 220 ++++++ .../autothreadharness/runner.py | 277 +++++++ .../autothreadharness/settings_sample.py | 86 +++ tools/harness-automation/cases/__init__.py | 30 + tools/harness-automation/cases/ed_6_1_1.py | 43 ++ tools/harness-automation/cases/ed_6_1_2.py | 43 ++ tools/harness-automation/cases/ed_6_1_3.py | 43 ++ tools/harness-automation/cases/ed_6_1_4.py | 43 ++ tools/harness-automation/cases/ed_6_1_5.py | 43 ++ tools/harness-automation/cases/ed_6_1_6.py | 43 ++ tools/harness-automation/cases/ed_6_1_7.py | 43 ++ tools/harness-automation/cases/ed_6_2_1.py | 43 ++ tools/harness-automation/cases/ed_6_2_2.py | 43 ++ tools/harness-automation/cases/ed_6_3_1.py | 43 ++ tools/harness-automation/cases/ed_6_3_2.py | 43 ++ tools/harness-automation/cases/ed_6_4_1.py | 43 ++ tools/harness-automation/cases/ed_6_4_2.py | 43 ++ tools/harness-automation/cases/ed_6_5_1.py | 48 ++ tools/harness-automation/cases/ed_6_5_2.py | 52 ++ tools/harness-automation/cases/ed_6_5_3.py | 50 ++ tools/harness-automation/cases/ed_6_6_1.py | 43 ++ tools/harness-automation/cases/ed_6_6_2.py | 43 ++ .../harness-automation/cases/leader_5_1_1.py | 43 ++ .../harness-automation/cases/leader_5_1_13.py | 48 ++ .../harness-automation/cases/leader_5_1_5.py | 42 ++ .../harness-automation/cases/leader_5_2_2.py | 43 ++ .../harness-automation/cases/leader_5_2_3.py | 43 ++ .../harness-automation/cases/leader_5_3_6.py | 42 ++ .../harness-automation/cases/leader_5_3_7.py | 43 ++ .../harness-automation/cases/leader_5_3_8.py | 43 ++ .../harness-automation/cases/leader_5_5_1.py | 55 ++ .../harness-automation/cases/leader_5_5_2.py | 48 ++ .../harness-automation/cases/leader_5_5_3.py | 50 ++ .../harness-automation/cases/leader_5_5_4.py | 50 ++ .../harness-automation/cases/leader_5_5_7.py | 50 ++ .../harness-automation/cases/leader_5_6_2.py | 42 ++ .../harness-automation/cases/leader_5_6_4.py | 43 ++ .../harness-automation/cases/leader_5_6_5.py | 43 ++ .../harness-automation/cases/leader_5_6_6.py | 43 ++ .../harness-automation/cases/leader_5_6_8.py | 43 ++ .../harness-automation/cases/leader_5_7_1.py | 43 ++ .../harness-automation/cases/leader_5_8_1.py | 41 + .../harness-automation/cases/leader_7_1_1.py | 42 ++ .../harness-automation/cases/leader_7_1_3.py | 42 ++ tools/harness-automation/cases/reed_5_2_4.py | 43 ++ tools/harness-automation/cases/reed_5_2_5.py | 43 ++ tools/harness-automation/cases/reed_5_2_7.py | 43 ++ tools/harness-automation/cases/reed_5_5_5.py | 43 ++ tools/harness-automation/cases/reed_5_6_7.py | 43 ++ .../harness-automation/cases/router_5_1_1.py | 43 ++ .../harness-automation/cases/router_5_1_10.py | 44 ++ .../harness-automation/cases/router_5_1_11.py | 43 ++ .../harness-automation/cases/router_5_1_12.py | 43 ++ .../harness-automation/cases/router_5_1_13.py | 50 ++ .../harness-automation/cases/router_5_1_2.py | 43 ++ .../harness-automation/cases/router_5_1_3.py | 43 ++ .../harness-automation/cases/router_5_1_4.py | 43 ++ .../harness-automation/cases/router_5_1_6.py | 43 ++ .../harness-automation/cases/router_5_1_7.py | 47 ++ .../harness-automation/cases/router_5_1_8.py | 43 ++ .../harness-automation/cases/router_5_1_9.py | 43 ++ .../harness-automation/cases/router_5_2_1.py | 43 ++ .../harness-automation/cases/router_5_2_6.py | 43 ++ .../harness-automation/cases/router_5_2_7.py | 43 ++ .../harness-automation/cases/router_5_3_1.py | 41 + .../harness-automation/cases/router_5_3_10.py | 41 + .../harness-automation/cases/router_5_3_2.py | 41 + .../harness-automation/cases/router_5_3_3.py | 41 + .../harness-automation/cases/router_5_3_4.py | 41 + .../harness-automation/cases/router_5_3_5.py | 42 ++ .../harness-automation/cases/router_5_3_9.py | 41 + .../harness-automation/cases/router_5_5_1.py | 42 ++ .../harness-automation/cases/router_5_5_2.py | 42 ++ .../harness-automation/cases/router_5_5_3.py | 42 ++ .../harness-automation/cases/router_5_5_4.py | 42 ++ .../harness-automation/cases/router_5_5_7.py | 42 ++ .../harness-automation/cases/router_5_5_8.py | 43 ++ .../harness-automation/cases/router_5_6_1.py | 42 ++ .../harness-automation/cases/router_5_6_3.py | 42 ++ .../harness-automation/cases/router_5_6_9.py | 42 ++ .../harness-automation/cases/router_5_8_2.py | 41 + .../harness-automation/cases/router_5_8_3.py | 41 + .../harness-automation/cases/router_7_1_2.py | 43 ++ .../harness-automation/cases/router_7_1_4.py | 43 ++ .../harness-automation/cases/router_7_1_5.py | 43 ++ .../harness-automation/cases/router_7_1_6.py | 43 ++ .../harness-automation/cases/router_7_1_7.py | 43 ++ .../harness-automation/cases/router_7_1_8.py | 43 ++ tools/harness-automation/cases/sed_6_1_1.py | 43 ++ tools/harness-automation/cases/sed_6_1_2.py | 43 ++ tools/harness-automation/cases/sed_6_1_3.py | 43 ++ tools/harness-automation/cases/sed_6_1_4.py | 43 ++ tools/harness-automation/cases/sed_6_1_5.py | 43 ++ tools/harness-automation/cases/sed_6_1_6.py | 43 ++ tools/harness-automation/cases/sed_6_2_1.py | 43 ++ tools/harness-automation/cases/sed_6_2_2.py | 43 ++ tools/harness-automation/cases/sed_6_3_1.py | 43 ++ tools/harness-automation/cases/sed_6_3_2.py | 43 ++ tools/harness-automation/cases/sed_6_4_1.py | 43 ++ tools/harness-automation/cases/sed_6_4_2.py | 43 ++ tools/harness-automation/cases/sed_6_5_1.py | 49 ++ tools/harness-automation/cases/sed_6_5_2.py | 50 ++ tools/harness-automation/cases/sed_6_5_3.py | 50 ++ tools/harness-automation/cases/sed_6_6_1.py | 43 ++ tools/harness-automation/cases/sed_6_6_2.py | 43 ++ tools/harness-automation/doc/components.gv | 18 + tools/harness-automation/doc/components.png | Bin 0 -> 45216 bytes tools/harness-automation/doc/conf.py | 368 +++++++++ tools/harness-automation/doc/index.rst | 25 + tools/harness-automation/doc/quickstart.rst | 91 +++ tools/harness-automation/requirements.txt | 4 + tools/harness-automation/start.bat | 2 + tools/harness-automation/start.sh | 2 + 122 files changed, 6668 insertions(+) create mode 100644 tools/harness-automation/Makefile.am create mode 100644 tools/harness-automation/README.rst create mode 100644 tools/harness-automation/autothreadharness/__init__.py create mode 100644 tools/harness-automation/autothreadharness/apc_pdu_controller.py create mode 100644 tools/harness-automation/autothreadharness/harness_case.py create mode 100644 tools/harness-automation/autothreadharness/harness_controller.py create mode 100644 tools/harness-automation/autothreadharness/helpers.py create mode 100644 tools/harness-automation/autothreadharness/open_thread_controller.py create mode 100644 tools/harness-automation/autothreadharness/runner.py create mode 100644 tools/harness-automation/autothreadharness/settings_sample.py create mode 100644 tools/harness-automation/cases/__init__.py create mode 100644 tools/harness-automation/cases/ed_6_1_1.py create mode 100644 tools/harness-automation/cases/ed_6_1_2.py create mode 100644 tools/harness-automation/cases/ed_6_1_3.py create mode 100644 tools/harness-automation/cases/ed_6_1_4.py create mode 100644 tools/harness-automation/cases/ed_6_1_5.py create mode 100644 tools/harness-automation/cases/ed_6_1_6.py create mode 100644 tools/harness-automation/cases/ed_6_1_7.py create mode 100644 tools/harness-automation/cases/ed_6_2_1.py create mode 100644 tools/harness-automation/cases/ed_6_2_2.py create mode 100644 tools/harness-automation/cases/ed_6_3_1.py create mode 100644 tools/harness-automation/cases/ed_6_3_2.py create mode 100644 tools/harness-automation/cases/ed_6_4_1.py create mode 100644 tools/harness-automation/cases/ed_6_4_2.py create mode 100644 tools/harness-automation/cases/ed_6_5_1.py create mode 100644 tools/harness-automation/cases/ed_6_5_2.py create mode 100644 tools/harness-automation/cases/ed_6_5_3.py create mode 100644 tools/harness-automation/cases/ed_6_6_1.py create mode 100644 tools/harness-automation/cases/ed_6_6_2.py create mode 100644 tools/harness-automation/cases/leader_5_1_1.py create mode 100644 tools/harness-automation/cases/leader_5_1_13.py create mode 100644 tools/harness-automation/cases/leader_5_1_5.py create mode 100644 tools/harness-automation/cases/leader_5_2_2.py create mode 100644 tools/harness-automation/cases/leader_5_2_3.py create mode 100644 tools/harness-automation/cases/leader_5_3_6.py create mode 100644 tools/harness-automation/cases/leader_5_3_7.py create mode 100644 tools/harness-automation/cases/leader_5_3_8.py create mode 100644 tools/harness-automation/cases/leader_5_5_1.py create mode 100644 tools/harness-automation/cases/leader_5_5_2.py create mode 100644 tools/harness-automation/cases/leader_5_5_3.py create mode 100644 tools/harness-automation/cases/leader_5_5_4.py create mode 100644 tools/harness-automation/cases/leader_5_5_7.py create mode 100644 tools/harness-automation/cases/leader_5_6_2.py create mode 100644 tools/harness-automation/cases/leader_5_6_4.py create mode 100644 tools/harness-automation/cases/leader_5_6_5.py create mode 100644 tools/harness-automation/cases/leader_5_6_6.py create mode 100644 tools/harness-automation/cases/leader_5_6_8.py create mode 100644 tools/harness-automation/cases/leader_5_7_1.py create mode 100644 tools/harness-automation/cases/leader_5_8_1.py create mode 100644 tools/harness-automation/cases/leader_7_1_1.py create mode 100644 tools/harness-automation/cases/leader_7_1_3.py create mode 100644 tools/harness-automation/cases/reed_5_2_4.py create mode 100644 tools/harness-automation/cases/reed_5_2_5.py create mode 100644 tools/harness-automation/cases/reed_5_2_7.py create mode 100644 tools/harness-automation/cases/reed_5_5_5.py create mode 100644 tools/harness-automation/cases/reed_5_6_7.py create mode 100644 tools/harness-automation/cases/router_5_1_1.py create mode 100644 tools/harness-automation/cases/router_5_1_10.py create mode 100644 tools/harness-automation/cases/router_5_1_11.py create mode 100644 tools/harness-automation/cases/router_5_1_12.py create mode 100644 tools/harness-automation/cases/router_5_1_13.py create mode 100644 tools/harness-automation/cases/router_5_1_2.py create mode 100644 tools/harness-automation/cases/router_5_1_3.py create mode 100644 tools/harness-automation/cases/router_5_1_4.py create mode 100644 tools/harness-automation/cases/router_5_1_6.py create mode 100644 tools/harness-automation/cases/router_5_1_7.py create mode 100644 tools/harness-automation/cases/router_5_1_8.py create mode 100644 tools/harness-automation/cases/router_5_1_9.py create mode 100644 tools/harness-automation/cases/router_5_2_1.py create mode 100644 tools/harness-automation/cases/router_5_2_6.py create mode 100644 tools/harness-automation/cases/router_5_2_7.py create mode 100644 tools/harness-automation/cases/router_5_3_1.py create mode 100644 tools/harness-automation/cases/router_5_3_10.py create mode 100644 tools/harness-automation/cases/router_5_3_2.py create mode 100644 tools/harness-automation/cases/router_5_3_3.py create mode 100644 tools/harness-automation/cases/router_5_3_4.py create mode 100644 tools/harness-automation/cases/router_5_3_5.py create mode 100644 tools/harness-automation/cases/router_5_3_9.py create mode 100644 tools/harness-automation/cases/router_5_5_1.py create mode 100644 tools/harness-automation/cases/router_5_5_2.py create mode 100644 tools/harness-automation/cases/router_5_5_3.py create mode 100644 tools/harness-automation/cases/router_5_5_4.py create mode 100644 tools/harness-automation/cases/router_5_5_7.py create mode 100644 tools/harness-automation/cases/router_5_5_8.py create mode 100644 tools/harness-automation/cases/router_5_6_1.py create mode 100644 tools/harness-automation/cases/router_5_6_3.py create mode 100644 tools/harness-automation/cases/router_5_6_9.py create mode 100644 tools/harness-automation/cases/router_5_8_2.py create mode 100644 tools/harness-automation/cases/router_5_8_3.py create mode 100644 tools/harness-automation/cases/router_7_1_2.py create mode 100644 tools/harness-automation/cases/router_7_1_4.py create mode 100644 tools/harness-automation/cases/router_7_1_5.py create mode 100644 tools/harness-automation/cases/router_7_1_6.py create mode 100644 tools/harness-automation/cases/router_7_1_7.py create mode 100644 tools/harness-automation/cases/router_7_1_8.py create mode 100644 tools/harness-automation/cases/sed_6_1_1.py create mode 100644 tools/harness-automation/cases/sed_6_1_2.py create mode 100644 tools/harness-automation/cases/sed_6_1_3.py create mode 100644 tools/harness-automation/cases/sed_6_1_4.py create mode 100644 tools/harness-automation/cases/sed_6_1_5.py create mode 100644 tools/harness-automation/cases/sed_6_1_6.py create mode 100644 tools/harness-automation/cases/sed_6_2_1.py create mode 100644 tools/harness-automation/cases/sed_6_2_2.py create mode 100644 tools/harness-automation/cases/sed_6_3_1.py create mode 100644 tools/harness-automation/cases/sed_6_3_2.py create mode 100644 tools/harness-automation/cases/sed_6_4_1.py create mode 100644 tools/harness-automation/cases/sed_6_4_2.py create mode 100644 tools/harness-automation/cases/sed_6_5_1.py create mode 100644 tools/harness-automation/cases/sed_6_5_2.py create mode 100644 tools/harness-automation/cases/sed_6_5_3.py create mode 100644 tools/harness-automation/cases/sed_6_6_1.py create mode 100644 tools/harness-automation/cases/sed_6_6_2.py create mode 100644 tools/harness-automation/doc/components.gv create mode 100644 tools/harness-automation/doc/components.png create mode 100644 tools/harness-automation/doc/conf.py create mode 100644 tools/harness-automation/doc/index.rst create mode 100644 tools/harness-automation/doc/quickstart.rst create mode 100644 tools/harness-automation/requirements.txt create mode 100644 tools/harness-automation/start.bat create mode 100755 tools/harness-automation/start.sh diff --git a/configure.ac b/configure.ac index dec4bccc9..96589a05e 100644 --- a/configure.ac +++ b/configure.ac @@ -568,6 +568,7 @@ examples/platforms/Makefile examples/platforms/cc2538/Makefile examples/platforms/posix/Makefile tools/Makefile +tools/harness-automation/Makefile tools/spi-hdlc-adapter/Makefile tests/Makefile tests/scripts/Makefile diff --git a/tools/Makefile.am b/tools/Makefile.am index 1ec9adb6f..fabc789ed 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -31,6 +31,7 @@ include $(abs_top_nlbuild_autotools_dir)/automake/pre.am # Always package (e.g. for 'make dist') these subdirectories. DIST_SUBDIRS = \ + harness-automation \ spi-hdlc-adapter \ $(NULL) diff --git a/tools/harness-automation/Makefile.am b/tools/harness-automation/Makefile.am new file mode 100644 index 000000000..ee7094908 --- /dev/null +++ b/tools/harness-automation/Makefile.am @@ -0,0 +1,41 @@ +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + +include $(abs_top_nlbuild_autotools_dir)/automake/pre.am + +EXTRA_DIST = \ + autothreadharness \ + cases \ + doc \ + requirements.txt \ + README.rst \ + start.bat \ + start.sh \ + $(NULL) + +include $(abs_top_nlbuild_autotools_dir)/automake/post.am diff --git a/tools/harness-automation/README.rst b/tools/harness-automation/README.rst new file mode 100644 index 000000000..c365b860e --- /dev/null +++ b/tools/harness-automation/README.rst @@ -0,0 +1,64 @@ +======================= +Harness Automation Tool +======================= + +This is a tool to automate testing openthread with GRL Thread-Test-Harness1.1-Alpha v1.0-Release_13.0. + +----------- +Quick Start +----------- + +Follow the `Quick Start `_ + +------ +Syntax +------ + +:: + + ./start.sh [-h] [--pattern PATTERN] [--delete-blacklist] [--skip SKIP] + [--dry-run] [--result-file RESULT_FILE] + [--list-file LIST_FILE] [--continue-from CONTINUE_FROM] + [--auto-reboot] [--manual-reset] [--list-devices] + [NAME [NAME ...]] + +------- +Options +------- + +If ``-l`` is given, ``NAME`` is the serial port device name. Otherwise ``NAME`` is test case name. This enables running single or multiple test cases directly. + +Other options:: + + -h, --help + Show help message and exit. + + --pattern PATTERN, -p PATTERN + File name pattern, Default to all python files. + + --delete-blacklist, -d + Clear blacklist on startup. By default, golden devices failed to be connected are kept in a blacklist automatically. Add this option to clear blacklist on startup. + + --skip SKIP, -k SKIP + Type of test case status to skip. ``e`` for error, ``f`` for fail, ``p`` for pass. Default to "efp". If test case names are given by ``NAME``, this option will not work. + + --dry-run, -n + Just show what test case will be run. + + --result-file RESULT_FILE, -o RESULT_FILE + File to store and read current status. + + --list-file LIST_FILE, -i LIST_FILE + File to list cases names to test. + + --continue-from CONTINUE_FROM, -c CONTINUE_FROM + First case to test. + + --auto-reboot, -a + Restart system when harness cannot recover. This is a walk around to some issues, such as golden devices may not work after long time running and have to restart system. + + --manual-reset, -m + Reset devices manually, in case no PDU available so that reset golden devices have to be done manually. + + --list-devices, -l + List devices, including their version information. diff --git a/tools/harness-automation/autothreadharness/__init__.py b/tools/harness-automation/autothreadharness/__init__.py new file mode 100644 index 000000000..fb2815d2e --- /dev/null +++ b/tools/harness-automation/autothreadharness/__init__.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + + diff --git a/tools/harness-automation/autothreadharness/apc_pdu_controller.py b/tools/harness-automation/autothreadharness/apc_pdu_controller.py new file mode 100644 index 000000000..6f6a2356a --- /dev/null +++ b/tools/harness-automation/autothreadharness/apc_pdu_controller.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 logging +import telnetlib +import time +import re + +logger = logging.getLogger(__name__) + +class ApcPduController(object): + def __init__(self, ip, port=23): + """Create APC PDU controller + + Args: + ip (str), ip address or hostname + port (int), port number + """ + self.port = port + self.ip = ip + self.tn = None + self._init() + + def __del__(self): + self.close() + + def _init(self): + """Initialize the telnet connection + """ + self.tn = telnetlib.Telnet(self.ip, self.port) + self.tn.read_until('User Name') + self.tn.write('apc\r\n') + self.tn.read_until('Password') + self.tn.write('apc\r\n') + self.until_done() + + def close(self): + """Close telnet connection""" + logger.info('closing telnet') + if self.tn: + self.tn.close() + + def until_done(self): + """Wait until the prompt encountered + """ + self.until(r'^>') + + def until(self, regex): + """Wait until the regex encountered + """ + logger.debug('waiting for %s', regex) + r = re.compile(regex, re.M) + self.tn.expect([r]) + + def reboot(self, outlet=1): + """Reboot outlet + """ + # main menu + self.tn.write('\x1b\r\n') + self.until_done() + # Device Manager + self.tn.write('1\r\n') + self.until_done() + # Outlet Management + self.tn.write('2\r\n') + self.until_done() + # Outlet Control + self.tn.write('1\r\n') + self.until_done() + # Select outlet + self.tn.write('%d\r\n' % outlet) + self.until_done() + # Control + self.tn.write('1\r\n') + self.until_done() + # off + self.tn.write('2\r\n') + self.until('to cancel') + self.tn.write('YES\r\n') + self.until('to continue') + self.tn.write('\r\n') + self.until_done() + + time.sleep(5) + # on + self.tn.write('1\r\n') + self.until('to cancel') + self.tn.write('YES\r\n') + self.until('to continue') + self.tn.write('\r\n') + self.until_done() + +if __name__ == '__main__': + apc = ApcPduController('192.168.1.88') + apc.reboot() diff --git a/tools/harness-automation/autothreadharness/harness_case.py b/tools/harness-automation/autothreadharness/harness_case.py new file mode 100644 index 000000000..a0dc0a9b7 --- /dev/null +++ b/tools/harness-automation/autothreadharness/harness_case.py @@ -0,0 +1,713 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from selenium import webdriver +from selenium.webdriver import ActionChains +from selenium.webdriver.support.ui import Select +from selenium.common.exceptions import UnexpectedAlertPresentException + +import json +import logging +import os +import re +import time +import unittest + +from autothreadharness import settings +from autothreadharness.apc_pdu_controller import ApcPduController +from autothreadharness.harness_controller import HarnessController +from autothreadharness.helpers import HistoryHelper +from autothreadharness.open_thread_controller import OpenThreadController + +logger = logging.getLogger(__name__) + +THREAD_CHANNEL_MAX = 26 +"""Maximum channel number of thread protocol""" + +THREAD_CHANNEL_MIN = 11 +"""Minimum channel number of thread protocol""" + +class HarnessCase(unittest.TestCase): + """This is the case class of all automation test cases. + + All test case classes MUST define properties `suite`, `case` and `golden_devices_needed` + """ + + channel = settings.THREAD_CHANNEL + """int: Thread channel. + + Thread channel ranges from 11 to 26. + """ + suite = None + """int: Suite id. + + 1 + Leader + 2 + Router + 4 + Sleepy end device + 16 + Router eligible end device + 32 + End device + + """ + + case = None + """str: Case id, e.g. '6 5 1'. + """ + + golden_devices_needed = 0 + """int: Golden devices needed to finish the test + """ + + child_timeout = settings.THREAD_CHILD_TIMEOUT + """int: Child timeout in seconds + """ + + manual_reset = False + """bool: whether reset manually""" + + def wait_until(self, what, times=-1): + """Wait until `what` return True + + Args: + what (Callable[bool]): Call `wait()` again and again until it returns True + times (int): Maximum times of trials before giving up + + Returns: + True if success, False if times threshold reached + + """ + while times: + try: + if what() is True: + return True + except: + logger.exception('Wait failed') + else: + logger.warning('Trial[%d] failed', times) + times -= 1 + time.sleep(1) + + return False + + def __init__(self, *args, **kwargs): + self.dut = None + self._browser = None + self._hc = None + self.result_dir = '%s\\%s' % (settings.OUTPUT_PATH, self.__class__.__name__) + # create directory + if self.__class__ is not HarnessCase: + os.system('mkdir %s' % self.result_dir) + + super(HarnessCase, self).__init__(*args, **kwargs) + + def _init_devices(self): + """Reboot all usb devices. + + Note: + If APC_HOST is not valid, usb devices is not rebooted. + """ + if self.manual_reset: + raw_input('Reset golden devices and press enter to continue..') + return + elif not settings.APC_HOST: + return + + tries = 3 + while True: + try: + apc = ApcPduController(settings.APC_HOST) + except EOFError: + logger.warning('Failed to connect to telnet') + tries = tries - 1 + if tries: + time.sleep(10) + continue + else: + logger.error('Fatal error: cannot connect to apc') + raise + else: + apc.reboot(settings.APC_OUTLET) + apc.close() + break + + time.sleep(20) + + def _init_harness(self): + """Restart harness backend service. + + Please start the harness controller before running the cases, otherwise, nothing happens + """ + self._hc = HarnessController(self.result_dir) + self._hc.stop() + time.sleep(1) + self._hc.start() + time.sleep(2) + + def _destroy_harness(self): + """Stop harness backend service + + Stop harness service. + """ + self._hc.stop() + time.sleep(2) + + def _init_dut(self): + """Initialize the DUT. + + DUT will be restarted. and openthread will started. + """ + dut_port = settings.DUT_DEVICE + dut = OpenThreadController(dut_port) + self.dut = dut + + if not settings.APC_HOST or self.manual_reset: + self.dut.reset() + + def _destroy_dut(self): + self.dut = None + + def _init_browser(self): + """Open harness web page. + + Open a quiet chrome which: + 1. disables extensions, + 2. ignore certificate errors and + 3. always allow notifications. + """ + chrome_options = webdriver.ChromeOptions() + chrome_options.add_argument('--disable-extensions') + chrome_options.add_argument('--ignore-certificate-errors') + 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(10) + browser.implicitly_wait(1) + browser.maximize_window() + browser.get(settings.HARNESS_URL) + self._browser = browser + self.assertIn('Thread', browser.title) + + def _destroy_browser(self): + """Close the browser. + """ + self._browser.close() + self._browser = None + + def setUp(self): + """Prepare to run test case. + + Start harness service, init golden devices, reset DUT and open browser. + """ + if self.__class__ is HarnessCase: + return + + logger.info('Setting up') + # clear files + logger.info('Deleting all .pdf') + os.system('del /q "%HOMEDRIVE%%HOMEPATH%\\Downloads\\NewPdf_*.pdf"') + logger.info('Deleting all .xlsx') + os.system('del /q "%HOMEDRIVE%%HOMEPATH%\\Downloads\\ExcelReport*.xlsx"') + logger.info('Deleting all .pcapng') + os.system('del /q "%s\\Captures\\*.pcapng"' % settings.HARNESS_HOME) + + # using temp files to fix excel downloading fail + logger.info('Empty files in temps') + os.system('del /q "%s\\Thread_Harness\\temp\\*.*"' % settings.HARNESS_HOME) + + self._init_harness() + self._init_devices() + self._init_dut() + + def tearDown(self): + """Clean up after each case. + + Stop harness service, close browser and close DUT. + """ + if self.__class__ is HarnessCase: + return + + logger.info('Tearing down') + self._destroy_harness() + self._destroy_browser() + self._destroy_dut() + + def _setup_page(self): + """Do sniffer settings and general settings + """ + # Detect Sniffer + try: + dialog = self._browser.find_element_by_id('capture-Setup-modal') + except: + logger.exception('Failed to get dialog.') + else: + if dialog and dialog.get_attribute('aria-hidden') == 'false': + times = 100 # FIXME better to be a more meaningful value + while times: + 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.click() + elif 'Verified' in status: + logger.info('Verified!') + button = dialog.find_element_by_id('saveCaptureSettings') + button.click() + break + else: + logger.warning('Unexpected sniffer verification status') + + times = times - 1 + time.sleep(1) + + if not times: + raise Exception('Unable to detect sniffer device') + + time.sleep(1) + + try: + next_button = self._browser.find_element_by_id('nextButton') + except: + logger.exception('Failed to finish setup') + return + + if not next_button.is_enabled(): + logger.info('Harness is still not ready') + return + + # General Setup + try: + button = self._browser.find_element_by_id('general-Setup') + button.click() + time.sleep(2) + + dialog = self._browser.find_element_by_id('general-Setup-modal') + 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.clear() + field.send_keys(str(self.child_timeout)) + + field = dialog.find_element_by_id('inp_general_sed_polling_rate') + field.clear() + field.send_keys(str(settings.THREAD_SED_POLLING_INTERVAL)) + + button = dialog.find_element_by_id('saveGeneralSettings') + button.click() + time.sleep(1) + + except: + logger.exception('Failed to do general setup') + return + + # Finish this page + next_button.click() + time.sleep(1) + + def _connect_devices(self): + connect_all = self._browser.find_element_by_link_text('Connect All') + connect_all.click() + + def _test_bed(self): + """Set up the test bed. + + Connect number of golden devices required by each case. + """ + browser = self._browser + test_bed = browser.find_element_by_id('test-bed') + time.sleep(3) + history = HistoryHelper() + selected_hw_set = test_bed.find_elements_by_class_name('selected-hw') + 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.click() + selected_hw_num = selected_hw_num - 1 + + devices = filter(lambda port: not history.is_bad_golden_device(port), + settings.GOLDEN_DEVICES) + logger.info('Available golden devices: %s', json.dumps(devices, indent=2)) + if len(devices) < self.golden_devices_required: + raise Exception('Golden devices is not enough') + golden_devices_required = self.golden_devices_required + while golden_devices_required: + golden_device = browser.find_element_by_id(settings.GOLDEN_DEVICE_TYPE) + # drag + action_chains = ActionChains(browser) + action_chains.click_and_hold(golden_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) + 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) + + while True: + try: + self._connect_devices() + elem = browser.find_element_by_id('nextBtn') + if not self.wait_until(lambda: 'disabled' not in elem.get_attribute('class'), + times=60): + for selected_hw in selected_hw_set: + form_inputs = selected_hw.find_elements_by_tag_name('input') + form_port = form_inputs[0] + if form_port.is_enabled(): + port = form_port.get_attribute('value').encode('utf8') + history.mark_bad_golden_device(port) + if devices: + device = devices.pop() + form_port.clear() + form_port.send_keys(device) + else: + devices = None + + if devices is None: + logger.warning('Golden devices not enough') + raise SystemExit() + else: + logger.info('Try again with new golden devices') + continue + + elem.click() + except SystemExit: + raise + except: + logger.exception('Unexpected error') + else: + break + + def _select_case(self, suite, case): + """Select the test case. + """ + # select the case + elem = Select(self._browser.find_element_by_id('select-dut')) + elem.select_by_value(str(suite)) + time.sleep(1) + + checkbox = None + elems = self._browser.find_elements_by_css_selector('.tree-node .tree-title') + for elem in elems: + action_chains = ActionChains(self._browser) + action_chains.move_to_element(elem) + action_chains.perform() + logger.debug(elem.text) + if elem.text.startswith(case): + parent = elem.find_element_by_xpath('..') + checkbox = parent.find_element_by_class_name('tree-checkbox') + break + + if not checkbox: + time.sleep(5) + raise Exception('Failed to find the case') + + checkbox.click() + time.sleep(1) + + elem = self._browser.find_element_by_id('runTest') + elem.click() + if not self.wait_until(lambda: self._browser.find_element_by_id('stopTest') and True, 10): + raise Exception('Failed to start test case') + + def _collect_result(self): + """Collect test result. + + Generate PDF, excel and pcap file + """ + # generate pdf + self._browser.find_element_by_class_name('save-pdf').click() + time.sleep(1) + try: + dialog = self._browser.find_element_by_id('Testinfo') + except: + logger.exception('Failed to get test info dialog.') + else: + if dialog.get_attribute('aria-hidden') != 'false': + raise Exception('Test information dialog not ready') + + dialog.find_element_by_id('inp_dut_manufacturer').send_keys(settings.DUT_MANUFACTURER) + dialog.find_element_by_id('inp_dut_firmware_version').send_keys(self.dut.version) + dialog.find_element_by_id('inp_tester_name').send_keys(settings.TESTER_NAME) + dialog.find_element_by_id('inp_remarks').send_keys(settings.TESTER_REMARKS) + dialog.find_element_by_id('generatePdf').click() + + time.sleep(1) + main_window = self._browser.current_window_handle + + # generate excel + self._browser.find_element_by_class_name('save-excel').click() + time.sleep(1) + for wh in self._browser.window_handles: + if wh != main_window: + self._browser.switch_to.window(wh) + self._browser.close() + self._browser.switch_to.window(main_window) + + # save pcap + self._browser.find_element_by_class_name('save-wireshark').click() + time.sleep(1) + for wh in self._browser.window_handles: + if wh != main_window: + self._browser.switch_to.window(wh) + self._browser.close() + self._browser.switch_to.window(main_window) + + timestamp = time.strftime('%Y%m%d%H%M%S') + os.system('move "%%HOMEPATH%%\\Downloads\\NewPdf_*.pdf" %s\\%s-%s.pdf' + % (self.result_dir, self.__class__.__name__, timestamp)) + os.system('move "%%HOMEPATH%%\\Downloads\\ExcelReport*.xlsx" %s\\%s-%s.xlsx' + % (self.result_dir, self.__class__.__name__, timestamp)) + os.system('move "%s\\Captures\\*.pcapng" %s\\%s-%s.pcapng' + % (settings.HARNESS_HOME, self.result_dir, self.__class__.__name__, timestamp)) + os.system('copy "%s\\Thread_Harness\\temp\\*.*" "%s"' + % (settings.HARNESS_HOME, self.result_dir)) + + def _wait_dialog(self): + """Wait for dialogs and handle them until done. + """ + logger.debug('waiting for dialog') + done = False + error = False + while not done: + try: + dialog = self._browser.find_element_by_id('RemoteConfirm') + except: + 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 + time.sleep(1) + logger.info('Handling dialog[%s]', title) + + try: + done = self._handle_dialog(dialog, title) + except: + logger.exception('Error handling dialog: %s' % title) + error = True + + if done is None: + raise Exception('Unexpected dialog occurred') + + dialog.find_element_by_id('ConfirmOk').click() + + time.sleep(1) + + try: + stop_button = self._browser.find_element_by_id('stopTest') + if done: + stop_button.click() + # wait for stop procedure end + time.sleep(10) + except: + logger.exception('Test stopped') + time.sleep(5) + done = True + + time.sleep(5) + + if error: + raise Exception('Fail for previous exceptions') + + def _handle_dialog(self, dialog, title): + """Handle a dialog. + + Returns: + bool True if no more dialogs expected, + False if more dialogs needed, and + None if not handled + """ + done = self.on_dialog(dialog, title) + if isinstance(done, bool): + return done + + if title.startswith('Start DUT'): + body = dialog.find_element_by_id('cnfrmMsg').text + if 'Sleepy End Device' in body: + self.dut.mode = 's' + self.dut.child_timeout = self.child_timeout + elif 'End Device' in body: + self.dut.mode = 'rsn' + self.dut.child_timeout = self.child_timeout + else: + self.dut.mode = 'rsdn' + + if 'at channel' in body: + self.channel = int(body.split(':')[1]) + + self.dut.channel = self.channel + self.dut.panid = settings.THREAD_PANID + self.dut.networkname = settings.THREAD_NETWORKNAME + self.dut.extpanid = settings.THREAD_EXTPANID + self.dut.start() + + 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() + inp.send_keys('0x%s' % mac) + + elif title.startswith('LL64 Address'): + 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): + ll64 = addr + break + + if not ll64: + raise Exception('No link local address found') + + logger.info('Link local address is %s', ll64) + inp = dialog.find_element_by_id('cnfrmInpText') + inp.clear() + inp.send_keys(ll64) + + elif title.startswith('Enter Channel'): + self.dut.channel = self.channel + inp = dialog.find_element_by_id('cnfrmInpText') + inp.clear() + inp.send_keys(str(self.dut.channel)) + + elif title.startswith('User Action Needed'): + body = dialog.find_element_by_id('cnfrmMsg').text + if body.startswith('Power Down the DUT'): + self.dut.stop() + return True + + elif title.startswith('Short Address'): + short_addr = '0x%s' % self.dut.short_addr + inp = dialog.find_element_by_id('cnfrmInpText') + inp.clear() + inp.send_keys(short_addr) + + 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): + ml64 = addr + break + + if not ml64: + raise Exception('No mesh local address found') + + logger.info('Mesh local address is %s', ml64) + inp = dialog.find_element_by_id('cnfrmInpText') + inp.clear() + inp.send_keys(ml64) + + elif title.startswith('Sheild DUT'): + # FIXME should find better way to simulate + self.dut.channel = (self.channel == THREAD_CHANNEL_MAX + and THREAD_CHANNEL_MIN) or (self.channel + 1) + + elif title.startswith('Bring DUT Back to network'): + self.dut.channel = self.channel + + elif title.startswith('Configure Prefix on DUT'): + 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, + map(lambda it: it.split('='), body.split(', ')), {}) + prefix = params['P_Prefix'].strip('\0\r\n\t ') + flags = [] + if params.get('P_slaac_preferred', 0) == '1': + flags.append('p') + flags.append('ao') + if params.get('P_stable', 0) == '1': + flags.append('s') + if params.get('P_default', 0) == '1': + flags.append('r') + prf = 'high' + self.dut.add_prefix(prefix, ''.join(flags), prf) + + return False + + def test(self): + """This method will only start test case in child class""" + if self.__class__ is HarnessCase: + logger.warning('Skip this harness itself') + return + + logger.info('Testing suite[%d] case[%s]', self.suite, self.case) + try: + self._init_browser() + # prepare test case + while True: + url = self._browser.current_url + if url.endswith('SetupPage.html'): + self._setup_page() + elif url.endswith('TestBed.html'): + self._test_bed() + elif url.endswith('TestExecution.html'): + logger.info('Ready to handle dialogs') + break + time.sleep(2) + except UnexpectedAlertPresentException: + logger.exception('Failed to connect to harness server') + raise SystemExit() + + self._select_case(self.suite, self.case) + + self._wait_dialog() + + try: + self._collect_result() + except: + logger.exception('Failed to collect results') + raise + + # get case result + status = self._browser.find_element_by_class_name('title-test').text + logger.info(status) + success = 'Fail' not in status + self.assertTrue(success) diff --git a/tools/harness-automation/autothreadharness/harness_controller.py b/tools/harness-automation/autothreadharness/harness_controller.py new file mode 100644 index 000000000..055b320f3 --- /dev/null +++ b/tools/harness-automation/autothreadharness/harness_controller.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 logging +import os +import subprocess +import time + +from autothreadharness import settings + +logger = logging.getLogger(__name__) + +class HarnessController(object): + """Harness service control + + This controls harness service, including the harness back-end and front-end. + """ + harness = None + """harness back-end""" + + miniweb = None + """harness front-end""" + + def __init__(self, result_dir=None): + self.result_dir = result_dir + + def start(self): + logger.info('Starting harness service') + if self.harness: + logger.warning('Harness already started') + else: + env = dict(os.environ, PYTHONPATH='%s\\Thread_Harness;%s\\ThirdParty\\hsdk-python\\src' + % (settings.HARNESS_HOME, settings.HARNESS_HOME)) + with open('%s\\harness-%s.log' % (self.result_dir, time.strftime('%Y%m%d%H%M%S')), 'w') as fout: + self.harness = subprocess.Popen([settings.HARNESS_HOME + '\\Python27\\python.exe', + settings.HARNESS_HOME + '\\Thread_Harness\\Run.py'], + cwd=settings.HARNESS_HOME, + stdout=fout, + stderr=fout, + env=env) + + if self.miniweb: + logger.warning('Miniweb already started') + else: + self.miniweb = subprocess.Popen([settings.HARNESS_HOME + '\\miniweb\\miniweb.exe'], + cwd=settings.HARNESS_HOME + '\\miniweb') + + def stop(self): + logger.info('Stopping harness service') + + if self.harness: + self._try_kill(self.harness) + self.harness = None + else: + logger.warning('Harness not started yet') + + if self.miniweb: + self._try_kill(self.miniweb) + self.miniweb = None + else: + logger.warning('Miniweb not started yet') + + def _try_kill(self, proc): + logger.info('Try kill process') + times = 3 + proc.kill() + while proc.poll() is None: + logger.info('Trial %d failed', times) + if times == 0: + raise SystemExit() + else: + times = times - 1 + time.sleep(5) + proc.kill() + + def __del__(self): + self.stop() + +if __name__ == '__main__': + hc = HarnessController() diff --git a/tools/harness-automation/autothreadharness/helpers.py b/tools/harness-automation/autothreadharness/helpers.py new file mode 100644 index 000000000..181dbb316 --- /dev/null +++ b/tools/harness-automation/autothreadharness/helpers.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 json +import logging + + +class HistoryHelper(object): + logger = logging.getLogger(__name__) + + def __init__(self, filename='./history.json'): + self.filename = filename + try: + self.data = json.load(open(filename, 'r')) + except Exception: + self.logger.exception('file may not exists') + self.data = { + 'golden_device_black_list': [] + } + self.save() + + def save(self): + json.dump(self.data, open(self.filename, 'w'), indent=2) + + def mark_bad_golden_device(self, port): + self.logger.warning('mark serial port[%s] as bad', port) + self.data['golden_device_black_list'].append(port) + self.save() + + def is_bad_golden_device(self, port): + return port in self.data['golden_device_black_list'] diff --git a/tools/harness-automation/autothreadharness/open_thread_controller.py b/tools/harness-automation/autothreadharness/open_thread_controller.py new file mode 100644 index 000000000..85966d246 --- /dev/null +++ b/tools/harness-automation/autothreadharness/open_thread_controller.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 logging +import time + +import serial + +from pexpect_serial import SerialSpawn + +__all__ = ['OpenThreadController'] +logger = logging.getLogger(__name__) + +class OpenThreadController(object): + """This is an simple wrapper to communicate with openthread""" + def __init__(self, port): + """Initialize the controller + + Args: + port (str): serial port's path or name(windows) + """ + self.port = port + self.ss = None + self._init() + + def _init(self): + ser = serial.Serial(self.port, 115200, timeout=2) + self.ss = SerialSpawn(ser, timeout=2) + + def __del__(self): + if self.ss: + self.ss.close() + + def is_started(self): + """check if openthread is started + + Returns: + bool: started or not + """ + state = self._req('state')[0] + return state != 'disabled' + + def start(self): + """Start openthread + """ + self._req('ifconfig up') + self._req('thread start') + + def stop(self): + """Stop openthread + """ + self._req('thread stop') + self._req('ifconfig down') + + def reset(self): + """Reset openthread device, not equivalent to stop and start + """ + self.ss.sendline('reset') + time.sleep(1) + self.ss.close() + time.sleep(1) + self._init() + + def _req(self, req): + """Send command and wait for response. + + The command will be repeated 3 times at most in case data loss of serial port. + + Args: + req (str): Command to send, please do not include new line in the end. + + Returns: + [str]: The output lines + """ + logger.info('DUT> %s', req) + times = 3 + + while times: + times = times - 1 + try: + self.ss.sendline(req) + self.ss.expect(req + self.ss.linesep) + except: + logger.exception('Failed to send command') + else: + break + + line = None + res = [] + + while True: + line = self.ss.readline().strip('\0\r\n\t ') + logger.debug(line) + + if line: + if line == 'Done': + break + res.append(line) + + return res + + @property + def networkname(self): + """str: Thread network name.""" + return self._req('networkname')[0] + + @networkname.setter + def networkname(self, value): + self._req('networkname %s' % value) + + @property + def mode(self): + """str: Thread mode.""" + return self._req('mode')[0] + + @mode.setter + def mode(self, value): + self._req('mode %s' % value) + + @property + def mac(self): + """str: MAC address of the device""" + return self._req('extaddr')[0] + + @property + def addrs(self): + """[str]: IP addresses of the devices""" + return self._req('ipaddr') + + @property + def short_addr(self): + """str: Short address""" + return self._req('rloc16')[0] + + @property + def channel(self): + """int: Channel number of openthread""" + return int(self._req('channel')[0]) + + @channel.setter + def channel(self, value): + self._req('channel %d' % value) + + @property + def panid(self): + """str: Thread panid""" + return self._req('panid')[0] + + @panid.setter + def panid(self, value): + self._req('panid %s' % value) + + @property + def extpanid(self): + """str: Thread extpanid""" + return self._req('extpanid')[0] + + @extpanid.setter + def extpanid(self, value): + self._req('extpanid %s' % value) + + @property + def child_timeout(self): + """str: Thread child timeout in seconds""" + return self._req('childtimeout')[0] + + @child_timeout.setter + def child_timeout(self, value): + self._req('childtimeout %d' % value) + + @property + def version(self): + """str: Open thread version""" + return self._req('version')[0] + + def add_prefix(self, prefix, flags, prf): + """Add network prefix. + + Args: + prefix (str): network prefix. + flags (str): network prefix flags, please refer thread documentation for details + prf (str): network prf, please refer thread documentation for details + """ + self._req('prefix add %s %s %s' % (prefix, flags, prf)) + time.sleep(1) + self._req('netdataregister') + + def remove_prefix(self, prefix): + """Remove network prefix. + """ + self._req('prefix remove %s' % prefix) + time.sleep(1) + self._req('netdataregister') diff --git a/tools/harness-automation/autothreadharness/runner.py b/tools/harness-automation/autothreadharness/runner.py new file mode 100644 index 000000000..40f8f7e4a --- /dev/null +++ b/tools/harness-automation/autothreadharness/runner.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 argparse +import logging +import json +import os +import sys +import time +import unittest +from collections import OrderedDict + +from autothreadharness.harness_case import HarnessCase +from autothreadharness.open_thread_controller import OpenThreadController +from autothreadharness import settings + +logging.basicConfig(level=logging.INFO) + +logger = logging.getLogger() +'''Logger: The global logger''' + +logger.setLevel(logging.INFO) + +RESUME_SCRIPT_PATH = '%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\' \ + 'Startup\\continue_harness.bat' + +class SimpleTestResult(unittest.TestResult): + def __init__(self, path, auto_reboot_args=None, manual_reset=False): + '''Record test results in json file + + Args: + path (str): File path to record the results + auto_reboot (bool): Whether reboot when harness die + ''' + super(SimpleTestResult, self).__init__() + self.path = path + self.manual_reset = manual_reset + self.auto_reboot_args = auto_reboot_args + self.result = json.load(open(self.path, 'r')) + self.log_handler = None + self.started = None + logger.info('Initial state is %s', json.dumps(self.result, indent=2)) + + def startTest(self, test): + logger.info('\n========================================\n%s\n========================================', test.__class__.__name__) + + # 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)) + + # record start timestamp + self.started = time.strftime('%Y-%m-%dT%H:%M:%S') + + # manual reset + test.manual_reset = self.manual_reset + 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')) + logger.addHandler(self.log_handler) + + def add_result(self, test, passed, error=None): + '''Record test result into json file + + Args: + test (TestCase): The test just run + passed (bool): Whether the case is passed + ''' + self.result[unicode(test.__class__.__name__)] = { + 'started': self.started, + 'stopped': time.strftime('%Y-%m-%dT%H:%M:%S'), + 'passed': passed, + 'error': error + } + 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) + + # save logs + logger.removeHandler(self.log_handler) + self.log_handler.close() + self.log_handler = None + time.sleep(2) + + def addSuccess(self, test): + logger.info('case[%s] pass', test.__class__.__name__) + super(SimpleTestResult, self).addSuccess(test) + self.add_result(test, True) + + def addFailure(self, test, err): + logger.warning('case[%s] fail', test.__class__.__name__) + super(SimpleTestResult, self).addFailure(test, err) + self.add_result(test, False) + + def addError(self, test, err): + logger.error('case[%s] error', test.__class__.__name__, exc_info=err) + + if err and err[0] is SystemExit: + if self.auto_reboot_args: + logger.warning('rebooting..') + os.system('shutdown /r /t 1') + else: + logger.warning('exiting..') + sys.exit(1) + + super(SimpleTestResult, self).addError(test, err) + self.add_result(test, None, str(err[1])) + +def discover(names=None, pattern='*.py', skip='efp', dry_run=False, + manual_reset=False, delete_blacklist=False, list_devices=False, + continue_from=None, result_file='./result.json', auto_reboot=False): + '''Discover all test cases and skip those passed + + Args: + pattern (str): Pattern to match case modules, refer python's unittest + documentation for more details + skip (str): types cases to skip + ''' + + if list_devices: + for port in names or settings.GOLDEN_DEVICES: + print('%s: %s' % (port, OpenThreadController(port).version)) + return + + log = None + if os.path.isfile(result_file): + try: + log = json.load(open(result_file, 'r')) + except: + pass + + if not log: + log = {} + json.dump(log, open(result_file, 'w'), indent=2) + + suite = unittest.TestSuite() + discovered = unittest.defaultTestLoader.discover('cases', pattern) + + for s1 in discovered: + for s2 in s1: + for case in s2: + if case.__class__ is HarnessCase: + continue + case_name = unicode(case.__class__.__name__) + + # whitelist + if len(names): + if case_name in names: + suite.addTest(case) + logger.info('case[%s] added', case_name) + + # skip cases + else: + if case_name in log.keys(): + 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', case_name) + continue + + # continue from + if continue_from: + if continue_from != case_name: + logger.warning('case[%s] skipped', case_name) + continue + else: + continue_from = None + + suite.addTest(case) + logger.info('case[%s] added', case_name) + + if auto_reboot: + argv = [] + argv.append('"%s"' % os.sep.join([os.getcwd(), 'start.bat'])) + argv.extend(['-p', pattern]) + argv.extend(['-k', skip]) + argv.extend(['-o', result_file]) + argv.append('-a') + + if manual_reset: + argv.append('-m') + + if delete_blacklist: + argv.append('-d') + + auto_reboot_args = argv + names + else: + auto_reboot_args = None + os.system('del "%s"' % RESUME_SCRIPT_PATH) + + result = SimpleTestResult(result_file, auto_reboot_args, manual_reset) + for case in suite: + logger.info(case.__class__.__name__) + + if dry_run: + return + + os.system('del history.json') + suite.run(result) + +def main(): + parser = argparse.ArgumentParser(description='Thread harness test case runner') + parser.add_argument('names', metavar='NAME', type=str, nargs='*', default=None, + help='test case name, omit to test all') + parser.add_argument('--pattern', '-p', metavar='PATTERN', type=str, + help='file name pattern, default to "*.py"', default='*.py') + parser.add_argument('--delete-blacklist', '-d', action='store_true', default=False, + help='clear blacklist on startup') + parser.add_argument('--skip', '-k', metavar='SKIP', type=str, + help='type of results to skip.' \ + 'e for error, f for fail, p for pass. default to "efp"', + default='efp') + parser.add_argument('--dry-run', '-n', action='store_true', default=False, + help='just show what to run') + parser.add_argument('--result-file', '-o', type=str, default=settings.OUTPUT_PATH + '\\result.json', + help='file to store and read current status') + parser.add_argument('--list-file', '-i', type=str, default=None, + help='file to list cases names to test') + parser.add_argument('--continue-from', '-c', type=str, default=None, + help='first case to test') + parser.add_argument('--auto-reboot', '-a', action='store_true', default=False, + help='restart system when harness service die') + parser.add_argument('--manual-reset', '-m', action='store_true', default=False, + help='reset devices manually') + parser.add_argument('--list-devices', '-l', action='store_true', default=False, + help='list devices') + + args = vars(parser.parse_args()) + + if args['list_file']: + try: + names = filter(lambda line: not line.startswith('#'), + map(lambda line: line.strip('\n'), + open(args['list_file'], 'r').readlines())) + except: + logger.exception('Failed to open test case list file') + raise + else: + args['names'] = args['names'] + names + + + args.pop('list_file') + discover(**args) + +if __name__ == '__main__': + main() diff --git a/tools/harness-automation/autothreadharness/settings_sample.py b/tools/harness-automation/autothreadharness/settings_sample.py new file mode 100644 index 000000000..49b1adfe4 --- /dev/null +++ b/tools/harness-automation/autothreadharness/settings_sample.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +DUT_DEVICE = 'COM16' +"""str: Serial port of the DUT""" + +DUT_MANUFACTURER = 'Open Thread' +"""str: Manufacturer of the DUT""" + +THREAD_CHANNEL = 18 +"""int: Thread channel""" + +THREAD_PANID = '0xface' +"""str: Thread PAN ID""" + +THREAD_NETWORKNAME = 'GRL' +"""str: Thread network name""" + +THREAD_EXTPANID = '000db80000000000' +"""str: Thread extended PAN ID""" + +THREAD_CHILD_TIMEOUT = 100 +"""int: Child timeout in seconds""" + +THREAD_SED_POLLING_INTERVAL = 100 +"""int: SED polling interval in seconds""" + +HARNESS_HOME = 'C:\\GRL\\Thread1.1' +"""str: Harness installation path""" + +HARNESS_URL = 'http://127.0.0.1:8000' +"""str: Harness front-end url""" + +APC_HOST = None +"""str: PDU controller host. + +Keep this None if no APC PDU available. +""" + +APC_OUTLET = 1 +"""int: PDU outlet""" + +TESTER_NAME = 'Thread Open' +"""str: Who are you""" + +TESTER_REMARKS = 'OpenThread is great' +"""str: Any comments in the final PDF""" + +GOLDEN_DEVICE_TYPE = 'ARM' +"""str: Golden device type""" + +GOLDEN_DEVICES = [] +"""[str]: Golden devices list. + +It should be something like ['COM1', 'COM2'] on Windows +""" + +OUTPUT_PATH = '.\\output' +"""str: Path to store results and logs""" diff --git a/tools/harness-automation/cases/__init__.py b/tools/harness-automation/cases/__init__.py new file mode 100644 index 000000000..fdd8913b4 --- /dev/null +++ b/tools/harness-automation/cases/__init__.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + diff --git a/tools/harness-automation/cases/ed_6_1_1.py b/tools/harness-automation/cases/ed_6_1_1.py new file mode 100644 index 000000000..98409555a --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_1(HarnessCase): + suite = 32 + case = '6 1 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_1_2.py b/tools/harness-automation/cases/ed_6_1_2.py new file mode 100644 index 000000000..469795e18 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_2(HarnessCase): + suite = 32 + case = '6 1 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_1_3.py b/tools/harness-automation/cases/ed_6_1_3.py new file mode 100644 index 000000000..c089ba72d --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_3.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_3(HarnessCase): + suite = 32 + case = '6 1 3' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_1_4.py b/tools/harness-automation/cases/ed_6_1_4.py new file mode 100644 index 000000000..3f7289582 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_4.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_4(HarnessCase): + suite = 32 + case = '6 1 4' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_1_5.py b/tools/harness-automation/cases/ed_6_1_5.py new file mode 100644 index 000000000..883a8c375 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_5.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_5(HarnessCase): + suite = 32 + case = '6 1 5' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_1_6.py b/tools/harness-automation/cases/ed_6_1_6.py new file mode 100644 index 000000000..94deaba9b --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_6.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_6(HarnessCase): + suite = 32 + case = '6 1 6' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_1_7.py b/tools/harness-automation/cases/ed_6_1_7.py new file mode 100644 index 000000000..32aebaac5 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_1_7.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_1_7(HarnessCase): + suite = 32 + case = '6 1 7' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_2_1.py b/tools/harness-automation/cases/ed_6_2_1.py new file mode 100644 index 000000000..222fbe34a --- /dev/null +++ b/tools/harness-automation/cases/ed_6_2_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_2_1(HarnessCase): + suite = 32 + case = '6 2 1' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_2_2.py b/tools/harness-automation/cases/ed_6_2_2.py new file mode 100644 index 000000000..907611d5b --- /dev/null +++ b/tools/harness-automation/cases/ed_6_2_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_2_2(HarnessCase): + suite = 32 + case = '6 2 2' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_3_1.py b/tools/harness-automation/cases/ed_6_3_1.py new file mode 100644 index 000000000..9a3da6e83 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_3_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_3_1(HarnessCase): + suite = 32 + case = '6 3 1' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_3_2.py b/tools/harness-automation/cases/ed_6_3_2.py new file mode 100644 index 000000000..68879a2cd --- /dev/null +++ b/tools/harness-automation/cases/ed_6_3_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_3_2(HarnessCase): + suite = 32 + case = '6 3 2' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_4_1.py b/tools/harness-automation/cases/ed_6_4_1.py new file mode 100644 index 000000000..f18d6345f --- /dev/null +++ b/tools/harness-automation/cases/ed_6_4_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_4_1(HarnessCase): + suite = 32 + case = '6 4 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_4_2.py b/tools/harness-automation/cases/ed_6_4_2.py new file mode 100644 index 000000000..a9895a64b --- /dev/null +++ b/tools/harness-automation/cases/ed_6_4_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_4_2(HarnessCase): + suite = 32 + case = '6 4 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_5_1.py b/tools/harness-automation/cases/ed_6_5_1.py new file mode 100644 index 000000000..95ea99d7f --- /dev/null +++ b/tools/harness-automation/cases/ed_6_5_1.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 +import time + +from autothreadharness.harness_case import HarnessCase + +class ED_6_5_1(HarnessCase): + suite = 32 + case = '6 5 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + time.sleep(self.child_timeout + 10) + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_5_2.py b/tools/harness-automation/cases/ed_6_5_2.py new file mode 100644 index 000000000..1f4c4ddf6 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_5_2.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest +import re + +from autothreadharness.harness_case import HarnessCase + +class ED_6_5_2(HarnessCase): + suite = 32 + case = '6 5 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_5_3.py b/tools/harness-automation/cases/ed_6_5_3.py new file mode 100644 index 000000000..ed160a2ec --- /dev/null +++ b/tools/harness-automation/cases/ed_6_5_3.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class ED_6_5_3(HarnessCase): + suite = 32 + case = '6 5 3' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_6_1.py b/tools/harness-automation/cases/ed_6_6_1.py new file mode 100644 index 000000000..773626021 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_6_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_6_1(HarnessCase): + suite = 32 + case = '6 6 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/ed_6_6_2.py b/tools/harness-automation/cases/ed_6_6_2.py new file mode 100644 index 000000000..9a34a5f71 --- /dev/null +++ b/tools/harness-automation/cases/ed_6_6_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 ED_6_6_2(HarnessCase): + suite = 32 + case = '6 6 2' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_1_1.py b/tools/harness-automation/cases/leader_5_1_1.py new file mode 100644 index 000000000..6bbf6a0ed --- /dev/null +++ b/tools/harness-automation/cases/leader_5_1_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_1_1(HarnessCase): + suite = 1 + case = '5 1 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_1_13.py b/tools/harness-automation/cases/leader_5_1_13.py new file mode 100644 index 000000000..1ba1a30fe --- /dev/null +++ b/tools/harness-automation/cases/leader_5_1_13.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Leader_5_1_13(HarnessCase): + suite = 1 + case = '5 1 13' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + if title.startswith('User Input Required'): + #body = dialog.find_element_by_id('cnfrmMsg').text + #if body.startswith('Reset Leader'): + self.dut.stop() + time.sleep(1) + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_1_5.py b/tools/harness-automation/cases/leader_5_1_5.py new file mode 100644 index 000000000..4f3fee8e3 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_1_5.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Leader_5_1_5(HarnessCase): + suite = 1 + case = '5 1 5' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_2_2.py b/tools/harness-automation/cases/leader_5_2_2.py new file mode 100644 index 000000000..1ceb89a80 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_2_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_2_2(HarnessCase): + suite = 1 + case = '5 2 2' + golden_devices_required = 32 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_2_3.py b/tools/harness-automation/cases/leader_5_2_3.py new file mode 100644 index 000000000..d9bf70cb3 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_2_3.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_2_3(HarnessCase): + suite = 1 + case = '5 2 3' + golden_devices_required = 32 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_3_6.py b/tools/harness-automation/cases/leader_5_3_6.py new file mode 100644 index 000000000..6f501e643 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_3_6.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Leader_5_3_6(HarnessCase): + suite = 1 + case = '5 3 6' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_3_7.py b/tools/harness-automation/cases/leader_5_3_7.py new file mode 100644 index 000000000..ccaf82073 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_3_7.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_3_7(HarnessCase): + suite = 1 + case = '5 3 7' + golden_devices_required = 5 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_3_8.py b/tools/harness-automation/cases/leader_5_3_8.py new file mode 100644 index 000000000..a3ad440ea --- /dev/null +++ b/tools/harness-automation/cases/leader_5_3_8.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_3_8(HarnessCase): + suite = 1 + case = '5 3 8' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_5_1.py b/tools/harness-automation/cases/leader_5_5_1.py new file mode 100644 index 000000000..5e2260e80 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_5_1.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 re +import time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class Leader_5_5_1(HarnessCase): + suite = 1 + case = '5 5 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + if title.startswith('User Input Required'): + body = dialog.find_element_by_id('cnfrmMsg').text + match = re.search(r'(?<=Leader Timeout\[)\d+(?= Seconds\])', body) + if match: + timeout = int(match.group(0)) / 2 + else: + timeout = 10 + self.dut.stop() + time.sleep(timeout) + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_5_2.py b/tools/harness-automation/cases/leader_5_5_2.py new file mode 100644 index 000000000..1d76e4dcb --- /dev/null +++ b/tools/harness-automation/cases/leader_5_5_2.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class Leader_5_5_2(HarnessCase): + suite = 1 + case = '5 5 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + if title.startswith('User Input Required'): + self.dut.stop() + time.sleep(1) + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_5_3.py b/tools/harness-automation/cases/leader_5_5_3.py new file mode 100644 index 000000000..53ee2ad7b --- /dev/null +++ b/tools/harness-automation/cases/leader_5_5_3.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class Leader_5_5_3(HarnessCase): + suite = 1 + case = '5 5 3' + golden_devices_required = 5 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_5_4.py b/tools/harness-automation/cases/leader_5_5_4.py new file mode 100644 index 000000000..d1421c8a6 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_5_4.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class Leader_5_5_4(HarnessCase): + suite = 1 + case = '5 5 4' + golden_devices_required = 5 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_5_7.py b/tools/harness-automation/cases/leader_5_5_7.py new file mode 100644 index 000000000..ac17e626e --- /dev/null +++ b/tools/harness-automation/cases/leader_5_5_7.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase + +import time +import unittest + +class Leader_5_5_7(HarnessCase): + suite = 1 + case = '5 5 7' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_6_2.py b/tools/harness-automation/cases/leader_5_6_2.py new file mode 100644 index 000000000..b1ae41bb7 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_6_2.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Leader_5_6_2(HarnessCase): + suite = 1 + case = '5 6 2' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_6_4.py b/tools/harness-automation/cases/leader_5_6_4.py new file mode 100644 index 000000000..5c0abdf36 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_6_4.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_6_4(HarnessCase): + suite = 1 + case = '5 6 4' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_6_5.py b/tools/harness-automation/cases/leader_5_6_5.py new file mode 100644 index 000000000..9699fd9ad --- /dev/null +++ b/tools/harness-automation/cases/leader_5_6_5.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_6_5(HarnessCase): + suite = 1 + case = '5 6 5' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_6_6.py b/tools/harness-automation/cases/leader_5_6_6.py new file mode 100644 index 000000000..1f28659ff --- /dev/null +++ b/tools/harness-automation/cases/leader_5_6_6.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_6_6(HarnessCase): + suite = 1 + case = '5 6 6' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_6_8.py b/tools/harness-automation/cases/leader_5_6_8.py new file mode 100644 index 000000000..253bd97a4 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_6_8.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_6_8(HarnessCase): + suite = 1 + case = '5 6 8' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_7_1.py b/tools/harness-automation/cases/leader_5_7_1.py new file mode 100644 index 000000000..a313997a0 --- /dev/null +++ b/tools/harness-automation/cases/leader_5_7_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 Leader_5_7_1(HarnessCase): + suite = 1 + case = '5 7 1' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_5_8_1.py b/tools/harness-automation/cases/leader_5_8_1.py new file mode 100644 index 000000000..70843594b --- /dev/null +++ b/tools/harness-automation/cases/leader_5_8_1.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest +class Leader_5_8_1(HarnessCase): + suite = 1 + case = '5 8 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_7_1_1.py b/tools/harness-automation/cases/leader_7_1_1.py new file mode 100644 index 000000000..ee6b6c424 --- /dev/null +++ b/tools/harness-automation/cases/leader_7_1_1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Leader_7_1_1(HarnessCase): + suite = 1 + case = '7 1 1' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/leader_7_1_3.py b/tools/harness-automation/cases/leader_7_1_3.py new file mode 100644 index 000000000..01a709249 --- /dev/null +++ b/tools/harness-automation/cases/leader_7_1_3.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Leader_7_1_3(HarnessCase): + suite = 1 + case = '7 1 3' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/reed_5_2_4.py b/tools/harness-automation/cases/reed_5_2_4.py new file mode 100644 index 000000000..151fa67c0 --- /dev/null +++ b/tools/harness-automation/cases/reed_5_2_4.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 REED_5_2_4(HarnessCase): + suite = 16 + case = '5 2 4' + golden_devices_required = 17 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/reed_5_2_5.py b/tools/harness-automation/cases/reed_5_2_5.py new file mode 100644 index 000000000..4784925c8 --- /dev/null +++ b/tools/harness-automation/cases/reed_5_2_5.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 REED_5_2_5(HarnessCase): + suite = 16 + case = '5 2 5' + golden_devices_required = 17 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/reed_5_2_7.py b/tools/harness-automation/cases/reed_5_2_7.py new file mode 100644 index 000000000..2894c42ac --- /dev/null +++ b/tools/harness-automation/cases/reed_5_2_7.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 REED_5_2_7(HarnessCase): + suite = 16 + 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-automation/cases/reed_5_5_5.py b/tools/harness-automation/cases/reed_5_5_5.py new file mode 100644 index 000000000..f5326fa88 --- /dev/null +++ b/tools/harness-automation/cases/reed_5_5_5.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 REED_5_5_5(HarnessCase): + suite = 16 + case = '5 5 5' + golden_devices_required = 16 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/reed_5_6_7.py b/tools/harness-automation/cases/reed_5_6_7.py new file mode 100644 index 000000000..d1f12ba44 --- /dev/null +++ b/tools/harness-automation/cases/reed_5_6_7.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 REED_5_6_7(HarnessCase): + suite = 16 + case = '5 6 7' + golden_devices_required = 16 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_1.py b/tools/harness-automation/cases/router_5_1_1.py new file mode 100644 index 000000000..9b4cc840c --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_1(HarnessCase): + suite = 2 + case = '5 1 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_10.py b/tools/harness-automation/cases/router_5_1_10.py new file mode 100644 index 000000000..5b91b0cba --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_10.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_10(HarnessCase): + suite = 2 + case = '5 1 10' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_11.py b/tools/harness-automation/cases/router_5_1_11.py new file mode 100644 index 000000000..cea6155ca --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_11.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_11(HarnessCase): + suite = 2 + case = '5 1 11' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_12.py b/tools/harness-automation/cases/router_5_1_12.py new file mode 100644 index 000000000..056a0e8e1 --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_12.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_12(HarnessCase): + suite = 2 + case = '5 1 12' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_13.py b/tools/harness-automation/cases/router_5_1_13.py new file mode 100644 index 000000000..034853a79 --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_13.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 +import time + +from autothreadharness.harness_case import HarnessCase + +class Router_5_1_13(HarnessCase): + suite = 2 + case = '5 1 13' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_2.py b/tools/harness-automation/cases/router_5_1_2.py new file mode 100644 index 000000000..f45115d48 --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_2(HarnessCase): + suite = 2 + case = '5 1 2' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_3.py b/tools/harness-automation/cases/router_5_1_3.py new file mode 100644 index 000000000..44f79cf32 --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_3.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_3(HarnessCase): + suite = 2 + case = '5 1 3' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_4.py b/tools/harness-automation/cases/router_5_1_4.py new file mode 100644 index 000000000..a13db5281 --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_4.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_4(HarnessCase): + suite = 2 + case = '5 1 4' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_6.py b/tools/harness-automation/cases/router_5_1_6.py new file mode 100644 index 000000000..d051e0abb --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_6.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_6(HarnessCase): + suite = 2 + case = '5 1 6' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_7.py b/tools/harness-automation/cases/router_5_1_7.py new file mode 100644 index 000000000..0a5903cbf --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_7.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_7(HarnessCase): + suite = 2 + case = '5 1 7' + golden_devices_required = 7 + def on_dialog(self, dialog, title): + if title.startswith('Enter Router Max Child Count'): + inp = dialog.find_element_by_id('cnfrmInpText') + inp.clear() + inp.send_keys('5') + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_8.py b/tools/harness-automation/cases/router_5_1_8.py new file mode 100644 index 000000000..b83b831c0 --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_8.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_8(HarnessCase): + suite = 2 + case = '5 1 8' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_1_9.py b/tools/harness-automation/cases/router_5_1_9.py new file mode 100644 index 000000000..23e9e26ca --- /dev/null +++ b/tools/harness-automation/cases/router_5_1_9.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1_9(HarnessCase): + suite = 2 + case = '5 1 9' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_2_1.py b/tools/harness-automation/cases/router_5_2_1.py new file mode 100644 index 000000000..4aef4e9ad --- /dev/null +++ b/tools/harness-automation/cases/router_5_2_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_1(HarnessCase): + suite = 2 + case = '5 2 1' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_2_6.py b/tools/harness-automation/cases/router_5_2_6.py new file mode 100644 index 000000000..3ab164225 --- /dev/null +++ b/tools/harness-automation/cases/router_5_2_6.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_6(HarnessCase): + suite = 2 + case = '5 2 6' + golden_devices_required = 23 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_2_7.py b/tools/harness-automation/cases/router_5_2_7.py new file mode 100644 index 000000000..075fc68b7 --- /dev/null +++ b/tools/harness-automation/cases/router_5_2_7.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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): + suite = 2 + 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-automation/cases/router_5_3_1.py b/tools/harness-automation/cases/router_5_3_1.py new file mode 100644 index 000000000..7f38a6302 --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_1.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_1(HarnessCase): + suite = 2 + case = '5 3 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_3_10.py b/tools/harness-automation/cases/router_5_3_10.py new file mode 100644 index 000000000..3b4ba3cc6 --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_10.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_10(HarnessCase): + suite = 2 + case = '5 3 10' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_3_2.py b/tools/harness-automation/cases/router_5_3_2.py new file mode 100644 index 000000000..7a2040401 --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_2.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_2(HarnessCase): + suite = 2 + case = '5 3 2' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_3_3.py b/tools/harness-automation/cases/router_5_3_3.py new file mode 100644 index 000000000..a6aa2816f --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_3.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_3(HarnessCase): + suite = 2 + case = '5 3 3' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_3_4.py b/tools/harness-automation/cases/router_5_3_4.py new file mode 100644 index 000000000..8bdcbbea8 --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_4.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_4(HarnessCase): + suite = 2 + case = '5 3 4' + golden_devices_required = 6 + def on_dialog(self, dialog, title): + pass +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_3_5.py b/tools/harness-automation/cases/router_5_3_5.py new file mode 100644 index 000000000..e7e789eec --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_5.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_5(HarnessCase): + suite = 2 + case = '5 3 5' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_3_9.py b/tools/harness-automation/cases/router_5_3_9.py new file mode 100644 index 000000000..ce2696665 --- /dev/null +++ b/tools/harness-automation/cases/router_5_3_9.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_3_9(HarnessCase): + suite = 2 + case = '5 3 9' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_5_1.py b/tools/harness-automation/cases/router_5_5_1.py new file mode 100644 index 000000000..56fabc2c9 --- /dev/null +++ b/tools/harness-automation/cases/router_5_5_1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_5_1(HarnessCase): + suite = 2 + case = '5 5 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_5_2.py b/tools/harness-automation/cases/router_5_5_2.py new file mode 100644 index 000000000..a321fd2dd --- /dev/null +++ b/tools/harness-automation/cases/router_5_5_2.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_5_2(HarnessCase): + suite = 2 + case = '5 5 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_5_3.py b/tools/harness-automation/cases/router_5_5_3.py new file mode 100644 index 000000000..4215dd9a5 --- /dev/null +++ b/tools/harness-automation/cases/router_5_5_3.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_5_3(HarnessCase): + suite = 2 + case = '5 5 3' + golden_devices_required = 5 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_5_4.py b/tools/harness-automation/cases/router_5_5_4.py new file mode 100644 index 000000000..acc642dd4 --- /dev/null +++ b/tools/harness-automation/cases/router_5_5_4.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_5_4(HarnessCase): + suite = 2 + case = '5 5 4' + golden_devices_required = 5 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_5_7.py b/tools/harness-automation/cases/router_5_5_7.py new file mode 100644 index 000000000..4d2bf055a --- /dev/null +++ b/tools/harness-automation/cases/router_5_5_7.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_5_7(HarnessCase): + suite = 2 + case = '5 5 7' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_5_8.py b/tools/harness-automation/cases/router_5_5_8.py new file mode 100644 index 000000000..cabfa4eff --- /dev/null +++ b/tools/harness-automation/cases/router_5_5_8.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_5_8(HarnessCase): + suite = 2 + case = '5 5 8' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_6_1.py b/tools/harness-automation/cases/router_5_6_1.py new file mode 100644 index 000000000..138828e27 --- /dev/null +++ b/tools/harness-automation/cases/router_5_6_1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_6_1(HarnessCase): + suite = 2 + case = '5 6 1' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_6_3.py b/tools/harness-automation/cases/router_5_6_3.py new file mode 100644 index 000000000..f74ad23c4 --- /dev/null +++ b/tools/harness-automation/cases/router_5_6_3.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_6_3(HarnessCase): + suite = 2 + case = '5 6 3' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_6_9.py b/tools/harness-automation/cases/router_5_6_9.py new file mode 100644 index 000000000..ed5ec343e --- /dev/null +++ b/tools/harness-automation/cases/router_5_6_9.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest + +class Router_5_6_9(HarnessCase): + suite = 2 + case = '5 6 9' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_8_2.py b/tools/harness-automation/cases/router_5_8_2.py new file mode 100644 index 000000000..9597a832a --- /dev/null +++ b/tools/harness-automation/cases/router_5_8_2.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest +class Router_5_8_2(HarnessCase): + suite = 2 + case = '5 8 2' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_5_8_3.py b/tools/harness-automation/cases/router_5_8_3.py new file mode 100644 index 000000000..078ee7c44 --- /dev/null +++ b/tools/harness-automation/cases/router_5_8_3.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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. +# + + +from autothreadharness.harness_case import HarnessCase +import unittest +class Router_5_8_3(HarnessCase): + suite = 2 + case = '5 8 3' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_7_1_2.py b/tools/harness-automation/cases/router_7_1_2.py new file mode 100644 index 000000000..71a3c34cd --- /dev/null +++ b/tools/harness-automation/cases/router_7_1_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_7_1_2(HarnessCase): + suite = 2 + case = '7 1 2' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_7_1_4.py b/tools/harness-automation/cases/router_7_1_4.py new file mode 100644 index 000000000..0fb36115a --- /dev/null +++ b/tools/harness-automation/cases/router_7_1_4.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_7_1_4(HarnessCase): + suite = 2 + case = '7 1 4' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_7_1_5.py b/tools/harness-automation/cases/router_7_1_5.py new file mode 100644 index 000000000..6ddc2040c --- /dev/null +++ b/tools/harness-automation/cases/router_7_1_5.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_7_1_5(HarnessCase): + suite = 2 + case = '7 1 5' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_7_1_6.py b/tools/harness-automation/cases/router_7_1_6.py new file mode 100644 index 000000000..53fd06dc1 --- /dev/null +++ b/tools/harness-automation/cases/router_7_1_6.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_7_1_6(HarnessCase): + suite = 2 + case = '7 1 6' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_7_1_7.py b/tools/harness-automation/cases/router_7_1_7.py new file mode 100644 index 000000000..338d2f185 --- /dev/null +++ b/tools/harness-automation/cases/router_7_1_7.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_7_1_7(HarnessCase): + suite = 2 + case = '7 1 7' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/router_7_1_8.py b/tools/harness-automation/cases/router_7_1_8.py new file mode 100644 index 000000000..d0046eb03 --- /dev/null +++ b/tools/harness-automation/cases/router_7_1_8.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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_7_1_8(HarnessCase): + suite = 2 + case = '7 1 8' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_1_1.py b/tools/harness-automation/cases/sed_6_1_1.py new file mode 100644 index 000000000..c183baccb --- /dev/null +++ b/tools/harness-automation/cases/sed_6_1_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_1_1(HarnessCase): + suite = 4 + case = '6 1 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_1_2.py b/tools/harness-automation/cases/sed_6_1_2.py new file mode 100644 index 000000000..031a02199 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_1_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_1_2(HarnessCase): + suite = 4 + case = '6 1 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_1_3.py b/tools/harness-automation/cases/sed_6_1_3.py new file mode 100644 index 000000000..44a80520a --- /dev/null +++ b/tools/harness-automation/cases/sed_6_1_3.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_1_3(HarnessCase): + suite = 4 + case = '6 1 3' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_1_4.py b/tools/harness-automation/cases/sed_6_1_4.py new file mode 100644 index 000000000..9b5b79d06 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_1_4.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_1_4(HarnessCase): + suite = 4 + case = '6 1 4' + golden_devices_required = 4 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_1_5.py b/tools/harness-automation/cases/sed_6_1_5.py new file mode 100644 index 000000000..95d4323ae --- /dev/null +++ b/tools/harness-automation/cases/sed_6_1_5.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_1_5(HarnessCase): + suite = 4 + case = '6 1 5' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_1_6.py b/tools/harness-automation/cases/sed_6_1_6.py new file mode 100644 index 000000000..e4d0ca52c --- /dev/null +++ b/tools/harness-automation/cases/sed_6_1_6.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_1_6(HarnessCase): + suite = 4 + case = '6 1 6' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_2_1.py b/tools/harness-automation/cases/sed_6_2_1.py new file mode 100644 index 000000000..135d3f0d8 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_2_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_2_1(HarnessCase): + suite = 4 + case = '6 2 1' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_2_2.py b/tools/harness-automation/cases/sed_6_2_2.py new file mode 100644 index 000000000..ef2e2ac9b --- /dev/null +++ b/tools/harness-automation/cases/sed_6_2_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_2_2(HarnessCase): + suite = 4 + case = '6 2 2' + golden_devices_required = 3 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_3_1.py b/tools/harness-automation/cases/sed_6_3_1.py new file mode 100644 index 000000000..531f5c2d1 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_3_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_3_1(HarnessCase): + suite = 4 + case = '6 3 1' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_3_2.py b/tools/harness-automation/cases/sed_6_3_2.py new file mode 100644 index 000000000..22676fe8d --- /dev/null +++ b/tools/harness-automation/cases/sed_6_3_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_3_2(HarnessCase): + suite = 4 + case = '6 3 2' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_4_1.py b/tools/harness-automation/cases/sed_6_4_1.py new file mode 100644 index 000000000..85c52fa8e --- /dev/null +++ b/tools/harness-automation/cases/sed_6_4_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_4_1(HarnessCase): + suite = 4 + case = '6 4 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_4_2.py b/tools/harness-automation/cases/sed_6_4_2.py new file mode 100644 index 000000000..8849a5663 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_4_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_4_2(HarnessCase): + suite = 4 + case = '6 4 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_5_1.py b/tools/harness-automation/cases/sed_6_5_1.py new file mode 100644 index 000000000..b0c660421 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_5_1.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class SED_6_5_1(HarnessCase): + suite = 4 + case = '6 5 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + time.sleep(self.child_timeout + 5) + self.dut.stop() + time.sleep(1) + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_5_2.py b/tools/harness-automation/cases/sed_6_5_2.py new file mode 100644 index 000000000..6646ba79b --- /dev/null +++ b/tools/harness-automation/cases/sed_6_5_2.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class SED_6_5_2(HarnessCase): + suite = 4 + case = '6 5 2' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_5_3.py b/tools/harness-automation/cases/sed_6_5_3.py new file mode 100644 index 000000000..d7485010d --- /dev/null +++ b/tools/harness-automation/cases/sed_6_5_3.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 time +import unittest + +from autothreadharness.harness_case import HarnessCase + +class SED_6_5_3(HarnessCase): + suite = 4 + case = '6 5 3' + golden_devices_required = 2 + def on_dialog(self, dialog, title): + if title.startswith('Reset DUT'): + self.dut.stop() + return False + + elif title.startswith('Rejoin Now'): + self.dut.start() + return False + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_6_1.py b/tools/harness-automation/cases/sed_6_6_1.py new file mode 100644 index 000000000..db9ce0613 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_6_1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_6_1(HarnessCase): + suite = 4 + case = '6 6 1' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/cases/sed_6_6_2.py b/tools/harness-automation/cases/sed_6_6_2.py new file mode 100644 index 000000000..38ed80843 --- /dev/null +++ b/tools/harness-automation/cases/sed_6_6_2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# Copyright (c) 2016, Nest Labs, Inc. +# 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 SED_6_6_2(HarnessCase): + suite = 4 + case = '6 6 2' + golden_devices_required = 1 + def on_dialog(self, dialog, title): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tools/harness-automation/doc/components.gv b/tools/harness-automation/doc/components.gv new file mode 100644 index 000000000..dd49c9ffc --- /dev/null +++ b/tools/harness-automation/doc/components.gv @@ -0,0 +1,18 @@ +digraph G { + subgraph cluster_os { + style=filled; + color=grey; + label="Windows"; + + subgraph cluster_python { + label="Automation Tool/Python"; + color=lightgrey; + HarnessCase -> HarnessController; + HarnessCase -> OpenThreadController; + } + + HarnessCase -> Chrome [label="selenium"]; + HarnessController -> "Thread Harness"; + } + OpenThreadController -> DUT [label="serial port"]; +} diff --git a/tools/harness-automation/doc/components.png b/tools/harness-automation/doc/components.png new file mode 100644 index 0000000000000000000000000000000000000000..6756a174fd42d1c7246230649b9dfe788a84ed9b GIT binary patch literal 45216 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 YWHJR$gbv$y62LzV6&>Z$i v documentation" by default. +# +# html_title = u'Thread Harness Automation v0.5' + +# A shorter title for the navigation bar. Default is the same as html_title. +# +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# +# html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# +# html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +# +# html_last_updated_fmt = None + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# +# html_additional_pages = {} + +# If false, no module index is generated. +# +# html_domain_indices = True + +# If false, no index is generated. +# +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' +# +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +# +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'ThreadHarnessAutomationdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'ThreadHarnessAutomation.tex', u'Thread Harness Automation Documentation', + u'Yakun Xu', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# +# latex_use_parts = False + +# If true, show page references after internal links. +# +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# +# latex_appendices = [] + +# If false, no module index is generated. +# +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'threadharnessautomation', u'Thread Harness Automation Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +# +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'ThreadHarnessAutomation', u'Thread Harness Automation Documentation', + author, 'ThreadHarnessAutomation', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# +# texinfo_appendices = [] + +# If false, no module index is generated. +# +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# +# texinfo_no_detailmenu = False diff --git a/tools/harness-automation/doc/index.rst b/tools/harness-automation/doc/index.rst new file mode 100644 index 000000000..6f91db9ee --- /dev/null +++ b/tools/harness-automation/doc/index.rst @@ -0,0 +1,25 @@ +.. Thread Harness Automation documentation master file, created by + sphinx-quickstart on Wed Jun 29 15:18:24 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Thread Harness Automation's documentation! +===================================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + quickstart + api/modules + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/tools/harness-automation/doc/quickstart.rst b/tools/harness-automation/doc/quickstart.rst new file mode 100644 index 000000000..10a0ca450 --- /dev/null +++ b/tools/harness-automation/doc/quickstart.rst @@ -0,0 +1,91 @@ +Thread Harness Automation Quick Start +===================================== + +Setup +----- + +#. Install Thread-Test-Harness1.1-Alpha v1.0-Release_13.0 +#. Install python 2.7 +#. Get OpenThread and switch to the harness automation path:: + + git clone https://github.com/openthread/openthread.git + cd openthread/tools/harness-automation + +#. Install python libraries dependencies:: + + pip install -r requirements.txt + +#. Update settings. + + Just copy the sample and modify:: + + cp autothreadharness/settings_sample.py autothreadharness/settings.py + + APC_HOST + MUST be set to None if no APC PDU available. + + GOLDEN_DEVICES + can be found on Windows Device Manager. You have to filter out the ports of sniffer device and DUT by yourself. + + OUTPUT_PATH + MUST be set to a writable directory. + + HARNESS_HOME + MUST be set to Thread Harness installation directory. e.g. ``C:\GRL\Thread`` + +Run single case +--------------- + +:: + + # bash + ./start.sh Router_5_1_1 + + # windows command line + start.bat Router_5_1_1 + +Run all cases +------------- + +:: + + # bash + ./start.sh + + # windows command line + start.bat + +This will record the results in result.json, so that you can continue running cases once broken. You can also get help information with argument -h or --help. + +List devices +------------ + +:: + + # bash + ./start.sh -l + + # windows command line + start.bat -l + +Check single device +------------------- + +:: + + # bash + ./start.sh -l COM28 + + # windows command line + start.bat -l COM28 + +Get Help +--------- + +:: + + # bash + ./start.sh -h + + # windows command line + start.bat -h diff --git a/tools/harness-automation/requirements.txt b/tools/harness-automation/requirements.txt new file mode 100644 index 000000000..98725daf1 --- /dev/null +++ b/tools/harness-automation/requirements.txt @@ -0,0 +1,4 @@ +pyserial +pexpect +pexpect_serial +selenium diff --git a/tools/harness-automation/start.bat b/tools/harness-automation/start.bat new file mode 100644 index 000000000..b1a9ee639 --- /dev/null +++ b/tools/harness-automation/start.bat @@ -0,0 +1,2 @@ +cd %~dp0 +python -u -m autothreadharness.runner %* diff --git a/tools/harness-automation/start.sh b/tools/harness-automation/start.sh new file mode 100755 index 000000000..b1fe2e8ad --- /dev/null +++ b/tools/harness-automation/start.sh @@ -0,0 +1,2 @@ +#!/bin/sh +python -u -m autothreadharness.runner $@