The shell script run-sample-tests.sh runs selected Zephyr samples against
the network test applications Docker container provided by the 'net-tools'
Zephyr project, https://github.com/zephyrproject-rtos/net-tools.


Installation
************

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
at the net-tools Docker README file
https://github.com/zephyrproject-rtos/net-tools/blob/master/README.docker.

In essence, the following needs to be done:

 * Install Docker
 * Check out the net-tools project from github or update it with west
 * Change working directory to the net-tools repository
 * cd docker/
 * Run 'docker build -t net-tools .'

This creates a Docker image called 'net-tools' which the script will need as
its counterpart when testing various network sample applications.


Using
*****

The scripts/net/run-sample-tests.sh shell script can be used in two ways:

1. From a Zephyr network sample test directory.
   Example:

   cd samples/net/gptp
   $ZEPHYR_BASE/scripts/net/run-sample-tests.sh

2. By giving the test directories as parameters to the runner script.
   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
by the script, as well as Zephyr using native_sim board. IP addresses are
assigned to the Docker network, which is a Linux network bridge interface.
The default IP addresses are:

 * 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
 * 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
with the echo_server the IP addresses are switched between Zephyr and Docker
so that the echo_client application always uses addresses ending in .1 and
the echo_server application uses those ending in .2. The script does the IP
address setup for each sample test, be it the default ones or the switched
ones.

When completed, the return value, either from Zephyr or from the Docker
container, is returned to the script on Zephyr or Docker application
termination. The return value is used as a simple verdict whether the sample
passed or failed.


Directories
***********

The sample test script tries to automatically figure out the Zephyr base
directory, which is assumed to be set by the ZEPHYR_BASE environment variable.
Should this not be the case, the directory can be set using '-Z' or
'--zephyr-dir' command line arguments. The sample test script also assumes
that the net-tools git repository containing the Docker networking setup file
'docker.conf' exists at the same directory level as the Zephyr base directory.
If the net tools are found elsewhere, the net-tools directory can be set with
the 'N' or '--net-tools-dir' command line argument.

Help is also available using the 'h' or '--help' argument.
