zephyr/scripts/net/run-sample-tests.sh
Patrik Flykt 190705960d scripts: net: Add SOCKS 5 to MQTT TLS sample test
Start SOCKS5 proxy in the net-tools Docker image and run MQTT TLS
tests with SOCKS enabled. Since the MQTT TLS server is already
running as of the previous test, start only the danted daemon.

Rely on mosquitto MQTT port being handled by the Docker image
configuration file instead of specifying it on the command line.

Signed-off-by: Patrik Flykt <patrik.flykt@intel.com>
2020-04-28 10:29:17 +03:00

517 lines
9.2 KiB
Bash
Executable File

#!/bin/sh
# Copyright (c) 2019 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
image=net-tools
name=net-tools
network=net-tools0
zephyr_pid=0
docker_pid=0
configuration=""
result=0
sample=""
zephyr_overlay=""
check_dirs ()
{
local ret_zephyr=0
local ret_net_tools=0
if [ -z "$ZEPHYR_BASE" ]
then
echo '$ZEPHYR_BASE is unset' >&2
ret_zephyr=1
fi
if [ ! -d "$ZEPHYR_BASE" ]
then
echo '$ZEPHYR_BASE is set, but it is not a directory' >&2
ret_zephyr=1
fi
if [ -z "$NET_TOOLS_BASE" ]
then
local d
for d in "$ZEPHYR_BASE/../.." "$ZEPHYR_BASE/.."
do
local l
l="$d/net-tools"
if [ -d "$l" ]
then
NET_TOOLS_BASE="$l"
break
fi
done
fi
if [ $ret_zephyr -eq 0 ]
then
echo "\$ZEPHYR_BASE $ZEPHYR_BASE"
fi
if [ -z "$NET_TOOLS_BASE" ]
then
echo '$NET_TOOLS_BASE is unset, no net-tools found' >&2
ret_net_tools=1
fi
if [ ! -d "$NET_TOOLS_BASE" ]
then
echo '$NET_TOOLS_BASE set, but it is not a directory' >&2
ret_net_tools=1
fi
if [ $ret_net_tools -eq 0 ]
then
echo "\$NET_TOOLS_BASE $NET_TOOLS_BASE"
fi
if [ $ret_zephyr -ne 0 -o $ret_net_tools -ne 0 ]
then
return 1
fi
return 0
}
start_configuration ()
{
local bridge_interface=""
local addresses="--ip=192.0.2.2 --ip6=2001:db8::2"
if ! docker image ls | grep "$image" > /dev/null
then
echo "Docker image '$image' not found" >&2
return 1
fi
if ! docker network ls | grep "$network" > /dev/null
then
bridge_interface=$("$NET_TOOLS_BASE/net-setup.sh" \
--config "$NET_TOOLS_BASE/docker.conf" \
start 2>/dev/null | tail -1)
if [ $? != 0 ]
then
echo "Could not start Docker network '$network'" >&2
return 1
fi
echo "Started Docker network '$network' bridge interface" \
"'$bridge_interface'..."
fi
if [ -n "$*" ]
then
addresses="$*"
fi
if docker ps | grep "$name" > /dev/null
then
docker stop "$name"
fi
if docker run --hostname=$name --name=$name \
$addresses \
--rm -dit --network=$network $image > /dev/null
then
echo -n "Started Docker container '$name'"
if [ -n "$*" ]
then
echo -n " with extra arguments '$*'"
fi
echo "..."
else
echo "Could not start Docker container '$image'"
return 1
fi
}
stop_configuration ()
{
local bridge_interface=""
if docker ps | grep "$name" > /dev/null
then
docker stop "$name" > /dev/null
if [ $? -eq 0 ]
then
echo "Stopped Docker container '$name'..."
else
echo "Could not stop Docker container '$name'" >&2
fi
fi
bridge_interface=$(docker network ls | grep "$network" | cut -d " " -f 1)
if [ -n "$bridge_interface" ]
then
docker network rm "$network" > /dev/null
if [ $? -eq 0 ]
then
echo "Stopped Docker network '$network' bridge interface" \
"'br-$bridge_interface'..."
else
echo "Could not stop Docker network '$network'" >&2
fi
fi
}
start_zephyr ()
{
if [ -n "$*" ]
then
echo "Building Zephyr with additional arguments '$@'..." >&2
fi
rm -rf build && mkdir build && \
cmake -GNinja -DBOARD=native_posix -B build "$@" && \
ninja -C build
ninja -C build run &
zephyr_pid=$!
sleep 3
echo "Zephyr PID $zephyr_pid"
}
list_children () {
local pid="$(ps -o pid= --ppid "$1")"
for p in $pid
do
list_children $p
done
if [ -n "$pid" ]
then
echo -n "$pid "
fi
}
stop_zephyr ()
{
if [ "$zephyr_pid" -ne 0 ]
then
local zephyrs="$zephyr_pid $(list_children "$zephyr_pid")"
echo "Stopping Zephyr PIDs $zephyrs"
kill $zephyrs
fi
zephyr_pid=0
}
wait_zephyr ()
{
local result=""
echo "Waiting for Zephyr $zephyr_pid..."
wait $zephyr_pid
result=$?
zephyr_pid=0
return $result
}
docker_run ()
{
local test=""
local result=0
for test in "$@"
do
echo "Running '$test' in the container..."
docker container exec net-tools $test || return $?
done
}
start_docker ()
{
docker_run "$@" &
docker_pid=$!
echo "Docker PID $docker_pid"
}
stop_docker ()
{
if [ "$docker_pid" -ne 0 -a "$configuration" != "keep" ]
then
local dockers="$docker_pid $(list_children "$docker_pid")"
echo "Stopping Docker PIDs $dockers"
kill $dockers
fi
docker_pid=0
}
wait_docker ()
{
local result=""
echo "Waiting for Docker PID $docker_pid..."
wait $docker_pid
result=$?
docker_pid=0
echo "Docker returned '$result'"
return $result
}
docker_exec ()
{
local result=0
local overlay=""
if [ -n "$zephyr_overlay" ]
then
overlay="-DOVERLAY_CONFIG=$zephyr_overlay"
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
;;
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
;;
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
;;
*)
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"
result=$?
else
docker_exec "$test"
result=$?
fi
if [ $result -eq 0 ]
then
echo "Sample '$test' successful"
else
echo "Sample '$test' failed with return value '$result'"
fi
return $result
}
usage ()
{
echo "$0 [-Z <zephyr base directory>] [-N <net-tools base directory>]"
echo "\t[<test script>]"
echo "This script runs Zephyr sample tests using Docker container and"
echo "network implemented by the 'net-tools' subproject."
echo "-Z|--zephyr-dir <dir>\t\tset Zephyr base directory"
echo "-N|--net-tools-dir <dir>\tset net-tools directory"
echo "--start\t\t\t\tonly start Docker container and network and exit"
echo "--stop\t\t\t\tonly stop Docker container and network"
echo "--keep\t\t\t\tkeep Docker container and network after test"
echo -n "--overlay <config files>\tadditional configuration/overlay "
echo "files for the\n\t\t\t\tZephyr build process"
echo "<test script>\t\t\tsample script to run instead of test based on"
echo "\t\t\t\tcurrent directory"
echo "The automatically detected directories are:"
check_dirs
}
stop_sample_test () {
echo "Interrupted..." >&2
stop_zephyr
stop_docker
stop_configuration
exit 2
}
trap stop_sample_test ABRT INT HUP TERM
while test -n "$1"
do
case "$1" in
-Z|--zephyr-dir)
shift
ZEPHYR_BASE="$1"
;;
-N|--net-tools-dir)
shift
NET_TOOLS_BASE="$1"
;;
-h|--help)
usage
return 0
;;
--start)
if [ -n "$configuration" ]
then
echo "--start or --stop specified multiple times" >&2
return 1
fi
configuration=start_only
;;
--stop)
if [ -n "$configuration" ]
then
echo "--start or --stop specified multiple times" >&2
return 1
fi
configuration=stop_only
;;
--keep)
configuration=keep
;;
--overlay)
shift
if [ -n "$zephyr_overlay" ]
then
zephyr_overlay="$zephyr_overlay $1"
else
zephyr_overlay="$1"
fi
;;
-*)
echo "Argument '$1' not recognised" >&2
usage
return 0
;;
*)
if [ -n "$sample" ]
then
echo "Sample already specified" >&2
return 1
fi
sample="$1"
;;
esac
shift
done
check_dirs || exit $?
if [ -z "$configuration" -o "$configuration" = "start_only" -o \
"$configuration" = "keep" ]
then
if [ "$configuration" = start_only ]
then
start_configuration
result=$?
else
run_test "$sample"
result=$?
fi
fi
if [ -z "$configuration" -o "$configuration" = stop_only ]
then
stop_configuration
fi
return $result