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_posix 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.
