net: scripts: Make test runner script fully generic

Move actual test cases from the run-sample-tests.sh script to
the network samples directory that are supported by Docker based
testing. Each network sample directory that supports Docker testing,
will contain docker-test.sh script that is sourced by the runner
script. The docker-test.sh script will run the test as needed and
then return return value to the runner script.

Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
Jukka Rissanen 2020-11-17 17:20:08 +02:00 committed by Jukka Rissanen
commit d1901d6a2f
10 changed files with 341 additions and 216 deletions

View file

@ -0,0 +1,30 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
# Running gPTP sample using Docker testing
start_configuration || return $?
start_docker \
"/usr/local/sbin/ptp4l -2 -f /etc/gptp.cfg -m -q -l 6 -S -i eth0" \
|| return $?
# For native_posix gPTP run, the delay threshold needs to be huge
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_RUN_DURATION=10" \
"-DCONFIG_NET_GPTP_NEIGHBOR_PROP_DELAY_THR=12000000"
wait_zephyr
gptp_result=$?
if [ $gptp_result -eq 1 -o $gptp_result -eq 2 ]; then
result=0
else
result=1
fi
stop_docker

View file

@ -0,0 +1,57 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
echo "Starting MQTT test"
start_configuration || return $?
start_docker \
"/usr/local/sbin/mosquitto -v -c /usr/local/etc/mosquitto/mosquitto.conf" || return $?
start_zephyr -DOVERLAY_CONFIG=overlay-sample.conf "$overlay"
wait_zephyr
result=$?
if [ $result -ne 0 ]; then
return $result
fi
stop_docker
# test TLS
echo "Starting MQTT TLS test"
start_docker \
"/usr/local/sbin/mosquitto -v -c /usr/local/etc/mosquitto/mosquitto-tls.conf" || return $?
start_zephyr -DOVERLAY_CONFIG="overlay-tls.conf overlay-sample.conf" "$overlay"
wait_zephyr
result=$?
if [ $result -ne 0 ]; then
return $result
fi
stop_docker
return $result
# FIXME: proxy test does not work as expected
# TLS and SOCKS5, mosquitto TLS is already running
echo "Starting MQTT TLS + proxy test"
start_docker "/usr/sbin/danted" || return $?
start_zephyr -DOVERLAY_CONFIG="overlay-tls.conf overlay-sample.conf overlay-socks5.conf" "$overlay" || return $?
wait_zephyr
result=$?
stop_docker

View file

@ -0,0 +1,19 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
start_configuration || return $?
start_zephyr
start_docker "/net-tools/libcoap/examples/etsi_coaptest.sh -i eth0 192.0.2.1" \
|| return $?
wait $docker_pid
result=$?
stop_docker
stop_zephyr

View file

@ -0,0 +1,64 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
# First the non-tls version
start_configuration || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SERVE_LARGE_FILE=y" || return $?
start_docker "/usr/local/bin/http-get-file-test.sh 5" || return $?
wait_docker
docker_result=$?
# curl timeout is return code 28. If we get that, zephyr will never
# return so we can just kill it here
if [ $docker_result -eq 28 ]; then
stop_zephyr
result=1
else
sleep 1
wait_zephyr
result=$?
fi
stop_docker
stop_zephyr
if [ $result -ne 0 ] || [ $docker_result -ne 0 ]; then
return $result
fi
# Then the TLS version
if [ -n "$zephyr_overlay" ]; then
overlay="${zephyr_overlay};overlay-tls.conf"
else
overlay="-DOVERLAY_CONFIG=overlay-tls.conf"
fi
start_configuration || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SERVE_LARGE_FILE=y" || return $?
start_docker "/usr/local/bin/https-get-file-test.sh 5" || return $?
wait_docker
docker_result=$?
# curl timeout is return code 28. If we get that, zephyr will never
# return so we can just kill it here
if [ $docker_result -eq 28 ]; then
stop_zephyr
result=1
else
sleep 1
wait_zephyr
result=$?
fi
stop_docker
stop_zephyr
if [ $result -ne 0 ] || [ $docker_result -ne 0 ]; then
return $result
fi

