From a142b4234cafec6aab01fd58d2b37d40e4288c1d Mon Sep 17 00:00:00 2001 From: Moandor Date: Thu, 21 May 2020 10:37:50 +0800 Subject: [PATCH] [test] add expect tests for extaddr, ping, promiscuous (#4954) --- .github/workflows/simulation.yml | 2 +- src/cli/cli.cpp | 7 +- src/cli/cli_commissioner.cpp | 8 +- src/cli/cli_dataset.cpp | 13 +- tests/scripts/expect/cli-extaddr.exp | 50 ++++++++ tests/scripts/expect/cli-log-level.exp | 7 +- tests/scripts/expect/cli-ping.exp | 120 ++++++++++++++++++ tests/scripts/expect/cli-promiscuous.exp | 46 +++++++ .../scripts/expect/posix-max-power-table.exp | 3 +- 9 files changed, 241 insertions(+), 15 deletions(-) create mode 100755 tests/scripts/expect/cli-extaddr.exp create mode 100755 tests/scripts/expect/cli-ping.exp create mode 100755 tests/scripts/expect/cli-promiscuous.exp diff --git a/.github/workflows/simulation.yml b/.github/workflows/simulation.yml index b9679e7de..c8c47123f 100644 --- a/.github/workflows/simulation.yml +++ b/.github/workflows/simulation.yml @@ -151,7 +151,7 @@ jobs: OT_OPTIONS=-DOT_READLINE=OFF sudo apt --no-install-recommends install -y expect ninja-build - name: Run run: | - ./script/test build expect + VIRTUAL_TIME=0 ./script/test build expect - name: Codecov uses: codecov/codecov-action@v1 - name: Run RCP Mode diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index a3de97554..880e05b71 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -1364,7 +1364,9 @@ void Interpreter::ProcessExtAddress(uint8_t aArgsLength, char *aArgs[]) { otExtAddress extAddress; - VerifyOrExit(Hex2Bin(aArgs[0], extAddress.m8, sizeof(otExtAddress)) >= 0, error = OT_ERROR_INVALID_ARGS); + memset(&extAddress, 0, sizeof(extAddress)); + VerifyOrExit(Hex2Bin(aArgs[0], extAddress.m8, sizeof(extAddress.m8)) == sizeof(extAddress.m8), + error = OT_ERROR_INVALID_ARGS); error = otLinkSetExtendedAddress(mInstance, &extAddress); } @@ -1439,7 +1441,8 @@ void Interpreter::ProcessExtPanId(uint8_t aArgsLength, char *aArgs[]) { otExtendedPanId extPanId; - VerifyOrExit(Hex2Bin(aArgs[0], extPanId.m8, sizeof(extPanId)) >= 0, error = OT_ERROR_INVALID_ARGS); + VerifyOrExit(Hex2Bin(aArgs[0], extPanId.m8, sizeof(extPanId)) == sizeof(extPanId), + error = OT_ERROR_INVALID_ARGS); error = otThreadSetExtendedPanId(mInstance, &extPanId); } diff --git a/src/cli/cli_commissioner.cpp b/src/cli/cli_commissioner.cpp index 226b7ef78..d11497350 100644 --- a/src/cli/cli_commissioner.cpp +++ b/src/cli/cli_commissioner.cpp @@ -191,7 +191,7 @@ otError Commissioner::ProcessMgmtGet(uint8_t aArgsLength, char *aArgs[]) value = static_cast(strlen(aArgs[index]) + 1) / 2; VerifyOrExit(static_cast(value) <= (sizeof(tlvs) - static_cast(length)), error = OT_ERROR_NO_BUFS); - VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs + length, static_cast(value)) >= 0, + VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs + length, static_cast(value)) == value, error = OT_ERROR_INVALID_ARGS); length += value; } @@ -243,8 +243,8 @@ otError Commissioner::ProcessMgmtSet(uint8_t aArgsLength, char *aArgs[]) dataset.mIsSteeringDataSet = true; length = static_cast((strlen(aArgs[index]) + 1) / 2); VerifyOrExit(static_cast(length) <= OT_STEERING_DATA_MAX_LENGTH, error = OT_ERROR_NO_BUFS); - VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], dataset.mSteeringData.m8, static_cast(length)) >= - 0, + VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], dataset.mSteeringData.m8, static_cast(length)) == + length, error = OT_ERROR_INVALID_ARGS); dataset.mSteeringData.mLength = static_cast(length); length = 0; @@ -261,7 +261,7 @@ otError Commissioner::ProcessMgmtSet(uint8_t aArgsLength, char *aArgs[]) VerifyOrExit(++index < aArgsLength, error = OT_ERROR_INVALID_ARGS); length = static_cast((strlen(aArgs[index]) + 1) / 2); VerifyOrExit(static_cast(length) <= sizeof(tlvs), error = OT_ERROR_NO_BUFS); - VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs, static_cast(length)) >= 0, + VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs, static_cast(length)) == length, error = OT_ERROR_INVALID_ARGS); } else diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp index 8c893efd0..0286c14d5 100644 --- a/src/cli/cli_dataset.cpp +++ b/src/cli/cli_dataset.cpp @@ -370,7 +370,8 @@ otError Dataset::ProcessExtPanId(uint8_t aArgsLength, char *aArgs[]) uint8_t extPanId[OT_EXT_PAN_ID_SIZE]; VerifyOrExit(aArgsLength > 0, error = OT_ERROR_INVALID_ARGS); - VerifyOrExit(Interpreter::Hex2Bin(aArgs[0], extPanId, sizeof(extPanId)) >= 0, error = OT_ERROR_INVALID_ARGS); + VerifyOrExit(Interpreter::Hex2Bin(aArgs[0], extPanId, sizeof(extPanId)) == sizeof(extPanId), + error = OT_ERROR_INVALID_ARGS); memcpy(sDataset.mExtendedPanId.m8, extPanId, sizeof(sDataset.mExtendedPanId)); sDataset.mComponents.mIsExtendedPanIdPresent = true; @@ -506,9 +507,9 @@ otError Dataset::ProcessMgmtSetCommand(uint8_t aArgsLength, char *aArgs[]) { VerifyOrExit(++index < aArgsLength, error = OT_ERROR_INVALID_ARGS); dataset.mComponents.mIsExtendedPanIdPresent = true; - VerifyOrExit( - Interpreter::Hex2Bin(aArgs[index], dataset.mExtendedPanId.m8, sizeof(dataset.mExtendedPanId.m8)) >= 0, - error = OT_ERROR_INVALID_ARGS); + VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], dataset.mExtendedPanId.m8, + sizeof(dataset.mExtendedPanId.m8)) == sizeof(dataset.mExtendedPanId.m8), + error = OT_ERROR_INVALID_ARGS); } else if (strcmp(aArgs[index], "localprefix") == 0) { @@ -550,7 +551,7 @@ otError Dataset::ProcessMgmtSetCommand(uint8_t aArgsLength, char *aArgs[]) VerifyOrExit(++index < aArgsLength, error = OT_ERROR_INVALID_ARGS); length = static_cast((strlen(aArgs[index]) + 1) / 2); VerifyOrExit(static_cast(length) <= sizeof(tlvs), error = OT_ERROR_NO_BUFS); - VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs, static_cast(length)) >= 0, + VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs, static_cast(length)) == length, error = OT_ERROR_INVALID_ARGS); } else @@ -638,7 +639,7 @@ otError Dataset::ProcessMgmtGetCommand(uint8_t aArgsLength, char *aArgs[]) value = static_cast(strlen(aArgs[index]) + 1) / 2; VerifyOrExit(static_cast(value) <= (sizeof(tlvs) - static_cast(length)), error = OT_ERROR_NO_BUFS); - VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs + length, static_cast(value)) >= 0, + VerifyOrExit(Interpreter::Hex2Bin(aArgs[index], tlvs + length, static_cast(value)) == value, error = OT_ERROR_INVALID_ARGS); length += value; } diff --git a/tests/scripts/expect/cli-extaddr.exp b/tests/scripts/expect/cli-extaddr.exp new file mode 100755 index 000000000..e33eace57 --- /dev/null +++ b/tests/scripts/expect/cli-extaddr.exp @@ -0,0 +1,50 @@ +#!/usr/bin/expect -f +# +# Copyright (c) 2020, 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. +# + +spawn $env(OT_COMMAND) 1 +set timeout 1 +expect_after { + timeout { exit 1 } +} +send "extaddr 99aabbccddeeff00\n" +expect "Done\r\n" +send "extaddr 99AABBCCDDEEFF00\n" +expect "Done\r\n" +send "extaddr\n" +expect "99aabbccddeeff00\r\n" +send "extaddr 1\n" +expect "Error 7: InvalidArgs\r\n" +send "extaddr 0123456789abcdef0\n" +expect "Error 7: InvalidArgs\r\n" +send "extaddr invalid\n" +expect "Error 7: InvalidArgs\r\n" +send "extaddr\n" +expect "99aabbccddeeff00\r\n" +send "\x04" +expect eof diff --git a/tests/scripts/expect/cli-log-level.exp b/tests/scripts/expect/cli-log-level.exp index cbd79fd3c..4075375bc 100755 --- a/tests/scripts/expect/cli-log-level.exp +++ b/tests/scripts/expect/cli-log-level.exp @@ -42,4 +42,9 @@ send "log level -1\n" expect "Error 7: InvalidArgs\r\n" send "log level 6\n" expect "Error 7: InvalidArgs\r\n" -send_user "\r\n" +send "log a\n" +expect "Error 7: InvalidArgs\r\n" +send "log level 1 2\n" +expect "Error 7: InvalidArgs\r\n" +send "\x04" +expect eof diff --git a/tests/scripts/expect/cli-ping.exp b/tests/scripts/expect/cli-ping.exp new file mode 100755 index 000000000..3715b1646 --- /dev/null +++ b/tests/scripts/expect/cli-ping.exp @@ -0,0 +1,120 @@ +#!/usr/bin/expect -f +# +# Copyright (c) 2020, 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. +# + +spawn $env(OT_COMMAND) 1 +set timeout 1 +expect_after { + timeout { exit 1 } +} +send "ping ::1 1 2 1 1\n" +expect "Done\r\n" +send "ping stop\n" +expect "Done\r\n" +send "ping ::1 1 2 1 1 1\n" +expect "Error 7: InvalidArgs\r\n" +send "\x04" +expect eof + + +proc wait_for {command expected} { + set result 0 + for {set i 0} {$i < 20} {incr i} { + send "$command\n" + expect { + -re $expected { + set result 1 + } + timeout { + # Do nothing + } + } + if {$result == 1} { + break + } + } + if {$result == 0} { + exit 1 + } +} + +spawn $env(OT_COMMAND) 1 +set spawn_1 $spawn_id +expect_after { + timeout { exit 1 } +} +spawn $env(OT_COMMAND) 2 +set spawn_2 $spawn_id +expect_after { + timeout { exit 1 } +} +set psk "J01NME" + +set spawn_id $spawn_2 +send "eui64\n" +expect -re "(\[0-9a-f\]{16})" +set eui64 $expect_out(1,string) + +set spawn_id $spawn_1 +send "dataset init new\n" +expect "Done" +send "dataset commit active\n" +expect "Done" +send "ifconfig up\n" +expect "Done" +send "thread start\n" +expect "Done" +wait_for "state" "leader" +send "commissioner start\n" +expect "Done" +expect "Commissioner: active" +send "commissioner joiner add $eui64 $psk\n" +expect "Done" + +set spawn_id $spawn_2 +send "ifconfig up\n" +expect "Done" +send "joiner start $psk\n" +expect "Done" +wait_for "" "Join success" +send "thread start\n" +expect "Done" +wait_for "state" "child|router" +send "ipaddr\n" +expect -re "((\[0-9a-fA-F\]{1,4}:){7,7}\[0-9a-fA-F\]{1,4})" +set addr $expect_out(1,string) + +set spawn_id $spawn_1 +send "ping $addr\n" +expect "16 bytes from $addr:" +send "\x04" +expect eof + +set spawn_id $spawn_2 +send "\x04" +expect eof diff --git a/tests/scripts/expect/cli-promiscuous.exp b/tests/scripts/expect/cli-promiscuous.exp new file mode 100755 index 000000000..d49054b4d --- /dev/null +++ b/tests/scripts/expect/cli-promiscuous.exp @@ -0,0 +1,46 @@ +#!/usr/bin/expect -f +# +# Copyright (c) 2020, 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. +# + +spawn $env(OT_COMMAND) 1 +set timeout 1 +expect_after { + timeout { exit 1 } +} +send "promiscuous\n" +expect "Disabled\r\nDone\r\n" +send "promiscuous enable\n" +expect "Done\r\n" +send "promiscuous\n" +expect "Enabled\r\nDone\r\n" +send "promiscuous disable\n" +expect "Done\r\n" +send "promiscuous a\n" +expect "Error 7: InvalidArgs\r\n" +send "\x04" +expect eof diff --git a/tests/scripts/expect/posix-max-power-table.exp b/tests/scripts/expect/posix-max-power-table.exp index 17deffaf2..c06bbb22e 100755 --- a/tests/scripts/expect/posix-max-power-table.exp +++ b/tests/scripts/expect/posix-max-power-table.exp @@ -53,4 +53,5 @@ expect "Done" send "channel preferred\n" expect "0x7fff800" expect "Done" -send_user "\r\n" +send "\x04" +expect eof