From 311b9283c26ad2a6de16ff8882e91ff5b9a2de72 Mon Sep 17 00:00:00 2001 From: Yakun Xu Date: Tue, 11 Sep 2018 19:22:42 +0800 Subject: [PATCH] [tests] move test_diag into tests/scripts/thread-cert (#3049) --- tests/scripts/thread-cert/Makefile.am | 8 + tests/scripts/thread-cert/test_diag.py | 85 ++++++++ tests/unit/Makefile.am | 21 -- tests/unit/test_diag.cpp | 287 ------------------------- 4 files changed, 93 insertions(+), 308 deletions(-) create mode 100755 tests/scripts/thread-cert/test_diag.py delete mode 100644 tests/unit/test_diag.cpp diff --git a/tests/scripts/thread-cert/Makefile.am b/tests/scripts/thread-cert/Makefile.am index 9adffddc3..be6200fb2 100644 --- a/tests/scripts/thread-cert/Makefile.am +++ b/tests/scripts/thread-cert/Makefile.am @@ -141,6 +141,7 @@ EXTRA_DIST = \ test_coap.py \ test_common.py \ test_crypto.py \ + test_diag.py \ test_ipv6.py \ test_lowpan.py \ test_mac802154.py \ @@ -255,6 +256,12 @@ check_SCRIPTS = \ Cert_9_2_18_RollBackActiveTimestamp.py \ $(NULL) +if OPENTHREAD_ENABLE_DIAG +check_SCRIPTS += \ + test_diag.py \ + $(NULL) +endif + TESTS_ENVIRONMENT = \ export \ top_builddir='$(top_builddir)' \ @@ -267,6 +274,7 @@ TESTS = \ $(NULL) XFAIL_NCP_TESTS = \ + test_diag.py \ test_service.py \ Cert_5_2_05_AddressQuery.py \ Cert_5_3_08_ChildAddressSet.py \ diff --git a/tests/scripts/thread-cert/test_diag.py b/tests/scripts/thread-cert/test_diag.py new file mode 100755 index 000000000..ee5cc799f --- /dev/null +++ b/tests/scripts/thread-cert/test_diag.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# +# Copyright (c) 2018, The OpenThread Authors. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import unittest + +import node_cli +import config + +class TestDiag(unittest.TestCase): + def setUp(self): + self.simulator = config.create_default_simulator() + self.node_cli = node_cli.otCli(1, False, simulator=self.simulator) + + def tearDown(self): + self.node_cli.destroy() + self.simulator.stop() + + def test(self): + cases = [ + ('diag\n', + 'diagnostics mode is disabled\r\n'), + ('diag send 10 100\n', + 'failed\r\nstatus 0xd\r\n'), + ('diag start\n', + 'start diagnostics mode\r\nstatus 0x00\r\n'), + ('diag', + 'diagnostics mode is enabled\r\n'), + ('diag channel 10\n', + 'failed\r\nstatus 0x7\r\n'), + ('diag channel 11\n', + 'set channel to 11\r\nstatus 0x00\r\n'), + ('diag channel\n', + 'channel: 11\r\n'), + ('diag power -10\n', + 'set tx power to -10 dBm\r\nstatus 0x00\r\n'), + ('diag power\n', + 'tx power: -10 dBm\r\n'), + ('diag stats\n', + 'received packets: 0\r\nsent packets: 0\r\nfirst received packet: rssi=0, lqi=0\r\n'), + ('diag send 20 100\n', + 'sending 0x14 packet\(s\), length 0x64\r\nstatus 0x00\r\n'), + (' diag \t send \t 20\t100', + 'sending 0x14 packet\(s\), length 0x64\r\nstatus 0x00\r\n'), + ('diag repeat 100 100\n', + 'sending packets of length 0x64 at the delay of 0x64 ms\r\nstatus 0x00\r\n'), + ('diag stop\n', + 'received packets: 0\r\nsent packets: (\d+)\r\nfirst received packet: rssi=0, lqi=0\r\n\nstop diagnostics mode\r\nstatus 0x00\r\n'), + ('diag', + 'diagnostics mode is disabled\r\n'), + ('diag 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32', + 'Error: too many args \(max 32\)\r\n'), + ] + + for case in cases: + self.node_cli.send_command(case[0]) + self.node_cli._expect(case[1]) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index 1f15666a8..aa6dcf2d9 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -127,12 +127,6 @@ check_PROGRAMS = \ XFAIL_TESTS = \ $(NULL) -if OPENTHREAD_ENABLE_DIAG -check_PROGRAMS += \ - test-diag \ - $(NULL) -endif # OPENTHREAD_ENABLE_DIAG - if OPENTHREAD_ENABLE_NCP check_PROGRAMS += \ test-ncp-buffer \ @@ -228,26 +222,11 @@ test_timer_SOURCES = test_platform.cpp test_timer.cpp test_toolchain_LDADD = $(COMMON_LDADD) test_toolchain_SOURCES = test_platform.cpp test_toolchain.cpp test_toolchain_c.c -if OPENTHREAD_ENABLE_DIAG -test_diag_LDADD = $(top_builddir)/src/diag/libopenthread-diag.a \ - $(COMMON_LDADD) -test_diag_SOURCES = test_diag.cpp -if OPENTHREAD_ENABLE_POSIX_APP -test_diag_LDADD += $(top_builddir)/src/posix/platform/libopenthread-posix.a \ - -lutil \ - $(NULL) -endif -if OPENTHREAD_EXAMPLES_POSIX -test_diag_LDADD += $(top_builddir)/examples/platforms/posix/libopenthread-posix.a -endif -endif - PRETTY_FILES = \ $(test_address_sanitizer_SOURCES) \ $(test_aes_SOURCES) \ $(test_child_SOURCES) \ $(test_child_table_SOURCES) \ - $(test_diag_SOURCES) \ $(test_heap_SOURCES) \ $(test_hmac_sha256_SOURCES) \ $(test_link_quality_SOURCES) \ diff --git a/tests/unit/test_diag.cpp b/tests/unit/test_diag.cpp deleted file mode 100644 index 0f8528749..000000000 --- a/tests/unit/test_diag.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (c) 2016, The OpenThread Authors. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#include -#include -#include -#include - -#include "utils/wrap_string.h" - -#include "openthread-system.h" -#include "test_util.h" - -extern "C" void otTaskletsSignalPending(otInstance *) -{ -} - -extern "C" bool otTaskletsArePending(otInstance *) -{ - return false; -} - -extern "C" void otPlatUartSendDone(void) -{ -} - -extern "C" void otPlatUartReceived(const uint8_t *aBuf, uint16_t aBufLength) -{ - (void)aBuf; - (void)aBufLength; -} - -extern "C" void otPlatAlarmMilliFired(otInstance *) -{ -} - -extern "C" void otPlatAlarmMicroFired(otInstance *) -{ -} - -extern "C" void otPlatRadioTxDone(otInstance *, otRadioFrame *aFrame, otRadioFrame *aAckFrame, otError aError) -{ - (void)aFrame; - (void)aAckFrame; - (void)aError; -} - -extern "C" void otPlatRadioReceiveDone(otInstance *, otRadioFrame *aFrame, otError aError) -{ - (void)aFrame; - (void)aError; -} - -extern "C" void otPlatRadioTxStarted(otInstance *, otRadioFrame *aFrame) -{ - (void)aFrame; -} - -extern "C" void otPlatRadioEnergyScanDone(otInstance *aInstance, int8_t aEnergyScanMaxRssi) -{ - (void)aInstance; - (void)aEnergyScanMaxRssi; -} - -/** - * Converts a given string replacing '\n', '\r', '\t', etc. with literal strings "\n", "\r", "\t", etc. to make it - * printable on console. - * - */ -const char *MakePrintable(const char *aString) -{ - static char printableString[256]; - - char *ptr = &printableString[0]; - - *ptr++ = '\"'; - - while ((*aString != 0) && (ptr < &printableString[sizeof(printableString) - 4])) - { - // We ensure that at least 4 characters are remaining in output, - // two for encoding the current char (in case it needs a backslash) - // and two for the ending `"` and null char. - - char c = *aString++; - bool addBackslash = true; - - switch (c) - { - case '\n': - c = 'n'; - break; - - case '\r': - c = 'r'; - break; - - case '\t': - c = 't'; - break; - - case '\"': - c = '\"'; - break; - - case '\'': - c = '\''; - break; - - case '\\': - break; - - default: - addBackslash = false; - break; - } - - if (addBackslash) - { - *ptr++ = '\\'; - } - - *ptr++ = c; - } - - *ptr++ = '\"'; - *ptr = 0; - - return printableString; -} - -void TestDiag(void) -{ - struct TestCommand - { - const char *mCommand; - const char *mExpectedOutput; - }; - - static const TestCommand tests[] = { - - { - "diag\n", - "diagnostics mode is disabled\r\n", - }, - { - "diag send 10 100\n", - "failed\r\nstatus 0xd\r\n", - }, - { - "diag start\n", - "start diagnostics mode\r\nstatus 0x00\r\n", - }, - { - "diag", - "diagnostics mode is enabled\r\n", - }, - { - "", - "diagnostics mode is enabled\r\n", - }, - { - "diag channel 10\n", - "failed\r\nstatus 0x7\r\n", - }, - { - "diag channel 11\n", - "set channel to 11\r\nstatus 0x00\r\n", - }, - { - "diag channel\n", - "channel: 11\r\n", - }, - { - "diag power -10\n", - "set tx power to -10 dBm\r\nstatus 0x00\r\n", - }, - { - "diag power\n", - "tx power: -10 dBm\r\n", - }, - { - "diag stats\n", - "received packets: 0\r\nsent packets: 0\r\nfirst received packet: rssi=0, lqi=0\r\n", - }, - { - "diag send 20 100\n", - "sending 0x14 packet(s), length 0x64\r\nstatus 0x00\r\n", - }, - { - " diag \t send \t 20\t100", // Check parsing of extra space chars between args - "sending 0x14 packet(s), length 0x64\r\nstatus 0x00\r\n", - }, - {"diag repeat 100 100\n", "sending packets of length 0x64 at the delay of 0x64 ms\r\nstatus 0x00\r\n"}, - { - "diag stop\n", - "received packets: 0\r\nsent packets: 0\r\nfirst received packet: rssi=0, lqi=0\r\n\nstop diagnostics " - "mode\r\nstatus 0x00\r\n", - }, - { - "diag", - "diagnostics mode is disabled\r\n", - }, - { - "diag 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32", - "failed: command string contains too many arguments\r\n", - }, - { - NULL, - NULL, - }}; - - // initialize platform layer -#if OPENTHREAD_ENABLE_POSIX_APP - char *argv[] = {(char *)"test_diag", getenv("RADIO_DEVICE"), (char *)"1"}; -#if OPENTHREAD_POSIX_VIRTUAL_TIME - char simulator[128]; - - sprintf(simulator, "%s/tests/scripts/thread-cert/simulator.py", getenv("top_srcdir")); - - if (0 == fork()) - { - prctl(PR_SET_PDEATHSIG, SIGHUP); - exit(execlp("python", "python", simulator, NULL)); - } - - setenv("NODE_ID", "1", 0); - sleep(2); -#endif // OPENTHREAD_POSIX_VIRTUAL_TIME -#else - char *argv[] = {(char *)"test_diag", (char *)"1"}; -#endif - otSysInit(sizeof(argv) / sizeof(char *), argv); - - // initialize diagnostics module - otDiagInit(NULL); - - VerifyOrQuit(!otDiagIsEnabled(), "diagnostics mode should be disabled as default\n"); - - for (const TestCommand *test = &tests[0]; test->mCommand != NULL; test++) - { - char output[OPENTHREAD_CONFIG_DIAG_OUTPUT_BUFFER_SIZE]; - - printf("\nCommand: %s", MakePrintable(test->mCommand)); - output[sizeof(output) - 1] = '\0'; - otDiagProcessCmdLine(test->mCommand, output, sizeof(output) - 1); - printf("\nOutput: %s\n", MakePrintable(output)); - - VerifyOrQuit(strcmp(output, test->mExpectedOutput) == 0, "diagnostics output does not match expected result\n"); - } -} - -#ifdef ENABLE_TEST_MAIN -int main(void) -{ - TestDiag(); - printf("\nAll tests passed\n"); - return 0; -} -#endif