From fbacefe85c3a75d1a40a49bb2ac27cbc9d0cbda5 Mon Sep 17 00:00:00 2001 From: Moandor Date: Fri, 3 Jul 2020 06:40:18 +0800 Subject: [PATCH] [test] add expect tests for coap and coaps (#5172) Also adds command coaps set to make it consistent with coap set. --- .github/workflows/simulation.yml | 3 + src/cli/README_COAPS.md | 11 +++ src/cli/cli_coap.cpp | 8 +- src/cli/cli_coap_secure.cpp | 34 +++++++-- src/cli/cli_coap_secure.hpp | 2 + tests/scripts/expect/cli-coap.exp | 114 ++++++++++++++++++++++++++++ tests/scripts/expect/cli-coaps.exp | 116 +++++++++++++++++++++++++++++ tests/scripts/expect/cli-ping.exp | 3 +- 8 files changed, 281 insertions(+), 10 deletions(-) create mode 100755 tests/scripts/expect/cli-coap.exp create mode 100755 tests/scripts/expect/cli-coaps.exp diff --git a/.github/workflows/simulation.yml b/.github/workflows/simulation.yml index 44a3be0b5..1c95ca3d1 100644 --- a/.github/workflows/simulation.yml +++ b/.github/workflows/simulation.yml @@ -172,6 +172,9 @@ jobs: expects: runs-on: ubuntu-18.04 + env: + CFLAGS: -DCLI_COAP_SECURE_USE_COAP_DEFAULT_HANDLER=1 + CXXFLAGS: -DCLI_COAP_SECURE_USE_COAP_DEFAULT_HANDLER=1 steps: - uses: actions/checkout@v2 - name: Bootstrap diff --git a/src/cli/README_COAPS.md b/src/cli/README_COAPS.md index 34c9b23f5..2d31feeb2 100644 --- a/src/cli/README_COAPS.md +++ b/src/cli/README_COAPS.md @@ -100,6 +100,7 @@ coaps response sent - [psk](#psk-psk-pskid) - [put](#put-uri-path-type-payload) - [resource](#resource-uri-path) +- [set](#set-new-content) - [start](#start) - [stop](#stop) - [x509](#x509) @@ -119,6 +120,7 @@ post psk put resource +set start stop x509 @@ -214,6 +216,15 @@ test-resource Done ``` +### set \[new-content\] + +Sets the content sent by the test resource. + +```bash +> coaps set Testing123 +Done +``` + ### start Starts the application coaps service. diff --git a/src/cli/cli_coap.cpp b/src/cli/cli_coap.cpp index 635067c2e..89a9f0414 100644 --- a/src/cli/cli_coap.cpp +++ b/src/cli/cli_coap.cpp @@ -83,7 +83,8 @@ Coap::Coap(Interpreter &aInterpreter) memset(&mRequestUri, 0, sizeof(mRequestUri)); #endif memset(&mUriPath, 0, sizeof(mUriPath)); - strncpy(mResourceContent, "0", sizeof(mResourceContent) - 1); + strncpy(mResourceContent, "0", sizeof(mResourceContent)); + mResourceContent[sizeof(mResourceContent) - 1] = '\0'; } #if OPENTHREAD_CONFIG_COAP_OBSERVE_API_ENABLE @@ -214,8 +215,9 @@ otError Coap::ProcessSet(uint8_t aArgsLength, char *aArgs[]) if (aArgsLength > 1) { - VerifyOrExit(strlen(aArgs[1]) < (kMaxBufferSize - 1), error = OT_ERROR_INVALID_ARGS); - strncpy(mResourceContent, aArgs[1], sizeof(mResourceContent) - 1); + VerifyOrExit(strlen(aArgs[1]) < sizeof(mResourceContent), error = OT_ERROR_INVALID_ARGS); + strncpy(mResourceContent, aArgs[1], sizeof(mResourceContent)); + mResourceContent[sizeof(mResourceContent) - 1] = '\0'; #if OPENTHREAD_CONFIG_COAP_OBSERVE_API_ENABLE if (mSubscriberTokenLength > 0) diff --git a/src/cli/cli_coap_secure.cpp b/src/cli/cli_coap_secure.cpp index 1fe87c471..0787a0d65 100644 --- a/src/cli/cli_coap_secure.cpp +++ b/src/cli/cli_coap_secure.cpp @@ -51,7 +51,8 @@ const struct CoapSecure::Command CoapSecure::sCommands[] = { {"delete", &CoapSecure::ProcessRequest}, {"disconnect", &CoapSecure::ProcessDisconnect}, {"get", &CoapSecure::ProcessRequest}, {"post", &CoapSecure::ProcessRequest}, {"put", &CoapSecure::ProcessRequest}, {"resource", &CoapSecure::ProcessResource}, - {"start", &CoapSecure::ProcessStart}, {"stop", &CoapSecure::ProcessStop}, + {"set", &CoapSecure::ProcessSet}, {"start", &CoapSecure::ProcessStart}, + {"stop", &CoapSecure::ProcessStop}, #ifdef MBEDTLS_KEY_EXCHANGE_PSK_ENABLED {"psk", &CoapSecure::ProcessPsk}, #endif @@ -70,6 +71,8 @@ CoapSecure::CoapSecure(Interpreter &aInterpreter) memset(&mResource, 0, sizeof(mResource)); memset(&mPsk, 0, sizeof(mPsk)); memset(&mPskId, 0, sizeof(mPskId)); + strncpy(mResourceContent, "0", sizeof(mResourceContent)); + mResourceContent[sizeof(mResourceContent) - 1] = '\0'; } void CoapSecure::PrintPayload(otMessage *aMessage) const @@ -135,6 +138,25 @@ exit: return error; } +otError CoapSecure::ProcessSet(uint8_t aArgsLength, char *aArgs[]) +{ + otError error = OT_ERROR_NONE; + + if (aArgsLength > 1) + { + VerifyOrExit(strlen(aArgs[1]) < sizeof(mResourceContent), error = OT_ERROR_INVALID_ARGS); + strncpy(mResourceContent, aArgs[1], sizeof(mResourceContent)); + mResourceContent[sizeof(mResourceContent) - 1] = '\0'; + } + else + { + mInterpreter.mServer->OutputFormat("%s\r\n", mResourceContent); + } + +exit: + return error; +} + otError CoapSecure::ProcessStart(uint8_t aArgsLength, char *aArgs[]) { otError error; @@ -447,10 +469,9 @@ void CoapSecure::HandleRequest(void *aContext, otMessage *aMessage, const otMess void CoapSecure::HandleRequest(otMessage *aMessage, const otMessageInfo *aMessageInfo) { - otError error = OT_ERROR_NONE; - otMessage *responseMessage = nullptr; - otCoapCode responseCode = OT_COAP_CODE_EMPTY; - char responseContent[] = "helloWorld"; + otError error = OT_ERROR_NONE; + otMessage *responseMessage = nullptr; + otCoapCode responseCode = OT_COAP_CODE_EMPTY; mInterpreter.mServer->OutputFormat("coaps request from "); mInterpreter.OutputIp6Address(aMessageInfo->mPeerAddr); @@ -506,7 +527,8 @@ void CoapSecure::HandleRequest(otMessage *aMessage, const otMessageInfo *aMessag if (otCoapMessageGetCode(aMessage) == OT_COAP_CODE_GET) { - SuccessOrExit(error = otMessageAppend(responseMessage, &responseContent, sizeof(responseContent))); + SuccessOrExit(error = otMessageAppend(responseMessage, &mResourceContent, + static_cast(strlen(mResourceContent)))); } SuccessOrExit(error = otCoapSecureSendResponse(mInterpreter.mInstance, responseMessage, aMessageInfo)); diff --git a/src/cli/cli_coap_secure.hpp b/src/cli/cli_coap_secure.hpp index 660c79f21..e81e24f02 100644 --- a/src/cli/cli_coap_secure.hpp +++ b/src/cli/cli_coap_secure.hpp @@ -97,6 +97,7 @@ private: otError ProcessPsk(uint8_t aArgsLength, char *aArgs[]); otError ProcessRequest(uint8_t aArgsLength, char *aArgs[]); otError ProcessResource(uint8_t aArgsLength, char *aArgs[]); + otError ProcessSet(uint8_t aArgsLength, char *aArgs[]); otError ProcessStart(uint8_t aArgsLength, char *aArgs[]); otError ProcessStop(uint8_t aArgsLength, char *aArgs[]); otError ProcessX509(uint8_t aArgsLength, char *aArgs[]); @@ -122,6 +123,7 @@ private: otCoapResource mResource; char mUriPath[kMaxUriLength]; + char mResourceContent[kMaxBufferSize]; bool mShutdownFlag; bool mUseCertificate; diff --git a/tests/scripts/expect/cli-coap.exp b/tests/scripts/expect/cli-coap.exp new file mode 100755 index 000000000..cbd4ffa9f --- /dev/null +++ b/tests/scripts/expect/cli-coap.exp @@ -0,0 +1,114 @@ +#!/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. +# + +source "tests/scripts/expect/_multinode.exp" + +set timeout 3 +setup_nodes + +set spawn_id $spawn_1 +send "coap start\n" +expect "Done" +send "coap resource test/resource\n" +expect "Done" +send "coap set Testing123\n" +expect "Done" +send "ipaddr mleid\n" +expect "ipaddr mleid" +expect -re {(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})} +set addr_1 $expect_out(1,string) +expect "Done" + +set spawn_id $spawn_2 +send "coap start\n" +expect "Done" +send "coap parameters request 3000 4 3 5\n" +expect "Transmission parameters for request:" +expect "ACK_TIMEOUT=3000 ms, ACK_RANDOM_FACTOR=4/3, MAX_RETRANSMIT=5" +expect "Done" +send "coap parameters response 2500 4 3 3\n" +expect "Transmission parameters for response:" +expect "ACK_TIMEOUT=2500 ms, ACK_RANDOM_FACTOR=4/3, MAX_RETRANSMIT=3" +expect "Done" +send "coap get $addr_1 test/resource\n" +expect "Done" +expect "coap response from $addr_1 with payload: 54657374696e67313233" # ASCII of "Testing123" +send "coap post $addr_1 test/resource con Testing123\n" +expect "Done" +expect "coap response from $addr_1" +send "coap put $addr_1 test/resource con Testing123\n" +expect "Done" +expect "coap response from $addr_1" +send "coap delete $addr_1 test/resource con\n" +expect "Done" +expect "coap response from $addr_1" +send "coap post $addr_1 test/resource none Testing123\n" +expect "Done" +send "ipaddr mleid\n" +expect "ipaddr mleid" +expect -re {(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})} +set addr_2 $expect_out(1,string) +expect "Done" + +set spawn_id $spawn_1 +expect "coap request from $addr_2 GET" +expect "coap response sent" +expect "coap request from $addr_2 POST with payload: 54657374696e67313233" +expect "coap response sent" +expect "coap request from $addr_2 PUT with payload: 54657374696e67313233" +expect "coap response sent" +expect "coap request from $addr_2 DELETE" +expect "coap response sent" +expect "coap request from $addr_2 POST with payload: 54657374696e67313233" +send "coap resource\n" +expect "test/resource" +expect "Done" +send "coap set\n" +expect "Testing123" +expect "Done" +send "coap parameters request default\n" +expect "Transmission parameters for request:" +expect "default" +expect "Done" +send "coap parameters response default\n" +expect "Transmission parameters for response:" +expect "default" +expect "Done" +send "coap help\n" +expect "Done" +send "coap parameters something_invalid\n" +expect "Error 7: InvalidArgs" +send "coap get\n" +expect "Error 7: InvalidArgs" +send "coap get $addr_2\n" +expect "Error 7: InvalidArgs" +send "coap\n" +expect "Error 7: InvalidArgs" + +dispose_nodes diff --git a/tests/scripts/expect/cli-coaps.exp b/tests/scripts/expect/cli-coaps.exp new file mode 100755 index 000000000..5c190a21b --- /dev/null +++ b/tests/scripts/expect/cli-coaps.exp @@ -0,0 +1,116 @@ +#!/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. +# + +source "tests/scripts/expect/_multinode.exp" + +set timeout 3 +setup_nodes + +set spawn_id $spawn_1 +send "coaps x509\n" +expect "Done" +send "coaps start\n" +expect "Done" +send "coaps resource test/resource\n" +expect "Done" +send "coaps set Testing123\n" +expect "Done" +send "ipaddr mleid\n" +expect "ipaddr mleid" +expect -re {(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})} +set addr_1 $expect_out(1,string) +expect "Done" + +set spawn_id $spawn_2 +send "coaps x509\n" +expect "Done" +send "coaps start\n" +expect "Done" +send "coaps connect $addr_1 5684\n" +expect "Done" +expect "coaps connected" +send "coaps get $addr_1 test/resource\n" +expect "Done" +expect "coaps response from $addr_1 with payload: 54657374696e67313233" # ASCII of "Testing123" +send "coaps post $addr_1 test/resource con Testing123\n" +expect "Done" +expect "coaps response from $addr_1" +send "coaps put $addr_1 test/resource con Testing123\n" +expect "Done" +expect "coaps response from $addr_1" +send "coaps delete $addr_1 test/resource con\n" +expect "Done" +expect "coaps response from $addr_1" +send "coaps post $addr_1 test/resource none Testing123\n" +expect "Done" +send "coaps get $addr_1 default\n" +expect "Done" +expect "coaps response from $addr_1" +send "ipaddr mleid\n" +expect "ipaddr mleid" +expect -re {(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})} +set addr_2 $expect_out(1,string) +expect "Done" + +set spawn_id $spawn_1 +expect "coaps request from $addr_2 GET" +expect "coaps response sent" +expect "coaps request from $addr_2 POST with payload: 54657374696e67313233" +expect "coaps response sent" +expect "coaps request from $addr_2 PUT with payload: 54657374696e67313233" +expect "coaps response sent" +expect "coaps request from $addr_2 DELETE" +expect "coaps response sent" +expect "coaps request from $addr_2 POST with payload: 54657374696e67313233" +send "coaps resource\n" +expect "test/resource" +expect "Done" +send "coaps set\n" +expect "Testing123" +expect "Done" +send "coaps help\n" +expect "Done" +send "coaps get\n" +expect "Error 7: InvalidArgs" +send "coaps\n" +expect "Error 7: InvalidArgs" +send "coaps start false\n" +expect "Error 24: Already" +send "coaps start something_invalid\n" +expect "Error 7: InvalidArgs" + +set spawn_id $spawn_2 +send "coaps stop\n" +expect "Done" + +set spawn_id $spawn_1 +send "coaps stop\n" +expect "Done" + +dispose_nodes diff --git a/tests/scripts/expect/cli-ping.exp b/tests/scripts/expect/cli-ping.exp index 53271d294..ce5378f42 100755 --- a/tests/scripts/expect/cli-ping.exp +++ b/tests/scripts/expect/cli-ping.exp @@ -53,7 +53,8 @@ dispose setup_nodes set spawn_id $spawn_2 -send "ipaddr\n" +send "ipaddr mleid\n" +expect "ipaddr mleid" expect -re {(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})} set addr $expect_out(1,string) expect "Done"