| |
| Zephyr Sanity Tests |
| ################### |
| |
| This script scans for the set of unit test applications in the git repository |
| and attempts to execute them. By default, it tries to build each test |
| case on boards marked as default in the board definition file. |
| |
| The default options will build the majority of the tests on a defined set of |
| boards and will run in an emulated environment (QEMU) if available for the |
| architecture or configuration being tested. |
| |
| In normal use, sanitycheck runs a limited set of kernel tests (inside |
| QEMU). Because of its limited text execution coverage, sanitycheck |
| cannot guarantee local changes will succeed in the full build |
| environment, but it does sufficient testing by building samples and |
| tests for different boards and different configurations to help keep the |
| full code tree buildable. |
| |
| To run the script in the local tree, follow the steps below: |
| |
| :: |
| |
| $ source zephyr-env.sh |
| $ ./scripts/sanitycheck |
| |
| If you have a system with a large number of cores, you can build and run |
| all possible tests using the following options: |
| |
| :: |
| |
| $ ./scripts/sanitycheck --all --enable-slow |
| |
| This will build for all available boards and run all applicable tests in |
| a simulated (QEMU) environment. |
| |
| The sanitycheck script accepts the following optional arguments: |
| |
| -h, --help |
| show this help message and exit |
| -p PLATFORM, --platform PLATFORM |
| Platform filter for testing. This option may be used |
| multiple times. Testcases will only be built/run on |
| the platforms specified. If this option is not used, |
| then platforms marked as default in the platform |
| metadata file will be chosen to build and test. |
| -L N, --platform-limit N |
| Controls what platforms are tested if --platform or |
| --all are not used. For each architecture specified by |
| --arch (defaults to all of them), choose the first N |
| platforms to test in the arch-specific .yaml file |
| 'platforms' list. Defaults to 1. |
| -a ARCH, --arch ARCH Arch filter for testing. Takes precedence over |
| --platform. If unspecified, test all arches. Multiple |
| invocations are treated as a logical 'or' relationship |
| -t TAG, --tag TAG Specify tags to restrict which tests to run by tag |
| value. Default is to not do any tag filtering. |
| Multiple invocations are treated as a logical 'or' |
| relationship |
| -e EXCLUDE_TAG, --exclude-tag EXCLUDE_TAG |
| Specify tags of tests that should not run. Default is |
| to run all tests with all tags. |
| -f, --only-failed Run only those tests that failed the previous sanity |
| check invocation. |
| -c CONFIG, --config CONFIG |
| Specify platform configuration values filtering. This |
| can be specified two ways: <config>=<value> or just |
| <config>. The defconfig for all platforms will be |
| checked. For the <config>=<value> case, only match |
| defconfig that have that value defined. For the |
| <config> case, match defconfig that have that value |
| assigned to any value. Prepend a '!' to invert the |
| match. |
| -s TEST, --test TEST Run only the specified test cases. These are named by |
| <path to test project relative to --testcase- |
| root>/<testcase.yaml section name> |
| -l, --all Build/test on all platforms. Any --platform arguments |
| ignored. |
| -o TESTCASE_REPORT, --testcase-report TESTCASE_REPORT |
| Output a CSV spreadsheet containing results of the |
| test run |
| -d DISCARD_REPORT, --discard-report DISCARD_REPORT |
| Output a CSV spreadsheet showing tests that were |
| skipped and why |
| --compare-report COMPARE_REPORT |
| Use this report file for size comparison |
| --ccache Enable the use of ccache when building |
| -B SUBSET, --subset SUBSET |
| Only run a subset of the tests, 1/4 for running the |
| first 25%, 3/5 means run the 3rd fifth of the total. |
| This option is useful when running a large number of |
| tests on different hosts to speed up execution time. |
| -y, --dry-run Create the filtered list of test cases, but don't |
| actually run them. Useful if you're just interested in |
| --discard-report |
| -r, --release Update the benchmark database with the results of this |
| test run. Intended to be run by CI when tagging an |
| official release. This database is used as a basis for |
| comparison when looking for deltas in metrics such as |
| footprint |
| -w, --warnings-as-errors |
| Treat warning conditions as errors |
| -v, --verbose Emit debugging information, call multiple times to |
| increase verbosity |
| -i, --inline-logs Upon test failure, print relevant log data to stdout |
| instead of just a path to it |
| --log-file FILENAME log also to file |
| -m, --last-metrics Instead of comparing metrics from the last --release, |
| compare with the results of the previous sanity check |
| invocation |
| -u, --no-update do not update the results of the last run of the |
| sanity checks |
| -b, --build-only Only build the code, do not execute any of it in QEMU |
| -j JOBS, --jobs JOBS Number of cores to use when building, defaults to |
| number of CPUs * 2 |
| -H FOOTPRINT_THRESHOLD, --footprint-threshold FOOTPRINT_THRESHOLD |
| When checking test case footprint sizes, warn the user |
| if the new app size is greater then the specified |
| percentage from the last release. Default is 5. 0 to |
| warn on any increase on app size |
| -D, --all-deltas Show all footprint deltas, positive or negative. |
| Implies --footprint-threshold=0 |
| -O OUTDIR, --outdir OUTDIR |
| Output directory for logs and binaries. |
| -n, --no-clean Do not delete the outdir before building. Will result |
| in faster compilation since builds will be incremental |
| -T TESTCASE_ROOT, --testcase-root TESTCASE_ROOT |
| Base directory to recursively search for test cases. |
| All testcase.yaml files under here will be processed. |
| May be called multiple times. Defaults to the |
| 'samples' and 'tests' directories in the Zephyr tree. |
| -A ARCH_ROOT, --arch-root ARCH_ROOT |
| Directory to search for arch configuration files. All |
| .yaml files in the directory will be processed. |
| -z SIZE, --size SIZE Don't run sanity checks. Instead, produce a report to |
| stdout detailing RAM/ROM sizes on the specified |
| filenames. All other command line arguments ignored. |
| -S, --enable-slow Execute time-consuming test cases that have been |
| marked as 'slow' in testcase.yaml. Normally these are |
| only built. |
| -R, --enable-asserts Build all test cases with assertions enabled. |
| -Q, --error-on-deprecations |
| Error on deprecation warnings. |
| -x EXTRA_ARGS, --extra-args EXTRA_ARGS |
| Extra arguments to pass to the build when compiling |
| test cases. May be called multiple times. These will |
| be passed in after any sanitycheck-supplied options. |
| -C, --coverage Scan for unit test coverage with gcov + lcov. |
| |
| |
| Board Configuration |
| ******************* |
| |
| To build tests for a specific board and to execute some of the tests on real |
| hardware or in an emulation environment such as QEMU a board configuration file |
| is required which is generic enough to be used for other tasks that require a |
| board inventory with details about the board and its configuration that is only |
| available during build time otherwise. |
| |
| The board metadata file is located in the board directory and is structured |
| using the YAML markup language. The example below shows a board with a data |
| required for best test coverage for this specific board: |
| |
| .. code-block:: yaml |
| |
| identifier: quark_d2000_crb |
| name: Quark D2000 Devboard |
| type: mcu |
| arch: x86 |
| toolchain: |
| - zephyr |
| - issm |
| ram: 8 |
| flash: 32 |
| testing: |
| default: true |
| ignore_tags: |
| - net |
| - bluetooth |
| |
| |
| identifier: |
| A string that matches how the board is defined in the build system. This same |
| string is used when building, for example when calling 'cmake':: |
| |
| # cmake -DBOARD=quark_d2000_crb .. |
| |
| name: |
| The actual name of the board as it appears in marketing material. |
| type: |
| Type of the board or configuration, currently we support 2 types: mcu, qemu |
| arch: |
| Architecture of the board |
| toolchain: |
| The list of supported toolchains that can build this board. This should match |
| one of the values used for 'ZEPHYR_GCC_VARIANT' when building on the command line |
| ram: |
| Available RAM on the board (specified in KB). This is used to match testcase |
| requirements. If not specified we default to 128KB. |
| flash: |
| Available FLASH on the board (specified in KB). This is used to match testcase |
| requirements. If not specified we default to 512KB. |
| supported: |
| A list of features this board supports. This can be specified as a single word |
| feature or as a variant of a feature class. For example: |
| |
| :: |
| |
| supported: |
| - pci |
| |
| This indicates the board does support PCI. You can make a testcase build or |
| run only on such boards, or: |
| |
| :: |
| |
| supported: |
| - netif:eth |
| - sensor:bmi16 |
| |
| A testcase can both depend on 'eth' to only test ethernet or on 'netif' to run |
| on any board with a networking interface. |
| |
| testing: |
| testing relating keywords to provide best coverage for the features of this |
| board. |
| |
| default: [True|False]: |
| This is a default board, it will tested with the highest priority and is |
| covered when invoking the simplified sanitycheck without any additional |
| arguments. |
| ignore_tags: |
| Do not attempt to build (and therefore run) tests marked with this list of |
| tags. |
| |
| |
| |
| |
| Test Cases |
| ********** |
| |
| Test cases are detected by the presence of a 'testcase.yaml' or a 'sample.yaml' |
| files in the application's project directory. This file may contain one or more |
| entries in the test section each identifying a test scenario. The name of |
| the test case only needs to be unique for the test cases specified in |
| that testcase meta-data. |
| |
| Test cases are written using the YAML syntax and share the same structure as |
| samples. The following is an example test with a few options that are |
| explained in this document. |
| |
| |
| :: |
| |
| tests: |
| test: |
| build_only: true |
| platform_whitelist: qemu_cortex_m3 qemu_x86 arduino_101 |
| tags: bluetooth |
| test_br: |
| build_only: true |
| extra_args: CONF_FILE="prj_br.conf" |
| filter: not CONFIG_DEBUG |
| platform_exclude: quark_d2000_crb |
| platform_whitelist: qemu_cortex_m3 qemu_x86 |
| tags: bluetooth |
| |
| |
| A sample with tests will have the same structure with additional information |
| related to the sample and what is being demonstrated: |
| |
| :: |
| |
| sample: |
| name: hello world |
| description: Hello World sample, the simplest Zephyr application |
| platforms: all |
| tests: |
| test: |
| build_only: true |
| tags: samples tests |
| min_ram: 16 |
| singlethread: |
| build_only: true |
| extra_args: CONF_FILE=prj_single.conf |
| filter: not CONFIG_BT and not CONFIG_GPIO_SCH |
| tags: samples tests |
| min_ram: 16 |
| |
| The full canonical name for each test case is: |
| |
| :: |
| |
| <path to test case>/<test entry> |
| |
| Each test block in the testcase meta data can define the following key/value |
| pairs: |
| |
| tags: <list of tags> (required) |
| A set of string tags for the testcase. Usually pertains to |
| functional domains but can be anything. Command line invocations |
| of this script can filter the set of tests to run based on tag. |
| |
| skip: <True|False> (default False) |
| skip testcase unconditionally. This can be used for broken tests. |
| |
| slow: <True|False> (default False) |
| Don't run this test case unless --enable-slow was passed in on the |
| command line. Intended for time-consuming test cases that are only |
| run under certain circumstances, like daily builds. These test cases |
| are still compiled. |
| |
| extra_args: <list of extra arguments> |
| Extra arguments to pass to Make when building or running the |
| test case. |
| |
| extra_configs: <list of extra configurations> |
| Extra configuration options to be merged with a master prj.conf |
| when building or running the test case. For example:: |
| |
| common: |
| tags: drivers adc |
| tests: |
| test: |
| depends_on: adc |
| test_resolution_6: |
| extra_configs: |
| - CONFIG_ADC_QMSI_SAMPLE_WIDTH=6 |
| platform_whitelist: quark_se_c1000_ss_devboard |
| tags: hwtest |
| |
| |
| build_only: <True|False> (default False) |
| If true, don't try to run the test under QEMU even if the |
| selected platform supports it. |
| |
| build_on_all: <True|False> (default False) |
| If true, attempt to build test on all available platforms. |
| |
| depends_on: <list of features> |
| A board or platform can announce what features it supports, this option |
| will enable the test only those platforms that provide this feature. |
| |
| min_ram: <integer> |
| minimum amount of RAM needed for this test to build and run. This is |
| compared with information provided by the board metadata. |
| |
| min_flash: <integer> |
| minimum amount of ROM needed for this test to build and run. This is |
| compared with information provided by the board metadata. |
| |
| timeout: <number of seconds> |
| Length of time to run test in QEMU before automatically killing it. |
| Default to 60 seconds. |
| |
| arch_whitelist: <list of arches, such as x86, arm, arc> |
| Set of architectures that this test case should only be run for. |
| |
| arch_exclude: <list of arches, such as x86, arm, arc> |
| Set of architectures that this test case should not run on. |
| |
| platform_whitelist: <list of platforms> |
| Set of platforms that this test case should only be run for. |
| |
| platform_exclude: <list of platforms> |
| Set of platforms that this test case should not run on. |
| |
| extra_sections: <list of extra binary sections> |
| When computing sizes, sanitycheck will report errors if it finds |
| extra, unexpected sections in the Zephyr binary unless they are named |
| here. They will not be included in the size calculation. |
| |
| filter: <expression> |
| Filter whether the testcase should be run by evaluating an expression |
| against an environment containing the following values: |
| |
| :: |
| |
| { ARCH : <architecture>, |
| PLATFORM : <platform>, |
| <all CONFIG_* key/value pairs in the test's generated defconfig>, |
| *<env>: any environment variable available |
| } |
| |
| The grammar for the expression language is as follows: |
| |
| expression ::= expression "and" expression |
| | expression "or" expression |
| | "not" expression |
| | "(" expression ")" |
| | symbol "==" constant |
| | symbol "!=" constant |
| | symbol "<" number |
| | symbol ">" number |
| | symbol ">=" number |
| | symbol "<=" number |
| | symbol "in" list |
| | symbol ":" string |
| | symbol |
| |
| list ::= "[" list_contents "]" |
| |
| list_contents ::= constant |
| | list_contents "," constant |
| |
| constant ::= number |
| | string |
| |
| |
| For the case where expression ::= symbol, it evaluates to true |
| if the symbol is defined to a non-empty string. |
| |
| Operator precedence, starting from lowest to highest: |
| |
| or (left associative) |
| and (left associative) |
| not (right associative) |
| all comparison operators (non-associative) |
| |
| arch_whitelist, arch_exclude, platform_whitelist, platform_exclude |
| are all syntactic sugar for these expressions. For instance |
| |
| arch_exclude = x86 arc |
| |
| Is the same as: |
| |
| filter = not ARCH in ["x86", "arc"] |
| |
| The ':' operator compiles the string argument as a regular expression, |
| and then returns a true value only if the symbol's value in the environment |
| matches. For example, if CONFIG_SOC="quark_se" then |
| |
| filter = CONFIG_SOC : "quark.*" |
| |
| Would match it. |
| |
| The set of test cases that actually run depends on directives in the testcase |
| filed and options passed in on the command line. If there is any confusion, |
| running with -v or --discard-report can help show why particular test cases |
| were skipped. |
| |
| Metrics (such as pass/fail state and binary size) for the last code |
| release are stored in scripts/sanity_chk/sanity_last_release.csv. |
| To update this, pass the --all --release options. |
| |
| To load arguments from a file, write '+' before the file name, e.g., |
| +file_name. File content must be one or more valid arguments separated by |
| line break instead of white spaces. |
| |
| Most everyday users will run with no arguments. |