View file

@ -0,0 +1,18 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
start_configuration "--ip=192.0.2.1 --ip6=2001:db8::1" || return $?
start_docker "/net-tools/echo-server -i eth0" || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SEND_ITERATIONS=10"
wait_zephyr
result=$?
stop_docker

View file

@ -0,0 +1,21 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
start_configuration || return $?
start_zephyr "$overlay" || return $?
start_docker "/net-tools/echo-client -i eth0 192.0.2.1" \
"/net-tools/echo-client -i eth0 2001:db8::1" \
"/net-tools/echo-client -i eth0 192.0.2.1 -t" \
"/net-tools/echo-client -i eth0 2001:db8::1 -t"
wait_docker
result=$?
stop_zephyr

View file

@ -0,0 +1,40 @@
# Copyright (c) 2020 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
if [ -z "$RUNNING_FROM_MAIN_SCRIPT" ]; then
echo "Do not run this script directly!"
echo "Run $ZEPHYR_BASE/scripts/net/run-sample-tests.sh instead."
exit 1
fi
# First the non-tls version
echo "HTTP client test"
start_configuration "--ip=192.0.2.2 --ip6=2001:db8::2" || return $?
start_docker "/usr/local/bin/http-server.py" || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SEND_ITERATIONS=5"
wait_zephyr
result=$?
stop_docker
if [ $result -ne 0 ]; then
return $result
fi
return $result
# If everything is ok so far, do the TLS version
echo "HTTPS client test"
if [ -n "$zephyr_overlay" ]; then
overlay="${zephyr_overlay};overlay-tls.conf"
else
overlay="-DOVERLAY_CONFIG=overlay-tls.conf"
fi
start_configuration "--ip=192.0.2.2 --ip6=2001:db8::2" || return $?
start_docker "/usr/local/bin/https-server.py 192.0.2.2" \
"/usr/local/bin/https-server.py 2001:db8::2" || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SEND_ITERATIONS=5"
wait_zephyr
result=$?
stop_docker

View file

@ -1,5 +1,5 @@
The shell script run-sample-tests.sh runs a few Zephyr samples against the The shell script run-sample-tests.sh runs selected Zephyr samples against
network test applications container provided by the 'net-tools' the network test applications Docker container provided by the 'net-tools'
Zephyr project, https://github.com/zephyrproject-rtos/net-tools. Zephyr project, https://github.com/zephyrproject-rtos/net-tools.
@ -10,6 +10,7 @@ As a prerequisite it is assumed that Docker is installed and that the
'net-tools' Docker container has been created, see the first bullet point 'net-tools' Docker container has been created, see the first bullet point
at the net-tools Docker README file at the net-tools Docker README file
https://github.com/zephyrproject-rtos/net-tools/blob/master/README.docker. https://github.com/zephyrproject-rtos/net-tools/blob/master/README.docker.
In essence, the following needs to be done: In essence, the following needs to be done:
* Install Docker * Install Docker
@ -25,28 +26,33 @@ its counterpart when testing various network sample applications.
Using Using
***** *****
The scripts/net/run-sample-tests.sh shell script is meant to be run from a The scripts/net/run-sample-tests.sh shell script can be used in two ways:
Zephyr network sample test directory. Currently the following samples are
supported:
* samples/net/sockets/echo_client 1. From a Zephyr network sample test directory.
* samples/net/sockets/echo_server Example:
* samples/net/mqtt_publisher
The applications to run in the net-tools Docker container are selected based cd samples/net/gptp
on the base name of the sample directory, for echo_client the echo_server $ZEPHYR_BASE/scripts/net/run-sample-tests.sh
application is started from the Docker container, and with echo_server
echo_client is started in the Docker container. With mqtt_publisher mosquitto 2. By giving the test directories as parameters to the runner script.
MQTT server is run in the Docker container. Example:
cd $ZEPHYR_BASE
./scripts/net/run-sample-tests.sh samples/net/gptp \
samples/net/sockets/echo_server
User can see what samples are supported like this:
$ZEPHYR_BASE/scripts/net/run-sample-tests.sh --scan
The Docker container and a corresponding 'net-tools0' Docker network is started The Docker container and a corresponding 'net-tools0' Docker network is started
by the script, as well as Zephyr using native_posix. IP addresses are assigned by the script, as well as Zephyr using native_posix board. IP addresses are
to the Docker network, which is a Linux network bridge interface. The default assigned to the Docker network, which is a Linux network bridge interface.
IP addresses are: The default IP addresses are:
* Zephyr uses addresses 192.0.2.1 and 2001:db8::1 * Zephyr uses addresses 192.0.2.1 and 2001:db8::1
* Docker net-tools image uses addresses 192.0.2.2 and 2001:db8::2 * Docker net-tools image uses addresses 192.0.2.2 and 2001:db8::2
* the Docker bridge interface uses addresses 192.0.2.254 and 2001:db8::254 * The Docker bridge interface uses addresses 192.0.2.254 and 2001:db8::254
The default IP addresses are used by echo_client and mqtt_publisher, but The default IP addresses are used by echo_client and mqtt_publisher, but
with the echo_server the IP addresses are switched between Zephyr and Docker with the echo_server the IP addresses are switched between Zephyr and Docker

