.. _chapter-test-server: .. default-domain:: cpp .. highlight:: sh --------------- pw_test_server --------------- The test server module implements a gRPC server which runs unit tests. Overview -------- The unit test server is responsible for processing requests to run unit tests and distributing them among a pool of test workers that run in parallel. This allows unit tests to be run across multiple devices simultaneously, greatly speeding up their execution time. Additionally, the server allows many tests to be queued up at once and scheduled across available devices, making it possible to automatically run unit tests from a Ninja build after code is updated. This integrates nicely with the ``pw watch`` command to re-run all affected unit tests after modifying code. The test server is implemented as a library in various programming languages. This library provides the core gRPC server and a mechanism through which unit test worker routines can be registered. Code using the library instantiates a server with some custom workers for the desired target to run scheduled unit tests. The pw_test_server module also provides a standalone ``pw_test_server`` program which runs the test server with configurable workers that launch external processes to run unit tests. This program should be sufficient to quickly get unit tests running in a simple setup, such as multiple devices plugged into a development machine. Standalone executable --------------------- This section describes how to use the ``pw_test_server`` program to set up a simple unit test server with workers. Configuration ^^^^^^^^^^^^^ The standalone server is configured from a file written in Protobuf text format containing a ``pw.test_server.ServerConfig`` message as defined in ``//pw_test_server/config.proto``. At least one ``worker`` message must be specified. Each of the workers refers to a script or program which is invoked with the path to a unit test executable file as a positional argument. Other arguments provided to the program must be options/switches. For example, the config file below defines two workers, each connecting to an STM32F429I Discovery board with a specified serial number. **server_config.txt** .. code:: text runner { command: "stm32f429i_disc1_unit_test_runner" args: "--openocd-config" args: "targets/stm32f429i-disc1/py/stm32f429i_disc1_utils/openocd_stm32f4xx.cfg" args: "--serial" args: "066DFF575051717867013127" } runner { command: "stm32f429i_disc1_unit_test_runner" args: "--openocd-config" args: "targets/stm32f429i-disc1/py/stm32f429i_disc1_utils/openocd_stm32f4xx.cfg" args: "--serial" args: "0667FF494849887767196023" } Running the server ^^^^^^^^^^^^^^^^^^ To start the standalone server, run the ``pw_test_server`` program with the ``-server`` flag and point it to your config file. .. code:: text $ pw_test_server -server -config server_config.txt -port 8080 Sending test requests ^^^^^^^^^^^^^^^^^^^^^ To request the server to run a unit test, the ``pw_test_server`` program is run in client mode, specifying the path to the unit test executable through a ``-test`` option. .. code:: text $ pw_test_server -host localhost -port 8080 -test /path/to/my/test.elf This command blocks until the test has run and prints out its output. Multiple tests can be scheduled in parallel; the server will distribute them among its available workers. Library APIs ------------ To use the test server library in your own code, refer to one of its programming language APIs below. .. toctree:: :maxdepth: 1 go/docs