| .. _definition_and_criteria: | 
 |  | 
 | 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. | 
 |  | 
 | Samples are recommended when submitting new features; however, they are not mandatory. | 
 |  | 
 | Sample Criteria | 
 | =============== | 
 |  | 
 | 1. Samples must not be used to test features or verify platforms | 
 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
 |   * The primary purpose of a sample is to provide a reference to the user. | 
 |   * Samples must not use Zephyr's testing framework. | 
 |  | 
 |     * Must not use :kconfig:option:`CONFIG_ZTEST` | 
 |     * Must not use zasserts in samples. | 
 |  | 
 |   * 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 :ref:`twister_script` for more details. | 
 |  | 
 |   * Although being able to run a sample successfully does verify the | 
 |     functionality is working as expected, this should not replace dedicated and | 
 |     comprehensive tests with full coverage to be submitted into the | 
 |     :zephyr_file:`tests/` folder.  In a sample, the only thing you test is | 
 |     buildability and, in some cases, if a sample is performing as expected, i.e. you | 
 |     are testing the sample, not the subsystem it builds on top. | 
 |  | 
 | 2. Twister should be able to build every sample. | 
 | ++++++++++++++++++++++++++++++++++++++++++++++++ | 
 |   * Every sample must have a YAML file. Reference: :ref:`twister_script`. | 
 |  | 
 |     **For example:** | 
 |  | 
 |     .. code-block:: yaml | 
 |  | 
 |       tests: | 
 |         sample.kernel.cond_var: | 
 |           integration_platforms: | 
 |             - native_sim | 
 |           tags: | 
 |             - kernel | 
 |             - condition_variables | 
 |           harness: console | 
 |           harness_config: | 
 |             type: one_line | 
 |             regex: | 
 |               - ".*Waited and joined with 3 threads" | 
 |  | 
 |   * Do not mark the test as build only. A sample should be able to build *and* | 
 |     run on the documented platforms. Use the ``harness`` option to skip the | 
 |     execution. Twister only attempts to flash and execute the build binary if | 
 |     the harness is set to ``ztest`` or ``console``. | 
 |   * The default configuration for the sample must be in the :file:`prj.conf` | 
 |     file and should be operational on all supported platforms. Do not rely on the | 
 |     ``extra_args`` or ``extra_configs`` options in the YAML file to build the | 
 |     sample. | 
 |   * The tests should verify the default configuration of the sample and any | 
 |     optional features documented in the sample's README file. Sample should | 
 |     never be used to test functionality of the subsystem or module the sample | 
 |     belongs to. | 
 |   * Any documented configuration options related to the sample and its | 
 |     operation can be verified using ``extra_args`` or | 
 |     ``extra_configs`` options in the YAML file. The :file:`prj.conf` file should have the | 
 |     base configuration options. | 
 |   * Sample output can be validated by leveraging the ``harness_config`` regex option, | 
 |     wherever applicable. | 
 |   * Use ``platform_allow`` to limit test to the platforms the sample was actually | 
 |     verified on. Those platforms should be listed in the sample's README file. | 
 |   * Make use of ``integration_platforms`` to limit the scope when there are timing or | 
 |     resource constraints. Ideally, one platform should be enough to verify the | 
 |     sample when changes are submitted to the Zephyr tree via a pull-request. | 
 |   * Make the sample as generic as possible. Avoid making a sample platform specific unless it is | 
 |     for particular hardware. | 
 |  | 
 | 3. 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: :zephyr_file:`samples/philosophers`. | 
 |  | 
 |   **DONT's:** | 
 |     * Samples must not test the negative or edge case behaviors. | 
 |     * Must not be unit tests. | 
 |  | 
 | 4. 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 | 
 |     hardware 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. | 
 |     * Software/Hardware requirements | 
 |     * Building & Running instructions | 
 |     * Sample output, if applicable. | 
 |  | 
 |  | 
 | As a starting point, this sample is a good example to refer to | 
 | :zephyr_file:`samples/kernel/condition_variables/condvar`. |