View file

@ -9,8 +9,12 @@ zephyr_pid=0
docker_pid=0 docker_pid=0
configuration="" configuration=""
result=0 result=0
sample="" dirs=""
zephyr_overlay="" zephyr_overlay=""
docker_test_script_name=docker-test.sh
scan_dirs=0
RUNNING_FROM_MAIN_SCRIPT=1
check_dirs () check_dirs ()
{ {
@ -63,6 +67,15 @@ check_dirs ()
return 0 return 0
} }
scan_dirs ()
{
echo
echo "Following directories under $ZEPHYR_BASE can be used by this script:"
find "$ZEPHYR_BASE" -type f -name $docker_test_script_name | \
awk -F "$ZEPHYR_BASE/" '{ print $2 }' | \
sed "s/\/$docker_test_script_name//"
}
start_configuration () start_configuration ()
{ {
local bridge_interface="" local bridge_interface=""
@ -176,7 +189,7 @@ stop_zephyr ()
local zephyrs="$zephyr_pid $(list_children "$zephyr_pid")" local zephyrs="$zephyr_pid $(list_children "$zephyr_pid")"
echo "Stopping Zephyr PIDs $zephyrs" echo "Stopping Zephyr PIDs $zephyrs"
kill $zephyrs kill $zephyrs 2> /dev/null
fi fi
zephyr_pid=0 zephyr_pid=0
@ -222,7 +235,7 @@ stop_docker ()
local dockers="$docker_pid $(list_children "$docker_pid")" local dockers="$docker_pid $(list_children "$docker_pid")"
echo "Stopping Docker PIDs $dockers" echo "Stopping Docker PIDs $dockers"
kill $dockers kill $dockers 2> /dev/null
fi fi
docker_pid=0 docker_pid=0
@ -242,199 +255,18 @@ wait_docker ()
return $result return $result
} }
docker_exec () run_test ()
{ {
local test="$(basename $(pwd))"
local result=0 local result=0
local docker_result=0
local overlay="" local overlay=""
if [ -n "$zephyr_overlay" ]; then if [ -n "$zephyr_overlay" ]; then
overlay="-DOVERLAY_CONFIG=$zephyr_overlay" overlay="-DOVERLAY_CONFIG=$zephyr_overlay"
fi fi
case "$1" in
echo_server)
start_configuration || return $?
start_zephyr "$overlay" || return $?
start_docker \
"/net-tools/echo-client -i eth0 192.0.2.1" \
"/net-tools/echo-client -i eth0 2001:db8::1" \
"/net-tools/echo-client -i eth0 192.0.2.1 -t" \
"/net-tools/echo-client -i eth0 2001:db8::1 -t"
wait_docker
result=$?
stop_zephyr
;;
echo_client)
start_configuration "--ip=192.0.2.1 --ip6=2001:db8::1" || return $?
start_docker "/net-tools/echo-server -i eth0" || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SEND_ITERATIONS=10"
wait_zephyr
result=$?
stop_docker
;;
http_client)
# First the non-tls version
start_configuration "--ip=192.0.2.2 --ip6=2001:db8::2" || return $?
start_docker "/usr/local/bin/http-server.py" || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SEND_ITERATIONS=5"
wait_zephyr
result=$?
stop_docker
if [ $result -ne 0 ]; then
break;
fi
# If everything is ok so far, do the TLS version
if [ -n "$zephyr_overlay" ]; then
overlay="${zephyr_overlay};overlay-tls.conf"
else
overlay="-DOVERLAY_CONFIG=overlay-tls.conf"
fi
start_configuration "--ip=192.0.2.2 --ip6=2001:db8::2" || return $?
start_docker "/usr/local/bin/https-server.py" || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SEND_ITERATIONS=5"
wait_zephyr
result=$?
stop_docker
;;
coap_server)
start_configuration || return $?
start_zephyr
start_docker "/net-tools/libcoap/examples/etsi_coaptest.sh \
-i eth0 192.0.2.1" || return $?
wait $docker_pid
result=$?
stop_zephyr
;;
dumb_http_server_mt)
# First the non-tls version
start_configuration || return $?
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_SERVE_LARGE_FILE=y" || return $?
start_docker "/usr/local/bin/http-get-file-test.sh 5" || return $?
wait_docker
docker_result=$?
# curl timeout is return code 28. If we get that, zephyr will never
# return so we can just kill it here
if [ $docker_result -eq 28 ]; then
stop_zephyr
result=1
else
sleep 1
wait_zephyr
result=$?
fi
stop_docker
if [ $result -ne 0 ] || [ $docker_result -ne 0 ]; then
break;
fi
;;
mqtt_publisher)
start_configuration || return $?
start_docker "/usr/local/sbin/mosquitto -v
-c /usr/local/etc/mosquitto/mosquitto.conf" || \
return $?
start_zephyr -DOVERLAY_CONFIG=overlay-sample.conf "$overlay"
wait_zephyr
result=$?
if [ $result -ne 0 ]; then
break
fi
# test TLS
start_docker "/usr/local/sbin/mosquitto -v
-c /usr/local/etc/mosquitto/mosquitto-tls.conf" || \
return $?
start_zephyr -DOVERLAY_CONFIG="overlay-tls.conf overlay-sample.conf" \
"$overlay"
wait_zephyr
result=$?
if [ $result -ne 0 ]; then
break
fi
# TLS and SOCKS5, mosquitto TLS is already running
start_docker "/usr/sbin/danted" || return $?
start_zephyr \
-DOVERLAY_CONFIG="overlay-tls.conf overlay-sample.conf " \
"overlay-socks5.conf" \
"$overlay" || return $?
wait_zephyr
result=$?
stop_docker
return $result
;;
gptp)
start_configuration || return $?
start_docker \
"/usr/local/sbin/ptp4l -2 -f /etc/gptp.cfg -m -q -l 6 -S -i eth0" \
|| return $?
# For native_posix gPTP run, the delay threshold needs to be huge
start_zephyr "$overlay" "-DCONFIG_NET_SAMPLE_RUN_DURATION=10" \
"-DCONFIG_NET_GPTP_NEIGHBOR_PROP_DELAY_THR=12000000"
wait_zephyr
gptp_result=$?
if [ $gptp_result -eq 1 -o $gptp_result -eq 2 ]; then
result=0
else
result=1
fi
stop_docker
;;
*)
echo "No sample test corresponding to directory '$1' found" >&2
return 1
;;
esac
return $result
}
run_test ()
{
local test="$(basename $(pwd))"
local result=0
if [ -n "$1" ]; then
source "$1" source "$1"
result=$? result=$?
else
docker_exec "$test"
result=$?
fi
if [ $result -eq 0 ]; then if [ $result -eq 0 ]; then
echo "Sample '$test' successful" echo "Sample '$test' successful"
@ -451,7 +283,7 @@ usage ()
cat <<EOF cat <<EOF
$BASENAME [-Z <zephyr base directory>] [-N <net-tools base directory>] [<test script>] $BASENAME [-Z <zephyr base directory>] [-N <net-tools base directory>] [<list of test directories>]
This script runs Zephyr sample tests using Docker container and This script runs Zephyr sample tests using Docker container and
network implemented by the 'net-tools' subproject. network implemented by the 'net-tools' subproject.
@ -468,8 +300,10 @@ network implemented by the 'net-tools' subproject.
keep Docker container and network after test keep Docker container and network after test
--overlay <config files> --overlay <config files>
additional configuration/overlay files for the Zephyr build process additional configuration/overlay files for the Zephyr build process
<test script> --scan
sample script to run instead of test based on current directory find out the directories that can be used for this testing
<list of test directories>
run the tests in these directories instead of current directory
The automatically detected directories are: The automatically detected directories are:
EOF EOF
@ -532,17 +366,16 @@ do
fi fi
;; ;;
--scan)
scan_dirs=1
;;
-*) -*)
echo "Argument '$1' not recognised" >&2 echo "Argument '$1' not recognised" >&2
usage usage
return 0 return 0
;; ;;
*) *)
if [ -n "$sample" ]; then dirs="$dirs $1"
echo "Sample already specified" >&2
return 1
fi
sample="$1"
;; ;;
esac esac
@ -551,14 +384,51 @@ done
check_dirs || exit $? check_dirs || exit $?
if [ $scan_dirs -eq 1 ]; then
scan_dirs
exit 0
fi
if [ -z "$configuration" -o "$configuration" = "start_only" -o \ if [ -z "$configuration" -o "$configuration" = "start_only" -o \
"$configuration" = "keep" ]; then "$configuration" = "keep" ]; then
if [ "$configuration" = start_only ]; then if [ "$configuration" = start_only ]; then
start_configuration start_configuration
result=$? result=$?
else else
run_test "$sample" result=0
result=$? found=0
if [ -z "$dirs" ]; then
dirs="."
fi
for d in $dirs; do
if [ ! -d "$d" ]; then
echo "No such directory $d, skipping it"
continue
fi
if [ ! -f "$d/$docker_test_script_name" ]; then
echo "No such file $d/$docker_test_script_name, skipping directory"
continue
fi
found=$(expr $found + 1)
CURR_DIR=`pwd`
cd "$d"
run_test "./$docker_test_script_name"
test_result=$?
cd "$CURR_DIR"
if [ $test_result -ne 0 ]; then
result=1
fi
done
if [ $found -eq 0 ]; then
exit 1
fi
fi fi
fi fi

View file

@ -99,7 +99,7 @@ manifest:
revision: f28a637db12c4b12fb2b18bddc6b2a0deaa95251 revision: f28a637db12c4b12fb2b18bddc6b2a0deaa95251
path: modules/lib/mcumgr path: modules/lib/mcumgr
- name: net-tools - name: net-tools
revision: c72fbf3300264a8a4bb48be314ca93765c863a19 revision: dcfa04f4aaf30ae7c2dbf34a05a569ca1c04b2ce
path: tools/net-tools path: tools/net-tools
- name: hal_nxp - name: hal_nxp
revision: 56915d2942a3af7205b3c4991a8b87e915de7f59 revision: 56915d2942a3af7205b3c4991a8b87e915de7f59