This is the documentation for the latest (main) development branch of Zephyr. If you are looking for the documentation of previous releases, use the drop-down menu on the left and select the desired version.

Sample Definition and Criteria

Definition

A sample is a concise Zephyr application that provides an accessible overview of one or more features, subsystems, or modules. This includes kernel services, drivers, protocols, etc. Samples should be limited in scope and should focus only on demonstrating non-trivial or essential aspects of the subsystem(s) or module(s) being highlighted.

Sample Criteria

1. Samples must not be used as a testcase.

  • The primary purpose of a sample is to provide a reference to the user.

  • Samples must not use Zephyr’s testing framework.

  • If a sample can provide output that can be verified, then output should be evaluated against expected value to have some level of testing for the sample itself. Refer to doc/develop/test/twister.rst for more details.

  • Samples are optional.

2. Twister should be able to build every sample.

  • Every sample must have a YAML file. Reference: doc/develop/test/twister.rst.

    For example:

    tests:
      sample.kernel.cond_var:
        integration_platforms:
          - native_posix
        tags: kernel condition_variables
        harness: console
        harness_config:
          type: one_line
          regex:
            - ".*Waited and joined with 3 threads"
    
Guidelines for Samples:
  • Minimize the use of platform_allow and architecture filters.

  • Do not mark the test as build only unless necessary.

  • Any test case-specific configuration options are added using extra_args or extra_configs options in the YAML file. The prj.conf file should have the in-common configuration options.

  • The sample itself can be evaluated using multiple configurations in the sample’s YAML file. For example, the sample is used to run with different logging modes using multiple scenarios in samples/subsys/logging/syst.

  • Sample output can be validated leveraging the harness_config regex option, wherever applicable.

3. Samples should target multiple platforms and architectures.

  • Minimize the use of platform_allow and architecture filters as it limits the scope of testing to the mentioned platforms and architectures. Reference: doc/develop/test/twister.rst

  • Make use of integration_platforms to limit the scope when there are timing or resource constraints.

  • Make the sample as generic as possible. Avoid making a sample platform specific unless it is for particular hardware.

4. A sample should provide sufficient coverage of a subsystem, feature, or module.

DO’s:
  • Cover the most common and important use cases of the functionality.

  • Keep the code simple and easy to read. Example: samples/philosophers.

DONT’s:
  • Samples must not test the negative or edge case behaviors.

  • Must not be unit tests.

5. Samples must be documented.

  • Samples must have a README.rst file in the samples folder. Example: samples/subsys/foo/README.rst. clearly explaining the purpose of the sample, its HW requirements, and the expected sample output, if applicable.

  • Ensure that the README.rst file is accessible in the sample hierarchy starting at samples/index.rst.

README Template:
  • Overview, if applicable.

  • SW/HW requirements

  • Building & Running instructions

  • Sample output, if applicable.

6. A sample should be a reference, not a tutorial.

  • Should have minimal comments, when applicable.

  • Should concisely demonstrate HOW to solve a problem, not WHY.

As a starting point, this sample is a good example to refer to samples/kernel/condition_variables/condvar.