%sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget'/translations/zh_CN/dev-tools/kselftestmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/pt_BR/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hLinux Kernel Selftestsh]hLinux Kernel Selftests}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhA/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest.rsthKubh paragraph)}(hThe kernel contains a set of "self tests" under the tools/testing/selftests/ directory. These are intended to be small tests to exercise individual code paths in the kernel. Tests are intended to be run after building, installing and booting a kernel.h]hThe kernel contains a set of “self tests” under the tools/testing/selftests/ directory. These are intended to be small tests to exercise individual code paths in the kernel. Tests are intended to be run after building, installing and booting a kernel.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXKselftest from mainline can be run on older stable kernels. Running tests from mainline offers the best coverage. Several test rings run mainline kselftest suite on stable releases. The reason is that when a new test gets added to test existing code to regression test a bug, we should be able to run that test on an older kernel. Hence, it is important to keep code that can still test an older kernel and make sure it skips the test gracefully on newer releases.h]hXKselftest from mainline can be run on older stable kernels. Running tests from mainline offers the best coverage. Several test rings run mainline kselftest suite on stable releases. The reason is that when a new test gets added to test existing code to regression test a bug, we should be able to run that test on an older kernel. Hence, it is important to keep code that can still test an older kernel and make sure it skips the test gracefully on newer releases.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hyYou can find additional information on Kselftest framework, how to write new tests using the framework on Kselftest wiki:h]hyYou can find additional information on Kselftest framework, how to write new tests using the framework on Kselftest wiki:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h"https://kselftest.wiki.kernel.org/h]h reference)}(hhh]h"https://kselftest.wiki.kernel.org/}(hhhhhNhNubah}(h]h ]h"]h$]h&]refurihuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXOn some systems, hot-plug tests could hang forever waiting for cpu and memory to be ready to be offlined. A special hot-plug target is created to run the full range of hot-plug tests. In default mode, hot-plug tests run in safe mode with a limited scope. In limited mode, cpu-hotplug test is run on a single cpu as opposed to all hotplug capable cpus, and memory hotplug test is run on 2% of hotplug capable memory instead of 10%.h]hXOn some systems, hot-plug tests could hang forever waiting for cpu and memory to be ready to be offlined. A special hot-plug target is created to run the full range of hot-plug tests. In default mode, hot-plug tests run in safe mode with a limited scope. In limited mode, cpu-hotplug test is run on a single cpu as opposed to all hotplug capable cpus, and memory hotplug test is run on 2% of hotplug capable memory instead of 10%.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hkselftest runs as a userspace process. Tests that can be written/run in userspace may wish to use the `Test Harness`_. Tests that need to be run in kernel space may wish to use a `Test Module`_.h](hgkselftest runs as a userspace process. Tests that can be written/run in userspace may wish to use the }(hjhhhNhNubh)}(h`Test Harness`_h]h Test Harness}(hj'hhhNhNubah}(h]h ]h"]h$]h&]name Test Harnessrefid test-harnessuh1hhjresolvedKubh?. Tests that need to be run in kernel space may wish to use a }(hjhhhNhNubh)}(h`Test Module`_h]h Test Module}(hj>hhhNhNubah}(h]h ]h"]h$]h&]name Test Modulej7 test-moduleuh1hhjj9Kubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hDocumentation on the testsh]hDocumentation on the tests}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhhhhhK#ubh)}(h4For documentation on the kselftests themselves, see:h]h4For documentation on the kselftests themselves, see:}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjYhhubhcompound)}(hhh]htoctree)}(hhh]h}(h]h ]h"]h$]h&]hdev-tools/kselftestentries]Ndev-tools/testing-devicesa includefiles]jamaxdepthJcaptionNglobhidden includehiddennumberedK titlesonly rawentries]uh1j}hhhK'hjzubah}(h]h ]toctree-wrapperah"]h$]h&]uh1jxhjYhhhhhK*ubeh}(h]documentation-on-the-testsah ]h"]documentation on the testsah$]h&]uh1hhhhhhhhK#ubh)}(hhh](h)}(h=Running the selftests (hotplug tests are run in limited mode)h]h=Running the selftests (hotplug tests are run in limited mode)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK,ubh)}(hTo build the tests::h]hTo build the tests:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubh literal_block)}(h0$ make headers $ make -C tools/testing/selftestsh]h0$ make headers $ make -C tools/testing/selftests}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK0hjhhubh)}(hTo run the tests::h]hTo run the tests:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubj)}(h+$ make -C tools/testing/selftests run_testsh]h+$ make -C tools/testing/selftests run_tests}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK5hjhhubh)}(h7To build and run the tests with a single command, use::h]h6To build and run the tests with a single command, use:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjhhubj)}(h$ make kselftesth]h$ make kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK9hjhhubh)}(h2Note that some tests will require root privileges.h]h2Note that some tests will require root privileges.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjhhubh)}(hX.Kselftest supports saving output files in a separate directory and then running tests. To locate output files in a separate directory two syntaxes are supported. In both cases the working directory must be the root of the kernel src. This is applicable to "Running a subset of selftests" section below.h]hX2Kselftest supports saving output files in a separate directory and then running tests. To locate output files in a separate directory two syntaxes are supported. In both cases the working directory must be the root of the kernel src. This is applicable to “Running a subset of selftests” section below.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubh)}(h>To build, save output files in a separate directory with O= ::h]h;To build, save output files in a separate directory with O=}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChjhhubj)}(h!$ make O=/tmp/kselftest kselftesth]h!$ make O=/tmp/kselftest kselftest}hj:sbah}(h]h ]h"]h$]h&]jjuh1jhhhKEhjhhubh)}(hITo build, save output files in a separate directory with KBUILD_OUTPUT ::h]hFTo build, save output files in a separate directory with KBUILD_OUTPUT}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjhhubj)}(h5$ export KBUILD_OUTPUT=/tmp/kselftest; make kselftesth]h5$ export KBUILD_OUTPUT=/tmp/kselftest; make kselftest}hjVsbah}(h]h ]h"]h$]h&]jjuh1jhhhKIhjhhubh)}(hOThe O= assignment takes precedence over the KBUILD_OUTPUT environment variable.h]hOThe O= assignment takes precedence over the KBUILD_OUTPUT environment variable.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjhhubh)}(hXaThe above commands by default run the tests and print full pass/fail report. Kselftest supports "summary" option to make it easier to understand the test results. Please find the detailed individual test results for each test in /tmp/testname file(s) when summary option is specified. This is applicable to "Running a subset of selftests" section below.h]hXiThe above commands by default run the tests and print full pass/fail report. Kselftest supports “summary” option to make it easier to understand the test results. Please find the detailed individual test results for each test in /tmp/testname file(s) when summary option is specified. This is applicable to “Running a subset of selftests” section below.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjhhubh)}(h/To run kselftest with summary option enabled ::h]h,To run kselftest with summary option enabled}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThjhhubj)}(h$ make summary=1 kselftesth]h$ make summary=1 kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKVhjhhubeh}(h];running-the-selftests-hotplug-tests-are-run-in-limited-modeah ]h"]=running the selftests (hotplug tests are run in limited mode)ah$]h&]uh1hhhhhhhhK,ubh)}(hhh](h)}(hRunning a subset of selftestsh]hRunning a subset of selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKYubh)}(huYou can use the "TARGETS" variable on the make command line to specify single test to run, or a list of tests to run.h]hyYou can use the “TARGETS” variable on the make command line to specify single test to run, or a list of tests to run.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjhhubh)}(h3To run only tests targeted for a single subsystem::h]h2To run only tests targeted for a single subsystem:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjhhubj)}(h:$ make -C tools/testing/selftests TARGETS=ptrace run_testsh]h:$ make -C tools/testing/selftests TARGETS=ptrace run_tests}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK`hjhhubh)}(h1You can specify multiple tests to build and run::h]h0You can specify multiple tests to build and run:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjhhubj)}(h'$ make TARGETS="size timers" kselftesth]h'$ make TARGETS="size timers" kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKdhjhhubh)}(h>To build, save output files in a separate directory with O= ::h]h;To build, save output files in a separate directory with O=}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjhhubj)}(h7$ make O=/tmp/kselftest TARGETS="size timers" kselftesth]h7$ make O=/tmp/kselftest TARGETS="size timers" kselftest}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhhjhhubh)}(hITo build, save output files in a separate directory with KBUILD_OUTPUT ::h]hFTo build, save output files in a separate directory with KBUILD_OUTPUT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhjhhubj)}(hK$ export KBUILD_OUTPUT=/tmp/kselftest; make TARGETS="size timers" kselftesth]hK$ export KBUILD_OUTPUT=/tmp/kselftest; make TARGETS="size timers" kselftest}hj%sbah}(h]h ]h"]h$]h&]jjuh1jhhhKlhjhhubh)}(hAdditionally you can use the "SKIP_TARGETS" variable on the make command line to specify one or more targets to exclude from the TARGETS list.h]hAdditionally you can use the “SKIP_TARGETS” variable on the make command line to specify one or more targets to exclude from the TARGETS list.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhjhhubh)}(h)To run all tests but a single subsystem::h]h(To run all tests but a single subsystem:}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjhhubj)}(h?$ make -C tools/testing/selftests SKIP_TARGETS=ptrace run_testsh]h?$ make -C tools/testing/selftests SKIP_TARGETS=ptrace run_tests}hjOsbah}(h]h ]h"]h$]h&]jjuh1jhhhKshjhhubh)}(h(You can specify multiple tests to skip::h]h'You can specify multiple tests to skip:}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjhhubj)}(h,$ make SKIP_TARGETS="size timers" kselftesth]h,$ make SKIP_TARGETS="size timers" kselftest}hjksbah}(h]h ]h"]h$]h&]jjuh1jhhhKwhjhhubh)}(h[You can also specify a restricted list of tests to run together with a dedicated skiplist::h]hZYou can also specify a restricted list of tests to run together with a dedicated skiplist:}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhjhhubj)}(hE$ make TARGETS="breakpoints size timers" SKIP_TARGETS=size kselftesth]hE$ make TARGETS="breakpoints size timers" SKIP_TARGETS=size kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK|hjhhubh)}(hXSee the top-level tools/testing/selftests/Makefile for the list of all possible targets.h]hXSee the top-level tools/testing/selftests/Makefile for the list of all possible targets.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjhhubeh}(h]running-a-subset-of-selftestsah ]h"]running a subset of selftestsah$]h&]uh1hhhhhhhhKY referencedKubh)}(hhh](h)}(h(Running the full range hotplug selftestsh]h(Running the full range hotplug selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hTo build the hotplug tests::h]hTo build the hotplug tests:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h)$ make -C tools/testing/selftests hotplugh]h)$ make -C tools/testing/selftests hotplug}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hTo run the hotplug tests::h]hTo run the hotplug tests:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h-$ make -C tools/testing/selftests run_hotplugh]h-$ make -C tools/testing/selftests run_hotplug}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h2Note that some tests will require root privileges.h]h2Note that some tests will require root privileges.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h](running-the-full-range-hotplug-selftestsah ]h"](running the full range hotplug selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hInstall selftestsh]hInstall selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(hYou can use the "install" target of "make" (which calls the `kselftest_install.sh` tool) to install selftests in the default location (`tools/testing/selftests/kselftest_install`), or in a user specified location via the `INSTALL_PATH` "make" variable.h](hDYou can use the “install” target of “make” (which calls the }(hjhhhNhNubhtitle_reference)}(h`kselftest_install.sh`h]hkselftest_install.sh}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh5 tool) to install selftests in the default location (}(hjhhhNhNubj%)}(h+`tools/testing/selftests/kselftest_install`h]h)tools/testing/selftests/kselftest_install}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh+), or in a user specified location via the }(hjhhhNhNubj%)}(h`INSTALL_PATH`h]h INSTALL_PATH}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh “make” variable.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h*To install selftests in default location::h]h)To install selftests in default location:}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj)}(h)$ make -C tools/testing/selftests installh]h)$ make -C tools/testing/selftests install}hjpsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhj hhubh)}(h3To install selftests in a user specified location::h]h2To install selftests in a user specified location:}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj)}(hG$ make -C tools/testing/selftests install INSTALL_PATH=/some/other/pathh]hG$ make -C tools/testing/selftests install INSTALL_PATH=/some/other/path}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhj hhubeh}(h]install-selftestsah ]h"]install selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hRunning installed selftestsh]hRunning installed selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h{Found in the install directory, as well as in the Kselftest tarball, is a script named `run_kselftest.sh` to run the tests.h](hWFound in the install directory, as well as in the Kselftest tarball, is a script named }(hjhhhNhNubj%)}(h`run_kselftest.sh`h]hrun_kselftest.sh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh to run the tests.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hvYou can simply do the following to run the installed Kselftests. Please note some tests will require root privileges::h]huYou can simply do the following to run the installed Kselftests. Please note some tests will require root privileges:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h+$ cd kselftest_install $ ./run_kselftest.shh]h+$ cd kselftest_install $ ./run_kselftest.sh}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hATo see the list of available tests, the `-l` option can be used::h](h(To see the list of available tests, the }(hjhhhNhNubj%)}(h`-l`h]h-l}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh option can be used:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h$ ./run_kselftest.sh -lh]h$ ./run_kselftest.sh -l}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hThe `-c` option can be used to run all the tests from a test collection, or the `-t` option for specific single tests. Either can be used multiple times::h](hThe }(hjhhhNhNubj%)}(h`-c`h]h-c}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubhH option can be used to run all the tests from a test collection, or the }(hjhhhNhNubj%)}(h`-t`h]h-t}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubhE option for specific single tests. Either can be used multiple times:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hQ$ ./run_kselftest.sh -c size -c seccomp -t timers:posix_timers -t timer:nanosleeph]hQ$ ./run_kselftest.sh -c size -c seccomp -t timers:posix_timers -t timer:nanosleep}hjOsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hJFor other features see the script usage output, seen with the `-h` option.h](h>For other features see the script usage output, seen with the }(hj]hhhNhNubj%)}(h`-h`h]h-h}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j$hj]ubh option.}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]running-installed-selftestsah ]h"]running installed selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hTimeout for selftestsh]hTimeout for selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX:Selftests are designed to be quick and so a default timeout is used of 45 seconds for each test. Tests can override the default timeout by adding a settings file in their directory and set a timeout variable there to the configured a desired upper timeout for the test. Only a few tests override the timeout with a value higher than 45 seconds, selftests strives to keep it that way. Timeouts in selftests are not considered fatal because the system under which a test runs may change and this can also modify the expected time it takes to run a test. If you have control over the systems which will run the tests you can configure a test runner on those systems to use a greater or lower timeout on the command line as with the `-o` or the `--override-timeout` argument. For example to use 165 seconds instead one would use::h](hXSelftests are designed to be quick and so a default timeout is used of 45 seconds for each test. Tests can override the default timeout by adding a settings file in their directory and set a timeout variable there to the configured a desired upper timeout for the test. Only a few tests override the timeout with a value higher than 45 seconds, selftests strives to keep it that way. Timeouts in selftests are not considered fatal because the system under which a test runs may change and this can also modify the expected time it takes to run a test. If you have control over the systems which will run the tests you can configure a test runner on those systems to use a greater or lower timeout on the command line as with the }(hjhhhNhNubj%)}(h`-o`h]h-o}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh or the }(hjhhhNhNubj%)}(h`--override-timeout`h]h--override-timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh@ argument. For example to use 165 seconds instead one would use:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h+$ ./run_kselftest.sh --override-timeout 165h]h+$ ./run_kselftest.sh --override-timeout 165}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hYou can look at the TAP output to see if you ran into the timeout. Test runners which know a test must run under a specific time can then optionally treat these timeouts then as fatal.h]hYou can look at the TAP output to see if you ran into the timeout. Test runners which know a test must run under a specific time can then optionally treat these timeouts then as fatal.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]timeout-for-selftestsah ]h"]timeout for selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hPackaging selftestsh]hPackaging selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(huIn some cases packaging is desired, such as when tests need to run on a different system. To package selftests, run::h]htIn some cases packaging is desired, such as when tests need to run on a different system. To package selftests, run:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h)$ make -C tools/testing/selftests gen_tarh]h)$ make -C tools/testing/selftests gen_tar}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hXThis generates a tarball in the `INSTALL_PATH/kselftest-packages` directory. By default, `.gz` format is used. The tar compression format can be overridden by specifying a `FORMAT` make variable. Any value recognized by `tar's auto-compress`_ option is supported, such as::h](h This generates a tarball in the }(hjhhhNhNubj%)}(h!`INSTALL_PATH/kselftest-packages`h]hINSTALL_PATH/kselftest-packages}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh directory. By default, }(hjhhhNhNubj%)}(h`.gz`h]h.gz}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubhN format is used. The tar compression format can be overridden by specifying a }(hjhhhNhNubj%)}(h`FORMAT`h]hFORMAT}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh( make variable. Any value recognized by }(hjhhhNhNubh)}(h`tar's auto-compress`_h]htar’s auto-compress}(hjWhhhNhNubah}(h]h ]h"]h$]h&]nametar's auto-compressrefuriMhttps://www.gnu.org/software/tar/manual/html_node/gzip.html#auto_002dcompressuh1hhjj9Kubh option is supported, such as:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h4$ make -C tools/testing/selftests gen_tar FORMAT=.xzh]h4$ make -C tools/testing/selftests gen_tar FORMAT=.xz}hjssbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h`make gen_tar` invokes `make install` so you can use it to package a subset of tests by using variables specified in `Running a subset of selftests`_ section::h](j%)}(h`make gen_tar`h]h make gen_tar}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubh invokes }(hjhhhNhNubj%)}(h`make install`h]h make install}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j$hjubhP so you can use it to package a subset of tests by using variables specified in }(hjhhhNhNubh)}(h `Running a subset of selftests`_h]hRunning a subset of selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameRunning a subset of selftestsj7juh1hhjj9Kubh section:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hC$ make -C tools/testing/selftests gen_tar TARGETS="size" FORMAT=.xzh]hC$ make -C tools/testing/selftests gen_tar TARGETS="size" FORMAT=.xz}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubhtarget)}(hf.. _tar's auto-compress: https://www.gnu.org/software/tar/manual/html_node/gzip.html#auto_002dcompressh]h}(h]tar-s-auto-compressah ]h"]tar's auto-compressah$]h&]jgjhuh1jhKhjhhhhjKubeh}(h]packaging-selftestsah ]h"]packaging selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hContributing new testsh]hContributing new tests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h'In general, the rules for selftests areh]h'In general, the rules for selftests are}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh block_quote)}(hXS* Do as much as you can if you're not root; * Don't take too long; * Don't break the build on any architecture, and * Don't cause the top-level "make run_tests" to fail if your feature is unconfigured. * The output of tests must conform to the TAP standard to ensure high testing quality and to capture failures/errors with specific details. The kselftest.h and kselftest_harness.h headers provide wrappers for outputting test results. These wrappers should be used for pass, fail, exit, and skip messages. CI systems can easily parse TAP output messages to detect test results. h]h bullet_list)}(hhh](h list_item)}(h*Do as much as you can if you're not root; h]h)}(h)Do as much as you can if you're not root;h]h+Do as much as you can if you’re not root;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hDon't take too long; h]h)}(hDon't take too long;h]hDon’t take too long;}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h/Don't break the build on any architecture, and h]h)}(h.Don't break the build on any architecture, andh]h0Don’t break the build on any architecture, and}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjCubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hTDon't cause the top-level "make run_tests" to fail if your feature is unconfigured. h]h)}(hSDon't cause the top-level "make run_tests" to fail if your feature is unconfigured.h]hYDon’t cause the top-level “make run_tests” to fail if your feature is unconfigured.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hXwThe output of tests must conform to the TAP standard to ensure high testing quality and to capture failures/errors with specific details. The kselftest.h and kselftest_harness.h headers provide wrappers for outputting test results. These wrappers should be used for pass, fail, exit, and skip messages. CI systems can easily parse TAP output messages to detect test results. h]h)}(hXvThe output of tests must conform to the TAP standard to ensure high testing quality and to capture failures/errors with specific details. The kselftest.h and kselftest_harness.h headers provide wrappers for outputting test results. These wrappers should be used for pass, fail, exit, and skip messages. CI systems can easily parse TAP output messages to detect test results.h]hXvThe output of tests must conform to the TAP standard to ensure high testing quality and to capture failures/errors with specific details. The kselftest.h and kselftest_harness.h headers provide wrappers for outputting test results. These wrappers should be used for pass, fail, exit, and skip messages. CI systems can easily parse TAP output messages to detect test results.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjsubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet*uh1j hhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]contributing-new-testsah ]h"]contributing new testsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Contributing new tests (details)h]h Contributing new tests (details)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj)}(hX9 * In your Makefile, use facilities from lib.mk by including it instead of reinventing the wheel. Specify flags and binaries generation flags on need basis before including lib.mk. :: CFLAGS = $(KHDR_INCLUDES) TEST_GEN_PROGS := close_range_test include ../lib.mk * Use TEST_GEN_XXX if such binaries or files are generated during compiling. TEST_PROGS, TEST_GEN_PROGS mean it is the executable tested by default. TEST_GEN_MODS_DIR should be used by tests that require modules to be built before the test starts. The variable will contain the name of the directory containing the modules. TEST_CUSTOM_PROGS should be used by tests that require custom build rules and prevent common build rule use. TEST_PROGS are for test shell scripts. Please ensure shell script has its exec bit set. Otherwise, lib.mk run_tests will generate a warning. TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests. TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the executable which is not tested by default. TEST_FILES, TEST_GEN_FILES mean it is the file which is used by test. TEST_INCLUDES is similar to TEST_FILES, it lists files which should be included when exporting or installing the tests, with the following differences: * symlinks to files in other directories are preserved * the part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory TEST_INCLUDES is meant to list dependencies located in other directories of the selftests hierarchy. * First use the headers inside the kernel source and/or git repo, and then the system headers. Headers for the kernel release as opposed to headers installed by the distro on the system should be the primary focus to be able to find regressions. Use KHDR_INCLUDES in Makefile to include headers from the kernel source. * If a test needs specific kernel config options enabled, add a config file in the test directory to enable them. e.g: tools/testing/selftests/android/config * Create a .gitignore file inside test directory and add all generated objects in it. * Add new test name in TARGETS in selftests/Makefile:: TARGETS += android * All changes should pass:: kselftest-{all,install,clean,gen_tar} kselftest-{all,install,clean,gen_tar} O=abo_path kselftest-{all,install,clean,gen_tar} O=rel_path make -C tools/testing/selftests {all,install,clean,gen_tar} make -C tools/testing/selftests {all,install,clean,gen_tar} O=abs_path make -C tools/testing/selftests {all,install,clean,gen_tar} O=rel_path h]j )}(hhh](j)}(hXIn your Makefile, use facilities from lib.mk by including it instead of reinventing the wheel. Specify flags and binaries generation flags on need basis before including lib.mk. :: CFLAGS = $(KHDR_INCLUDES) TEST_GEN_PROGS := close_range_test include ../lib.mk h](h)}(hIn your Makefile, use facilities from lib.mk by including it instead of reinventing the wheel. Specify flags and binaries generation flags on need basis before including lib.mk. ::h]hIn your Makefile, use facilities from lib.mk by including it instead of reinventing the wheel. Specify flags and binaries generation flags on need basis before including lib.mk.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(hNCFLAGS = $(KHDR_INCLUDES) TEST_GEN_PROGS := close_range_test include ../lib.mkh]hNCFLAGS = $(KHDR_INCLUDES) TEST_GEN_PROGS := close_range_test include ../lib.mk}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hXUse TEST_GEN_XXX if such binaries or files are generated during compiling. TEST_PROGS, TEST_GEN_PROGS mean it is the executable tested by default. TEST_GEN_MODS_DIR should be used by tests that require modules to be built before the test starts. The variable will contain the name of the directory containing the modules. TEST_CUSTOM_PROGS should be used by tests that require custom build rules and prevent common build rule use. TEST_PROGS are for test shell scripts. Please ensure shell script has its exec bit set. Otherwise, lib.mk run_tests will generate a warning. TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests. TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the executable which is not tested by default. TEST_FILES, TEST_GEN_FILES mean it is the file which is used by test. TEST_INCLUDES is similar to TEST_FILES, it lists files which should be included when exporting or installing the tests, with the following differences: * symlinks to files in other directories are preserved * the part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory TEST_INCLUDES is meant to list dependencies located in other directories of the selftests hierarchy. h](h)}(hJUse TEST_GEN_XXX if such binaries or files are generated during compiling.h]hJUse TEST_GEN_XXX if such binaries or files are generated during compiling.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hGTEST_PROGS, TEST_GEN_PROGS mean it is the executable tested by default.h]hGTEST_PROGS, TEST_GEN_PROGS mean it is the executable tested by default.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hTEST_GEN_MODS_DIR should be used by tests that require modules to be built before the test starts. The variable will contain the name of the directory containing the modules.h]hTEST_GEN_MODS_DIR should be used by tests that require modules to be built before the test starts. The variable will contain the name of the directory containing the modules.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hlTEST_CUSTOM_PROGS should be used by tests that require custom build rules and prevent common build rule use.h]hlTEST_CUSTOM_PROGS should be used by tests that require custom build rules and prevent common build rule use.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjubh)}(hTEST_PROGS are for test shell scripts. Please ensure shell script has its exec bit set. Otherwise, lib.mk run_tests will generate a warning.h]hTEST_PROGS are for test shell scripts. Please ensure shell script has its exec bit set. Otherwise, lib.mk run_tests will generate a warning.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hATEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests.h]hATEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hfTEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the executable which is not tested by default.h]hfTEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the executable which is not tested by default.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hETEST_FILES, TEST_GEN_FILES mean it is the file which is used by test.h]hETEST_FILES, TEST_GEN_FILES mean it is the file which is used by test.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(hTEST_INCLUDES is similar to TEST_FILES, it lists files which should be included when exporting or installing the tests, with the following differences:h]hTEST_INCLUDES is similar to TEST_FILES, it lists files which should be included when exporting or installing the tests, with the following differences:}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubj)}(h* symlinks to files in other directories are preserved * the part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory h]j )}(hhh](j)}(h4symlinks to files in other directories are preservedh]h)}(hjjh]h4symlinks to files in other directories are preserved}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhubah}(h]h ]h"]h$]h&]uh1jhjeubj)}(hmthe part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory h]h)}(hlthe part of paths below tools/testing/selftests/ is preserved when copying the files to the output directoryh]hlthe part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]jjuh1j hhhMhjaubah}(h]h ]h"]h$]h&]uh1jhhhMhjubh)}(hdTEST_INCLUDES is meant to list dependencies located in other directories of the selftests hierarchy.h]hdTEST_INCLUDES is meant to list dependencies located in other directories of the selftests hierarchy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM"hjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hX>First use the headers inside the kernel source and/or git repo, and then the system headers. Headers for the kernel release as opposed to headers installed by the distro on the system should be the primary focus to be able to find regressions. Use KHDR_INCLUDES in Makefile to include headers from the kernel source. h]h)}(hX=First use the headers inside the kernel source and/or git repo, and then the system headers. Headers for the kernel release as opposed to headers installed by the distro on the system should be the primary focus to be able to find regressions. Use KHDR_INCLUDES in Makefile to include headers from the kernel source.h]hX=First use the headers inside the kernel source and/or git repo, and then the system headers. Headers for the kernel release as opposed to headers installed by the distro on the system should be the primary focus to be able to find regressions. Use KHDR_INCLUDES in Makefile to include headers from the kernel source.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hIf a test needs specific kernel config options enabled, add a config file in the test directory to enable them. e.g: tools/testing/selftests/android/config h](h)}(hoIf a test needs specific kernel config options enabled, add a config file in the test directory to enable them.h]hoIf a test needs specific kernel config options enabled, add a config file in the test directory to enable them.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjubh)}(h+e.g: tools/testing/selftests/android/configh]h+e.g: tools/testing/selftests/android/config}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM.hjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hTCreate a .gitignore file inside test directory and add all generated objects in it. h]h)}(hSCreate a .gitignore file inside test directory and add all generated objects in it.h]hSCreate a .gitignore file inside test directory and add all generated objects in it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hJAdd new test name in TARGETS in selftests/Makefile:: TARGETS += android h](h)}(h4Add new test name in TARGETS in selftests/Makefile::h]h3Add new test name in TARGETS in selftests/Makefile:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hj ubj)}(hTARGETS += androidh]hTARGETS += android}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhM5hj ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hXsAll changes should pass:: kselftest-{all,install,clean,gen_tar} kselftest-{all,install,clean,gen_tar} O=abo_path kselftest-{all,install,clean,gen_tar} O=rel_path make -C tools/testing/selftests {all,install,clean,gen_tar} make -C tools/testing/selftests {all,install,clean,gen_tar} O=abs_path make -C tools/testing/selftests {all,install,clean,gen_tar} O=rel_path h](h)}(hAll changes should pass::h]hAll changes should pass:}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM7hj3 ubj)}(hXQkselftest-{all,install,clean,gen_tar} kselftest-{all,install,clean,gen_tar} O=abo_path kselftest-{all,install,clean,gen_tar} O=rel_path make -C tools/testing/selftests {all,install,clean,gen_tar} make -C tools/testing/selftests {all,install,clean,gen_tar} O=abs_path make -C tools/testing/selftests {all,install,clean,gen_tar} O=rel_pathh]hXQkselftest-{all,install,clean,gen_tar} kselftest-{all,install,clean,gen_tar} O=abo_path kselftest-{all,install,clean,gen_tar} O=rel_path make -C tools/testing/selftests {all,install,clean,gen_tar} make -C tools/testing/selftests {all,install,clean,gen_tar} O=abs_path make -C tools/testing/selftests {all,install,clean,gen_tar} O=rel_path}hjE sbah}(h]h ]h"]h$]h&]jjuh1jhhhM9hj3 ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1j hhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]contributing-new-tests-detailsah ]h"] contributing new tests (details)ah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Test Moduleh]h Test Module}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm hhhhhMAubh)}(hXKselftest tests the kernel from userspace. Sometimes things need testing from within the kernel, one method of doing this is to create a test module. We can tie the module into the kselftest framework by using a shell script test runner. ``kselftest/module.sh`` is designed to facilitate this process. There is also a header file provided to assist writing kernel modules that are for use with kselftest:h](hKselftest tests the kernel from userspace. Sometimes things need testing from within the kernel, one method of doing this is to create a test module. We can tie the module into the kselftest framework by using a shell script test runner. }(hj~ hhhNhNubhliteral)}(h``kselftest/module.sh``h]hkselftest/module.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj~ ubh is designed to facilitate this process. There is also a header file provided to assist writing kernel modules that are for use with kselftest:}(hj~ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMChjm hhubj )}(hhh](j)}(h.``tools/testing/selftests/kselftest_module.h``h]h)}(hj h]j )}(hj h]h*tools/testing/selftests/kselftest_module.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhhhMJhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(h0``tools/testing/selftests/kselftest/module.sh`` h]h)}(h/``tools/testing/selftests/kselftest/module.sh``h]j )}(hj h]h+tools/testing/selftests/kselftest/module.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhhhMKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubeh}(h]h ]h"]h$]h&]j-uh1j hhhMJhjm hhubh)}(hXNote that test modules should taint the kernel with TAINT_TEST. This will happen automatically for modules which are in the ``tools/testing/`` directory, or for modules which use the ``kselftest_module.h`` header above. Otherwise, you'll need to add ``MODULE_INFO(test, "Y")`` to your module source. selftests which do not load modules typically should not taint the kernel, but in cases where a non-test module is loaded, TEST_TAINT can be applied from userspace by writing to ``/proc/sys/kernel/tainted``.h](h|Note that test modules should taint the kernel with TAINT_TEST. This will happen automatically for modules which are in the }(hj hhhNhNubj )}(h``tools/testing/``h]htools/testing/}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh) directory, or for modules which use the }(hj hhhNhNubj )}(h``kselftest_module.h``h]hkselftest_module.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh/ header above. Otherwise, you’ll need to add }(hj hhhNhNubj )}(h``MODULE_INFO(test, "Y")``h]hMODULE_INFO(test, "Y")}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh to your module source. selftests which do not load modules typically should not taint the kernel, but in cases where a non-test module is loaded, TEST_TAINT can be applied from userspace by writing to }(hj hhhNhNubj )}(h``/proc/sys/kernel/tainted``h]h/proc/sys/kernel/tainted}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMMhjm hhubh)}(hhh](h)}(h How to useh]h How to use}(hjD hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjA hhhhhMVubh)}(h|Here we show the typical steps to create a test module and tie it into kselftest. We use kselftests for lib/ as an example.h]h|Here we show the typical steps to create a test module and tie it into kselftest. We use kselftests for lib/ as an example.}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhjA hhubhenumerated_list)}(hhh](j)}(hCreate the test module h]h)}(hCreate the test moduleh]hCreate the test module}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hje ubah}(h]h ]h"]h$]h&]uh1jhjb hhhhhNubj)}(hmCreate the test script that will run (load/unload) the module e.g. ``tools/testing/selftests/lib/bitmap.sh`` h]h)}(hlCreate the test script that will run (load/unload) the module e.g. ``tools/testing/selftests/lib/bitmap.sh``h](hCCreate the test script that will run (load/unload) the module e.g. }(hj hhhNhNubj )}(h)``tools/testing/selftests/lib/bitmap.sh``h]h%tools/testing/selftests/lib/bitmap.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1hhhhM]hj} ubah}(h]h ]h"]h$]h&]uh1jhjb hhhhhNubj)}(hDAdd line to config file e.g. ``tools/testing/selftests/lib/config`` h]h)}(hCAdd line to config file e.g. ``tools/testing/selftests/lib/config``h](hAdd line to config file e.g. }(hj hhhNhNubj )}(h&``tools/testing/selftests/lib/config``h]h"tools/testing/selftests/lib/config}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1hhhhM`hj ubah}(h]h ]h"]h$]h&]uh1jhjb hhhhhNubj)}(hKAdd test script to makefile e.g. ``tools/testing/selftests/lib/Makefile`` h]h)}(hJAdd test script to makefile e.g. ``tools/testing/selftests/lib/Makefile``h](h"Add test script to makefile e.g. }(hj hhhNhNubj )}(h(``tools/testing/selftests/lib/Makefile``h]h$tools/testing/selftests/lib/Makefile}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1hhhhMbhj ubah}(h]h ]h"]h$]h&]uh1jhjb hhhhhNubj)}(hVerify it works: h]h)}(hVerify it works:h]hVerify it works:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhj ubah}(h]h ]h"]h$]h&]uh1jhjb hhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j` hjA hhhhhM[ubj)}(h# Assumes you have booted a fresh build of this kernel tree cd /path/to/linux/tree make kselftest-merge make modules sudo make modules_install make TARGETS=lib kselftesth]h# Assumes you have booted a fresh build of this kernel tree cd /path/to/linux/tree make kselftest-merge make modules sudo make modules_install make TARGETS=lib kselftest}hj sbah}(h]h ]h"]h$]h&]jjforcelanguageshhighlight_args}uh1jhhhMfhjA hhubeh}(h] how-to-useah ]h"] how to useah$]h&]uh1hhjm hhhhhMVubh)}(hhh](h)}(hExample Moduleh]hExample Module}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj- hhhhhMpubh)}(h.A bare bones test module might look like this:h]h.A bare bones test module might look like this:}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMrhj- hhubj)}(hX// SPDX-License-Identifier: GPL-2.0+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include "../tools/testing/selftests/kselftest_module.h" KSTM_MODULE_GLOBALS(); /* * Kernel module for testing the foobinator */ static int __init test_function() { ... } static void __init selftest(void) { KSTM_CHECK_ZERO(do_test_case("", 0)); } KSTM_MODULE_LOADERS(test_foo); MODULE_AUTHOR("John Developer "); MODULE_LICENSE("GPL"); MODULE_INFO(test, "Y");h]hX// SPDX-License-Identifier: GPL-2.0+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include "../tools/testing/selftests/kselftest_module.h" KSTM_MODULE_GLOBALS(); /* * Kernel module for testing the foobinator */ static int __init test_function() { ... } static void __init selftest(void) { KSTM_CHECK_ZERO(do_test_case("", 0)); } KSTM_MODULE_LOADERS(test_foo); MODULE_AUTHOR("John Developer "); MODULE_LICENSE("GPL"); MODULE_INFO(test, "Y");}hjL sbah}(h]h ]h"]h$]h&]jjj j! cj# }uh1jhhhMthj- hhubeh}(h]example-moduleah ]h"]example moduleah$]h&]uh1hhjm hhhhhMpubh)}(hhh](h)}(hExample test scripth]hExample test script}(hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjd hhhhhMubj)}(hc#!/bin/bash # SPDX-License-Identifier: GPL-2.0+ $(dirname $0)/../kselftest/module.sh "foo" test_fooh]hc#!/bin/bash # SPDX-License-Identifier: GPL-2.0+ $(dirname $0)/../kselftest/module.sh "foo" test_foo}hju sbah}(h]h ]h"]h$]h&]jjj j! shj# }uh1jhhhMhjd hhubeh}(h]example-test-scriptah ]h"]example test scriptah$]h&]uh1hhjm hhhhhMubeh}(h]jNah ]h"] test moduleah$]h&]uh1hhhhhhhhMAjKubh)}(hhh](h)}(h Test Harnessh]h Test Harness}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubh)}(hThe kselftest_harness.h file contains useful helpers to build tests. The test harness is for userspace testing, for kernel space testing see `Test Module`_ above.h](hThe kselftest_harness.h file contains useful helpers to build tests. The test harness is for userspace testing, for kernel space testing see }(hj hhhNhNubh)}(h`Test Module`_h]h Test Module}(hj hhhNhNubah}(h]h ]h"]h$]h&]name Test Modulej7jNuh1hhj j9Kubh above.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hTThe tests from tools/testing/selftests/seccomp/seccomp_bpf.c can be used as example.h]hTThe tests from tools/testing/selftests/seccomp/seccomp_bpf.c can be used as example.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hhh](h)}(hExampleh]hExample}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubj)}(hX#include "kselftest_harness.h" TEST(standalone_test) { do_some_stuff; EXPECT_GT(10, stuff) { stuff_state_t state; enumerate_stuff_state(&state); TH_LOG("expectation failed with state: %s", state.msg); } more_stuff; ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!"); last_stuff; EXPECT_EQ(0, last_stuff); } FIXTURE(my_fixture) { mytype_t *data; int awesomeness_level; }; FIXTURE_SETUP(my_fixture) { self->data = mytype_new(); ASSERT_NE(NULL, self->data); } FIXTURE_TEARDOWN(my_fixture) { mytype_free(self->data); } TEST_F(my_fixture, data_is_good) { EXPECT_EQ(1, is_my_data_good(self->data)); } TEST_HARNESS_MAINh]hX#include "kselftest_harness.h" TEST(standalone_test) { do_some_stuff; EXPECT_GT(10, stuff) { stuff_state_t state; enumerate_stuff_state(&state); TH_LOG("expectation failed with state: %s", state.msg); } more_stuff; ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!"); last_stuff; EXPECT_EQ(0, last_stuff); } FIXTURE(my_fixture) { mytype_t *data; int awesomeness_level; }; FIXTURE_SETUP(my_fixture) { self->data = mytype_new(); ASSERT_NE(NULL, self->data); } FIXTURE_TEARDOWN(my_fixture) { mytype_free(self->data); } TEST_F(my_fixture, data_is_good) { EXPECT_EQ(1, is_my_data_good(self->data)); } TEST_HARNESS_MAIN}hj sbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:424: ./tools/testing/selftests/kselftest_harness.hhK hj hhubeh}(h]exampleah ]h"]exampleah$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(hHelpersh]hHelpers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleTH_LOG (C macro)c.TH_LOGhNtauh1j hj hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhNubhdesc)}(hhh](hdesc_signature)}(hTH_LOGh]hdesc_signature_line)}(hTH_LOGh]h desc_name)}(hTH_LOGh]h desc_sig_name)}(hj* h]hTH_LOG}(hj: hhhNhNubah}(h]h ]nah"]h$]h&]uh1j8 hj4 ubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1j2 hj. hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhK^ubah}(h]h ]h"]h$]h&]jj add_permalinkuh1j, sphinx_line_type declaratorhj( hhhjP hK^ubah}(h]j ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j& hjP hK^hj# hhubh desc_content)}(hhh]h}(h]h ]h"]h$]h&]uh1je hj# hhhjP hK^ubeh}(h]h ](jZ macroeh"]h$]h&]domainjZ objtypejs desctypejs noindex noindexentrynocontentsentryuh1j! hhhj hj hNubh)}(h``TH_LOG (fmt, ...)``h]j )}(hj h]hTH_LOG (fmt, ...)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj} ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhK`hj hhubh container)}(hX[**Parameters** ``fmt`` format string ``...`` optional arguments **Description** .. code-block:: c TH_LOG(format, ...) Optional debug logging function available for use in tests. Logging may be enabled or disabled by defining TH_LOG_ENABLED. E.g., #define TH_LOG_ENABLED 1 If no definition is provided, logging is enabled by default.h](h)}(h**Parameters**h]hstrong)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKbhj ubhdefinition_list)}(hhh](hdefinition_list_item)}(h``fmt`` format string h](hterm)}(h``fmt``h]j )}(hj h]hfmt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhK`hj ubh definition)}(hhh]h)}(h format stringh]h format string}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK`hj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj hK`hj ubj )}(h``...`` optional arguments h](j )}(h``...``h]j )}(hj h]h...}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKahj ubj )}(hhh]h)}(hoptional argumentsh]hoptional arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKahj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj hKahj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j )}(hj: h]h Description}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8 ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKchj ubj)}(hTH_LOG(format, ...)h]hTH_LOG(format, ...)}hjP sbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhK_hj ubh)}(hOptional debug logging function available for use in tests. Logging may be enabled or disabled by defining TH_LOG_ENABLED. E.g., #define TH_LOG_ENABLED 1h]hOptional debug logging function available for use in tests. Logging may be enabled or disabled by defining TH_LOG_ENABLED. E.g., #define TH_LOG_ENABLED 1}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKchj ubh)}(hubah}(h]h ]h"]h$]h&]uh1j hj"ubeh}(h]h ]h"]h$]h&]uh1j hj=hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjch]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j hjaubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj)}(hTEST(name) { implementation }h]hTEST(name) { implementation }}hjysbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(hDefines a test by name. Names must be unique and tests must not be run in parallel. The implementation containing block is a function and scoping should be treated as such. Returning early may be performed with a bare "return;" statement.h]hDefines a test by name. Names must be unique and tests must not be run in parallel. The implementation containing block is a function and scoping should be treated as such. Returning early may be performed with a bare “return;” statement.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(h8EXPECT_* and ASSERT_* are valid in a TEST() { } context.h]h8EXPECT_* and ASSERT_* are valid in a TEST() { } context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j TEST_SIGNAL (C macro) c.TEST_SIGNALhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(h TEST_SIGNALh]j- )}(h TEST_SIGNALh]j3 )}(h TEST_SIGNALh]j9 )}(hjh]h TEST_SIGNAL}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhKubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhKhjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhKubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhj hj hNubh)}(h#``TEST_SIGNAL (test_name, signal)``h]j )}(hjh]hTEST_SIGNAL (test_name, signal)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhj hhubj )}(hX**Parameters** ``test_name`` test name ``signal`` signal number **Description** .. code-block:: c TEST_SIGNAL(name, signal) { implementation } Defines a test by name and the expected term signal. Names must be unique and tests must not be run in parallel. The implementation containing block is a function and scoping should be treated as such. Returning early may be performed with a bare "return;" statement. EXPECT_* and ASSERT_* are valid in a TEST() { } context.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh](j )}(h``test_name`` test name h](j )}(h ``test_name``h]j )}(hj8h]h test_name}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhj2ubj )}(hhh]h)}(h test nameh]h test name}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhKhjNubah}(h]h ]h"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]uh1j hjMhKhj/ubj )}(h``signal`` signal number h](j )}(h ``signal``h]j )}(hjqh]hsignal}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j hjoubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjkubj )}(hhh]h)}(h signal numberh]h signal number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjkubeh}(h]h ]h"]h$]h&]uh1j hjhKhj/ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj)}(h,TEST_SIGNAL(name, signal) { implementation }h]h,TEST_SIGNAL(name, signal) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(hX Defines a test by name and the expected term signal. Names must be unique and tests must not be run in parallel. The implementation containing block is a function and scoping should be treated as such. Returning early may be performed with a bare "return;" statement.h]hXDefines a test by name and the expected term signal. Names must be unique and tests must not be run in parallel. The implementation containing block is a function and scoping should be treated as such. Returning early may be performed with a bare “return;” statement.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(h8EXPECT_* and ASSERT_* are valid in a TEST() { } context.h]h8EXPECT_* and ASSERT_* are valid in a TEST() { } context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j FIXTURE_DATA (C macro)c.FIXTURE_DATAhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(h FIXTURE_DATAh]j- )}(h FIXTURE_DATAh]j3 )}(h FIXTURE_DATAh]j9 )}(hj h]h FIXTURE_DATA}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhj'hKubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj'hKhjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhj'hKubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j@jy j@jz j{ j| uh1j! hhhj hj hNubh)}(h ``FIXTURE_DATA (datatype_name)``h]j )}(hjFh]hFIXTURE_DATA (datatype_name)}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjDubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhj hhubj)}(hBWraps the struct name so we have one less argument to pass around h]h)}(hAWraps the struct name so we have one less argument to pass aroundh]hAWraps the struct name so we have one less argument to pass around}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhj\ubah}(h]h ]h"]h$]h&]uh1jhjnhKhj hhubj )}(hXU**Parameters** ``datatype_name`` datatype name **Description** .. code-block:: c FIXTURE_DATA(datatype_name) Almost always, you want just FIXTURE() instead (see below). This call may be used when the type of the fixture data is needed. In general, this should not be needed unless the *self* is being passed to a helper directly.h](h)}(h**Parameters**h]j )}(hj{h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjyubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjuubj )}(hhh]j )}(h ``datatype_name`` datatype name h](j )}(h``datatype_name``h]j )}(hjh]h datatype_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh]h)}(h datatype nameh]h datatype name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1j hjuubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjuubj)}(hFIXTURE_DATA(datatype_name)h]hFIXTURE_DATA(datatype_name)}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjuubh)}(hAlmost always, you want just FIXTURE() instead (see below). This call may be used when the type of the fixture data is needed. In general, this should not be needed unless the *self* is being passed to a helper directly.h](hAlmost always, you want just FIXTURE() instead (see below). This call may be used when the type of the fixture data is needed. In general, this should not be needed unless the }(hjhhhNhNubhemphasis)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& is being passed to a helper directly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjuubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j FIXTURE (C macro) c.FIXTUREhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(hFIXTUREh]j- )}(hFIXTUREh]j3 )}(hFIXTUREh]j9 )}(hj8h]hFIXTURE}(hjBhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj>ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj:hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj6hhhjUhKubah}(h]j1ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjUhKhj3hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj3hhhjUhKubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jnjy jnjz j{ j| uh1j! hhhj hj hNubh)}(h``FIXTURE (fixture_name)``h]j )}(hjth]hFIXTURE (fixture_name)}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjrubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhj hhubj)}(h7Called once per fixture to setup the data and register h]h)}(h6Called once per fixture to setup the data and registerh]h6Called once per fixture to setup the data and register}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhj hhubj )}(hX,**Parameters** ``fixture_name`` fixture name **Description** .. code-block:: c FIXTURE(fixture_name) { type property1; ... }; Defines the data provided to TEST_F()-defined tests as *self*. It should be populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j )}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj)}(h2FIXTURE(fixture_name) { type property1; ... };h]h2FIXTURE(fixture_name) { type property1; ... };}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(hDefines the data provided to TEST_F()-defined tests as *self*. It should be populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().h](h7Defines the data provided to TEST_F()-defined tests as }(hj)hhhNhNubj)}(h*self*h]hself}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubhV. It should be populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j FIXTURE_SETUP (C macro)c.FIXTURE_SETUPhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(h FIXTURE_SETUPh]j- )}(h FIXTURE_SETUPh]j3 )}(h FIXTURE_SETUPh]j9 )}(hjdh]h FIXTURE_SETUP}(hjnhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjfhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjbhhhjhKubah}(h]j]ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhKhj_hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj_hhhjhKubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhj hj hNubh)}(h ``FIXTURE_SETUP (fixture_name)``h]j )}(hjh]hFIXTURE_SETUP (fixture_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhj hhubj)}(huPrepares the setup function for the fixture. *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. h]h)}(htPrepares the setup function for the fixture. *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly.h](h-Prepares the setup function for the fixture. }(hjhhhNhNubj)}(h *_metadata*h]h _metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh< is included so that EXPECT_*, ASSERT_* etc. work correctly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhj hhubj )}(hX**Parameters** ``fixture_name`` fixture name **Description** .. code-block:: c FIXTURE_SETUP(fixture_name) { implementation } Populates the required "setup" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation. ASSERT_* are valid for use in this context and will prempt the execution of any dependent fixture tests. A bare "return;" statement may be used to return early.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j )}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjAh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j hj?ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubj)}(h.FIXTURE_SETUP(fixture_name) { implementation }h]h.FIXTURE_SETUP(fixture_name) { implementation }}hjWsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(hPopulates the required "setup" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation.h](hPopulates the required “setup” function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as }(hjghhhNhNubj)}(h*self*h]hself}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubh for the implementation.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(hhASSERT_* are valid for use in this context and will prempt the execution of any dependent fixture tests.h]hhASSERT_* are valid for use in this context and will prempt the execution of any dependent fixture tests.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h7A bare "return;" statement may be used to return early.h]h;A bare “return;” statement may be used to return early.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j FIXTURE_TEARDOWN (C macro)c.FIXTURE_TEARDOWNhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(hFIXTURE_TEARDOWNh]j- )}(hFIXTURE_TEARDOWNh]j3 )}(hFIXTURE_TEARDOWNh]j9 )}(hjh]hFIXTURE_TEARDOWN}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhMubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhMhjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhj hj hNubh)}(h#``FIXTURE_TEARDOWN (fixture_name)``h]j )}(hjh]hFIXTURE_TEARDOWN (fixture_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhj hhubj )}(hX**Parameters** ``fixture_name`` fixture name **Description** *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. .. code-block:: c FIXTURE_TEARDOWN(fixture_name) { implementation } Populates the required "teardown" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation to clean up. A bare "return;" statement may be used to return early.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j )}(hj7h]h fixture_name}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhj1ubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjMubah}(h]h ]h"]h$]h&]uh1j hj1ubeh}(h]h ]h"]h$]h&]uh1j hjLhMhj.ubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j hjpubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(hG*_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly.h](j)}(h *_metadata*h]h _metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh< is included so that EXPECT_*, ASSERT_* etc. work correctly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubj)}(h1FIXTURE_TEARDOWN(fixture_name) { implementation }h]h1FIXTURE_TEARDOWN(fixture_name) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(hPopulates the required "teardown" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation to clean up.h](hPopulates the required “teardown” function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as }(hjhhhNhNubj)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh$ for the implementation to clean up.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h7A bare "return;" statement may be used to return early.h]h;A bare “return;” statement may be used to return early.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j FIXTURE_VARIANT (C macro)c.FIXTURE_VARIANThNtauh1j hj hhhj hNubj" )}(hhh](j' )}(hFIXTURE_VARIANTh]j- )}(hFIXTURE_VARIANTh]j3 )}(hFIXTURE_VARIANTh]j9 )}(hjh]hFIXTURE_VARIANT}(hj hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMDubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhMDubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhMDhjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhMDubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j5jy j5jz j{ j| uh1j! hhhj hj hNubh)}(h"``FIXTURE_VARIANT (fixture_name)``h]j )}(hj;h]hFIXTURE_VARIANT (fixture_name)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj9ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMFhj hhubj)}(h>Optionally called once per fixture to declare fixture variant h]h)}(h=Optionally called once per fixture to declare fixture varianth]h=Optionally called once per fixture to declare fixture variant}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMDhjQubah}(h]h ]h"]h$]h&]uh1jhjchMDhj hhubj )}(hXO**Parameters** ``fixture_name`` fixture name **Description** .. code-block:: c FIXTURE_VARIANT(fixture_name) { type property1; ... }; Defines type of constant parameters provided to FIXTURE_SETUP(), TEST_F() and FIXTURE_TEARDOWN as *variant*. Variants allow the same tests to be run with different arguments.h](h)}(h**Parameters**h]j )}(hjph]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjnubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMHhjjubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j )}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMGhjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMGhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMGhjubah}(h]h ]h"]h$]h&]uh1j hjjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMIhjjubj)}(h:FIXTURE_VARIANT(fixture_name) { type property1; ... };h]h:FIXTURE_VARIANT(fixture_name) { type property1; ... };}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMHhjjubh)}(hDefines type of constant parameters provided to FIXTURE_SETUP(), TEST_F() and FIXTURE_TEARDOWN as *variant*. Variants allow the same tests to be run with different arguments.h](hbDefines type of constant parameters provided to FIXTURE_SETUP(), TEST_F() and FIXTURE_TEARDOWN as }(hjhhhNhNubj)}(h *variant*h]hvariant}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhC. Variants allow the same tests to be run with different arguments.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMOhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j FIXTURE_VARIANT_ADD (C macro)c.FIXTURE_VARIANT_ADDhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(hFIXTURE_VARIANT_ADDh]j- )}(hFIXTURE_VARIANT_ADDh]j3 )}(hFIXTURE_VARIANT_ADDh]j9 )}(hj+h]hFIXTURE_VARIANT_ADD}(hj5hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj1ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj-hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMWubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj)hhhjHhMWubah}(h]j$ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjHhMWhj&hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj&hhhjHhMWubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jajy jajz j{ j| uh1j! hhhj hj hNubh)}(h4``FIXTURE_VARIANT_ADD (fixture_name, variant_name)``h]j )}(hjgh]h0FIXTURE_VARIANT_ADD (fixture_name, variant_name)}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j hjeubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMYhj hhubj)}(h?Called once per fixture variant to setup and register the data h]h)}(h>Called once per fixture variant to setup and register the datah]h>Called once per fixture variant to setup and register the data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMWhj}ubah}(h]h ]h"]h$]h&]uh1jhjhMWhj hhubj )}(hXz**Parameters** ``fixture_name`` fixture name ``variant_name`` name of the parameter set **Description** .. code-block:: c FIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... }; Defines a variant of the test fixture, provided to FIXTURE_SETUP() and TEST_F() as *variant*. Tests of each fixture will be run once for each variant.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM[hjubj )}(hhh](j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j )}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMZhjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMZhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMZhjubj )}(h+``variant_name`` name of the parameter set h](j )}(h``variant_name``h]j )}(hjh]h variant_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM[hjubj )}(hhh]h)}(hname of the parameter seth]hname of the parameter set}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM[hj ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hj hM[hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hj/h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM]hjubj)}(hOFIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... };h]hOFIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... };}hjEsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM\hjubh)}(hDefines a variant of the test fixture, provided to FIXTURE_SETUP() and TEST_F() as *variant*. Tests of each fixture will be run once for each variant.h](hSDefines a variant of the test fixture, provided to FIXTURE_SETUP() and TEST_F() as }(hjUhhhNhNubj)}(h *variant*h]hvariant}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh:. Tests of each fixture will be run once for each variant.}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMchjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j TEST_F (C macro)c.TEST_FhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(hTEST_Fh]j- )}(hTEST_Fh]j3 )}(hTEST_Fh]j9 )}(hjh]hTEST_F}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMyubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhMyubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhMyhjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhMyubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhj hj hNubh)}(h$``TEST_F (fixture_name, test_name)``h]j )}(hjh]h TEST_F (fixture_name, test_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM{hj hhubj)}(hAEmits test registration and helpers for fixture-based test cases h]h)}(h@Emits test registration and helpers for fixture-based test casesh]h@Emits test registration and helpers for fixture-based test cases}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMyhjubah}(h]h ]h"]h$]h&]uh1jhjhMyhj hhubj )}(hXx**Parameters** ``fixture_name`` fixture name ``test_name`` test name **Description** .. code-block:: c TEST_F(fixture, name) { implementation } Defines a test that depends on a fixture (e.g., is part of a test case). Very similar to TEST() except that *self* is the setup instance of fixture's datatype exposed for use by the implementation. The _metadata object is shared (MAP_SHARED) with all the potential forked processes, which enables them to use EXCEPT_*() and ASSERT_*(). The *self* object is only shared with the potential forked processes if FIXTURE_TEARDOWN_PARENT() is used instead of FIXTURE_TEARDOWN().h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM}hjubj )}(hhh](j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j )}(hj h]h fixture_name}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM|hjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hM|hj6ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hj5hM|hjubj )}(h``test_name`` test name h](j )}(h ``test_name``h]j )}(hjYh]h test_name}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjWubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM}hjSubj )}(hhh]h)}(h test nameh]h test name}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhM}hjoubah}(h]h ]h"]h$]h&]uh1j hjSubeh}(h]h ]h"]h$]h&]uh1j hjnhM}hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubj)}(h(TEST_F(fixture, name) { implementation }h]h(TEST_F(fixture, name) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM~hjubh)}(hDefines a test that depends on a fixture (e.g., is part of a test case). Very similar to TEST() except that *self* is the setup instance of fixture's datatype exposed for use by the implementation.h](hlDefines a test that depends on a fixture (e.g., is part of a test case). Very similar to TEST() except that }(hjhhhNhNubj)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhU is the setup instance of fixture’s datatype exposed for use by the implementation.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(hThe _metadata object is shared (MAP_SHARED) with all the potential forked processes, which enables them to use EXCEPT_*() and ASSERT_*().h]hThe _metadata object is shared (MAP_SHARED) with all the potential forked processes, which enables them to use EXCEPT_*() and ASSERT_*().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(hThe *self* object is only shared with the potential forked processes if FIXTURE_TEARDOWN_PARENT() is used instead of FIXTURE_TEARDOWN().h](hThe }(hjhhhNhNubj)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh~ object is only shared with the potential forked processes if FIXTURE_TEARDOWN_PARENT() is used instead of FIXTURE_TEARDOWN().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj hhhj hNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j TEST_HARNESS_MAIN (C macro)c.TEST_HARNESS_MAINhNtauh1j hj hhhj hNubj" )}(hhh](j' )}(hTEST_HARNESS_MAINh]j- )}(hTEST_HARNESS_MAINh]j3 )}(hTEST_HARNESS_MAINh]j9 )}(hj%h]hTEST_HARNESS_MAIN}(hj/hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj+ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj'hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj#hhhjBhMubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjBhMhj hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj hhhjBhMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j[jy j[jz j{ j| uh1j! hhhj hj hNubh)}(h``TEST_HARNESS_MAIN``h]j )}(hjah]hTEST_HARNESS_MAIN}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j hj_ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhj hhubj)}(h Simple wrapper to run the test harness **Description** .. code-block:: c TEST_HARNESS_MAIN Use once to append a main() to the test file. h](j)}(h'Simple wrapper to run the test harness h]h)}(h&Simple wrapper to run the test harnessh]h&Simple wrapper to run the test harness}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhj{ubah}(h]h ]h"]h$]h&]uh1jhjhMhjwubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjwubj)}(hTEST_HARNESS_MAINh]hTEST_HARNESS_MAIN}hjsbah}(h]h ]h"]h$]h&]jjj j! jZ j# }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjwubh)}(h-Use once to append a main() to the test file.h]h-Use once to append a main() to the test file.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhj hhubeh}(h]helpersah ]h"]helpersah$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(h Operatorsh]h Operators}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hOperators for use in TEST() and TEST_F(). ASSERT_* calls will stop test execution immediately. EXPECT_* calls will emit a failure warning, note it, and continue.h]hOperators for use in TEST() and TEST_F(). ASSERT_* calls will stop test execution immediately. EXPECT_* calls will emit a failure warning, note it, and continue.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:439: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_EQ (C macro) c.ASSERT_EQhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_EQh]j- )}(h ASSERT_EQh]j3 )}(h ASSERT_EQh]j9 )}(hj h]h ASSERT_EQ}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj hhhj)hMubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj)hMhjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhj)hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jBjy jBjz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_EQ (expected, seen)``h]j )}(hjHh]hASSERT_EQ (expected, seen)}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjFubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_EQ(expected, measured): expected == measuredh](h)}(h**Parameters**h]j )}(hjdh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjbubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj^ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj}ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hj}ubeh}(h]h ]h"]h$]h&]uh1j hjhMhjzubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjzubeh}(h]h ]h"]h$]h&]uh1j hj^ubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj^ubh)}(h3ASSERT_EQ(expected, measured): expected == measuredh]h3ASSERT_EQ(expected, measured): expected == measured}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_NE (C macro) c.ASSERT_NEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_NEh]j- )}(h ASSERT_NEh]j3 )}(h ASSERT_NEh]j9 )}(hj6h]h ASSERT_NE}(hj@hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj<ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj8hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM ubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj4hhhjShM ubah}(h]j/ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjShM hj1hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj1hhhjShM ubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jljy jljz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_NE (expected, seen)``h]j )}(hjrh]hASSERT_NE (expected, seen)}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j hjpubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_NE(expected, measured): expected != measuredh](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hj!h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h3ASSERT_NE(expected, measured): expected != measuredh]h3ASSERT_NE(expected, measured): expected != measured}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_LT (C macro) c.ASSERT_LThNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_LTh]j- )}(h ASSERT_LTh]j3 )}(h ASSERT_LTh]j9 )}(hj`h]h ASSERT_LT}(hjjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjfubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjbhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj^hhhj}hMubah}(h]jYah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj}hMhj[hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj[hhhj}hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_LT (expected, seen)``h]j )}(hjh]hASSERT_LT (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_LT(expected, measured): expected < measuredh](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj&ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj%hMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjKh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjIubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h2ASSERT_LT(expected, measured): expected < measuredh]h2ASSERT_LT(expected, measured): expected < measured}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_LE (C macro) c.ASSERT_LEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_LEh]j- )}(h ASSERT_LEh]j3 )}(h ASSERT_LEh]j9 )}(hjh]h ASSERT_LE}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM#ubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhM#ubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhM#hjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhM#ubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_LE (expected, seen)``h]j )}(hjh]hASSERT_LE (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM%hjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_LE(expected, measured): expected <= measuredh](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM'hjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM%hjubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM%hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhM%hjubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj:h]hseen}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM&hj4ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhM&hjPubah}(h]h ]h"]h$]h&]uh1j hj4ubeh}(h]h ]h"]h$]h&]uh1j hjOhM&hjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjuh]h Description}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjsubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM(hjubh)}(h3ASSERT_LE(expected, measured): expected <= measuredh]h3ASSERT_LE(expected, measured): expected <= measured}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM$hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_GT (C macro) c.ASSERT_GThNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_GTh]j- )}(h ASSERT_GTh]j3 )}(h ASSERT_GTh]j9 )}(hjh]h ASSERT_GT}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM.ubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhM.ubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhM.hjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhM.ubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jjy jjz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_GT (expected, seen)``h]j )}(hjh]hASSERT_GT (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM0hjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_GT(expected, measured): expected > measuredh](h)}(h**Parameters**h]j )}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM2hjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hj+h]hexpected}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM0hj%ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hM0hjAubah}(h]h ]h"]h$]h&]uh1j hj%ubeh}(h]h ]h"]h$]h&]uh1j hj@hM0hj"ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hjdh]hseen}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjbubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM1hj^ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhM1hjzubah}(h]h ]h"]h$]h&]uh1j hj^ubeh}(h]h ]h"]h$]h&]uh1j hjyhM1hj"ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM3hjubh)}(h2ASSERT_GT(expected, measured): expected > measuredh]h2ASSERT_GT(expected, measured): expected > measured}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM/hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_GE (C macro) c.ASSERT_GEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_GEh]j- )}(h ASSERT_GEh]j3 )}(h ASSERT_GEh]j9 )}(hjh]h ASSERT_GE}(hjhhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hjubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM9ubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hjhhhjhM9ubah}(h]jah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjhM9hjhhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hjhhhjhM9ubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j jy j jz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_GE (expected, seen)``h]j )}(hj h]hASSERT_GE (expected, seen)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM;hjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_GE(expected, measured): expected >= measuredh](h)}(h**Parameters**h]j )}(hj6 h]h Parameters}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj4 ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM=hj0 ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjU h]hexpected}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjS ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM;hjO ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjj hM;hjk ubah}(h]h ]h"]h$]h&]uh1j hjO ubeh}(h]h ]h"]h$]h&]uh1j hjj hM;hjL ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj h]hseen}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM<hj ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM<hj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj hM<hjL ubeh}(h]h ]h"]h$]h&]uh1j hj0 ubh)}(h**Description**h]j )}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM>hj0 ubh)}(h3ASSERT_GE(expected, measured): expected >= measuredh]h3ASSERT_GE(expected, measured): expected >= measured}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM:hj0 ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_NULL (C macro) c.ASSERT_NULLhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_NULLh]j- )}(h ASSERT_NULLh]j3 )}(h ASSERT_NULLh]j9 )}(hj!h]h ASSERT_NULL}(hj!hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj!ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj !hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMDubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj!hhhj%!hMDubah}(h]j!ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj%!hMDhj!hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj!hhhj%!hMDubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j>!jy j>!jz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_NULL (seen)``h]j )}(hjD!h]hASSERT_NULL (seen)}(hjF!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjB!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMFhjhhubj )}(hc**Parameters** ``seen`` measured value **Description** ASSERT_NULL(measured): NULL == measuredh](h)}(h**Parameters**h]j )}(hj`!h]h Parameters}(hjb!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj^!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMHhjZ!ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj!h]hseen}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj}!ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMFhjy!ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMFhj!ubah}(h]h ]h"]h$]h&]uh1j hjy!ubeh}(h]h ]h"]h$]h&]uh1j hj!hMFhjv!ubah}(h]h ]h"]h$]h&]uh1j hjZ!ubh)}(h**Description**h]j )}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMHhjZ!ubh)}(h'ASSERT_NULL(measured): NULL == measuredh]h'ASSERT_NULL(measured): NULL == measured}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMEhjZ!ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_TRUE (C macro) c.ASSERT_TRUEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_TRUEh]j- )}(h ASSERT_TRUEh]j3 )}(h ASSERT_TRUEh]j9 )}(hj!h]h ASSERT_TRUE}(hj"hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj!ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj!hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMNubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj!hhhj"hMNubah}(h]j!ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj"hMNhj!hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj!hhhj"hMNubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j/"jy j/"jz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_TRUE (seen)``h]j )}(hj5"h]hASSERT_TRUE (seen)}(hj7"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3"ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMPhjhhubj )}(h`**Parameters** ``seen`` measured value **Description** ASSERT_TRUE(measured): measured != 0h](h)}(h**Parameters**h]j )}(hjQ"h]h Parameters}(hjS"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjO"ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMRhjK"ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hjp"h]hseen}(hjr"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjn"ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMPhjj"ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMPhj"ubah}(h]h ]h"]h$]h&]uh1j hjj"ubeh}(h]h ]h"]h$]h&]uh1j hj"hMPhjg"ubah}(h]h ]h"]h$]h&]uh1j hjK"ubh)}(h**Description**h]j )}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMRhjK"ubh)}(h$ASSERT_TRUE(measured): measured != 0h]h$ASSERT_TRUE(measured): measured != 0}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMOhjK"ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_FALSE (C macro)c.ASSERT_FALSEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_FALSEh]j- )}(h ASSERT_FALSEh]j3 )}(h ASSERT_FALSEh]j9 )}(hj"h]h ASSERT_FALSE}(hj"hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj"ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj"hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMXubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj"hhhj#hMXubah}(h]j"ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj#hMXhj"hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj"hhhj#hMXubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j #jy j #jz j{ j| uh1j! hhhjhNhNubh)}(h``ASSERT_FALSE (seen)``h]j )}(hj&#h]hASSERT_FALSE (seen)}(hj(#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$#ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMZhjhhubj )}(ha**Parameters** ``seen`` measured value **Description** ASSERT_FALSE(measured): measured == 0h](h)}(h**Parameters**h]j )}(hjB#h]h Parameters}(hjD#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj@#ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM\hj<#ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hja#h]hseen}(hjc#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj_#ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMZhj[#ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjz#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv#hMZhjw#ubah}(h]h ]h"]h$]h&]uh1j hj[#ubeh}(h]h ]h"]h$]h&]uh1j hjv#hMZhjX#ubah}(h]h ]h"]h$]h&]uh1j hj<#ubh)}(h**Description**h]j )}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj#ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM\hj<#ubh)}(h%ASSERT_FALSE(measured): measured == 0h]h%ASSERT_FALSE(measured): measured == 0}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMYhj<#ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_STREQ (C macro)c.ASSERT_STREQhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_STREQh]j- )}(h ASSERT_STREQh]j3 )}(h ASSERT_STREQh]j9 )}(hj#h]h ASSERT_STREQ}(hj#hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj#ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj#hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMbubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj#hhhj#hMbubah}(h]j#ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj#hMbhj#hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj#hhhj#hMbubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j$jy j$jz j{ j| uh1j! hhhjhNhNubh)}(h!``ASSERT_STREQ (expected, seen)``h]j )}(hj$h]hASSERT_STREQ (expected, seen)}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMdhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_STREQ(expected, measured): !strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hj3$h]h Parameters}(hj5$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1$ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMfhj-$ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjR$h]hexpected}(hjT$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjP$ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMdhjL$ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjk$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg$hMdhjh$ubah}(h]h ]h"]h$]h&]uh1j hjL$ubeh}(h]h ]h"]h$]h&]uh1j hjg$hMdhjI$ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj$h]hseen}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMehj$ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMehj$ubah}(h]h ]h"]h$]h&]uh1j hj$ubeh}(h]h ]h"]h$]h&]uh1j hj$hMehjI$ubeh}(h]h ]h"]h$]h&]uh1j hj-$ubh)}(h**Description**h]j )}(hj$h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj$ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMghj-$ubh)}(h=ASSERT_STREQ(expected, measured): !strcmp(expected, measured)h]h=ASSERT_STREQ(expected, measured): !strcmp(expected, measured)}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMchj-$ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j ASSERT_STRNE (C macro)c.ASSERT_STRNEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h ASSERT_STRNEh]j- )}(h ASSERT_STRNEh]j3 )}(h ASSERT_STRNEh]j9 )}(hj%h]h ASSERT_STRNE}(hj%hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj %ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj%hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMmubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj%hhhj"%hMmubah}(h]j$ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj"%hMmhj%hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj%hhhj"%hMmubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j;%jy j;%jz j{ j| uh1j! hhhjhNhNubh)}(h!``ASSERT_STRNE (expected, seen)``h]j )}(hjA%h]hASSERT_STRNE (expected, seen)}(hjC%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj?%ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMohjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_STRNE(expected, measured): strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hj]%h]h Parameters}(hj_%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj[%ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMqhjW%ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hj|%h]hexpected}(hj~%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjz%ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMohjv%ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMohj%ubah}(h]h ]h"]h$]h&]uh1j hjv%ubeh}(h]h ]h"]h$]h&]uh1j hj%hMohjs%ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj%h]hseen}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj%ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMphj%ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMphj%ubah}(h]h ]h"]h$]h&]uh1j hj%ubeh}(h]h ]h"]h$]h&]uh1j hj%hMphjs%ubeh}(h]h ]h"]h$]h&]uh1j hjW%ubh)}(h**Description**h]j )}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj%ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMrhjW%ubh)}(h measuredh](h)}(h**Parameters**h]j )}(hj/+h]h Parameters}(hj1+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-+ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj)+ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjN+h]hexpected}(hjP+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjL+ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjH+ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjg+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc+hMhjd+ubah}(h]h ]h"]h$]h&]uh1j hjH+ubeh}(h]h ]h"]h$]h&]uh1j hjc+hMhjE+ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj+h]hseen}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj+ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj+ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]uh1j hj+hMhjE+ubeh}(h]h ]h"]h$]h&]uh1j hj)+ubh)}(h**Description**h]j )}(hj+h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj+ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj)+ubh)}(h2EXPECT_GT(expected, measured): expected > measuredh]h2EXPECT_GT(expected, measured): expected > measured}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj)+ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_GE (C macro) c.EXPECT_GEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h EXPECT_GEh]j- )}(h EXPECT_GEh]j3 )}(h EXPECT_GEh]j9 )}(hj,h]h EXPECT_GE}(hj ,hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj,ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj,hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj+hhhj,hMubah}(h]j+ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj,hMhj+hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj+hhhj,hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j7,jy j7,jz j{ j| uh1j! hhhjhNhNubh)}(h``EXPECT_GE (expected, seen)``h]j )}(hj=,h]hEXPECT_GE (expected, seen)}(hj?,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;,ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_GE(expected, measured): expected >= measuredh](h)}(h**Parameters**h]j )}(hjY,h]h Parameters}(hj[,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjW,ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjS,ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hjx,h]hexpected}(hjz,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjv,ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjr,ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j hjr,ubeh}(h]h ]h"]h$]h&]uh1j hj,hMhjo,ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj,h]hseen}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj,ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1j hj,ubeh}(h]h ]h"]h$]h&]uh1j hj,hMhjo,ubeh}(h]h ]h"]h$]h&]uh1j hjS,ubh)}(h**Description**h]j )}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjS,ubh)}(h3EXPECT_GE(expected, measured): expected >= measuredh]h3EXPECT_GE(expected, measured): expected >= measured}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjS,ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_NULL (C macro) c.EXPECT_NULLhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h EXPECT_NULLh]j- )}(h EXPECT_NULLh]j3 )}(h EXPECT_NULLh]j9 )}(hj+-h]h EXPECT_NULL}(hj5-hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj1-ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj--hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj)-hhhjH-hMubah}(h]j$-ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjH-hMhj&-hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj&-hhhjH-hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx ja-jy ja-jz j{ j| uh1j! hhhjhNhNubh)}(h``EXPECT_NULL (seen)``h]j )}(hjg-h]hEXPECT_NULL (seen)}(hji-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hje-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(hc**Parameters** ``seen`` measured value **Description** EXPECT_NULL(measured): NULL == measuredh](h)}(h**Parameters**h]j )}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj}-ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj-h]hseen}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj-ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]uh1j hj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j hj}-ubh)}(h**Description**h]j )}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj}-ubh)}(h'EXPECT_NULL(measured): NULL == measuredh]h'EXPECT_NULL(measured): NULL == measured}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj}-ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_TRUE (C macro) c.EXPECT_TRUEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h EXPECT_TRUEh]j- )}(h EXPECT_TRUEh]j3 )}(h EXPECT_TRUEh]j9 )}(hj.h]h EXPECT_TRUE}(hj&.hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj".ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj.hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj.hhhj9.hMubah}(h]j.ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj9.hMhj.hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj.hhhj9.hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jR.jy jR.jz j{ j| uh1j! hhhjhNhNubh)}(h``EXPECT_TRUE (seen)``h]j )}(hjX.h]hEXPECT_TRUE (seen)}(hjZ.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjV.ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h`**Parameters** ``seen`` measured value **Description** EXPECT_TRUE(measured): 0 != measuredh](h)}(h**Parameters**h]j )}(hjt.h]h Parameters}(hjv.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjr.ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjn.ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj.h]hseen}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj.ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMhj.ubah}(h]h ]h"]h$]h&]uh1j hj.ubeh}(h]h ]h"]h$]h&]uh1j hj.hMhj.ubah}(h]h ]h"]h$]h&]uh1j hjn.ubh)}(h**Description**h]j )}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjn.ubh)}(h$EXPECT_TRUE(measured): 0 != measuredh]h$EXPECT_TRUE(measured): 0 != measured}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjn.ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_FALSE (C macro)c.EXPECT_FALSEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h EXPECT_FALSEh]j- )}(h EXPECT_FALSEh]j3 )}(h EXPECT_FALSEh]j9 )}(hj /h]h EXPECT_FALSE}(hj/hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj/ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj/hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj /hhhj*/hMubah}(h]j/ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj*/hMhj/hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj/hhhj*/hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx jC/jy jC/jz j{ j| uh1j! hhhjhNhNubh)}(h``EXPECT_FALSE (seen)``h]j )}(hjI/h]hEXPECT_FALSE (seen)}(hjK/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjG/ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(ha**Parameters** ``seen`` measured value **Description** EXPECT_FALSE(measured): 0 == measuredh](h)}(h**Parameters**h]j )}(hje/h]h Parameters}(hjg/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjc/ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj_/ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj/h]hseen}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj~/ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1j hj~/ubeh}(h]h ]h"]h$]h&]uh1j hj/hMhj{/ubah}(h]h ]h"]h$]h&]uh1j hj_/ubh)}(h**Description**h]j )}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj_/ubh)}(h%EXPECT_FALSE(measured): 0 == measuredh]h%EXPECT_FALSE(measured): 0 == measured}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj_/ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_STREQ (C macro)c.EXPECT_STREQhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h EXPECT_STREQh]j- )}(h EXPECT_STREQh]j3 )}(h EXPECT_STREQh]j9 )}(hj/h]h EXPECT_STREQ}(hj0hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj0ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj0hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj/hhhj0hMubah}(h]j/ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hj0hMhj/hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj/hhhj0hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j40jy j40jz j{ j| uh1j! hhhjhNhNubh)}(h!``EXPECT_STREQ (expected, seen)``h]j )}(hj:0h]hEXPECT_STREQ (expected, seen)}(hj<0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj80ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_STREQ(expected, measured): !strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hjV0h]h Parameters}(hjX0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjT0ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjP0ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hju0h]hexpected}(hjw0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjs0ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjo0ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1j hjo0ubeh}(h]h ]h"]h$]h&]uh1j hj0hMhjl0ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj0h]hseen}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj0ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1j hj0ubeh}(h]h ]h"]h$]h&]uh1j hj0hMhjl0ubeh}(h]h ]h"]h$]h&]uh1j hjP0ubh)}(h**Description**h]j )}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjP0ubh)}(h=EXPECT_STREQ(expected, measured): !strcmp(expected, measured)h]h=EXPECT_STREQ(expected, measured): !strcmp(expected, measured)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjP0ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_STRNE (C macro)c.EXPECT_STRNEhNtauh1j hjhhhNhNubj" )}(hhh](j' )}(h EXPECT_STRNEh]j- )}(h EXPECT_STRNEh]j3 )}(h EXPECT_STRNEh]j9 )}(hj(1h]h EXPECT_STRNE}(hj21hhhNhNubah}(h]h ]jD ah"]h$]h&]uh1j8 hj.1ubah}(h]h ](jK jL eh"]h$]h&]jjuh1j2 hj*1hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjW uh1j, jX jY hj&1hhhjE1hMubah}(h]j!1ah ](j] j^ eh"]h$]h&]jb jc )jd huh1j& hjE1hMhj#1hhubjf )}(hhh]h}(h]h ]h"]h$]h&]uh1je hj#1hhhjE1hMubeh}(h]h ](jZ macroeh"]h$]h&]jw jZ jx j^1jy j^1jz j{ j| uh1j! hhhjhNhNubh)}(h!``EXPECT_STRNE (expected, seen)``h]j )}(hjd1h]hEXPECT_STRNE (expected, seen)}(hjf1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjb1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_STRNE(expected, measured): strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj~1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjz1ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j )}(hj1h]hexpected}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj1ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j hj1ubeh}(h]h ]h"]h$]h&]uh1j hj1hMhj1ubj )}(h``seen`` measured value h](j )}(h``seen``h]j )}(hj1h]hseen}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj1ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j hj1ubeh}(h]h ]h"]h$]h&]uh1j hj1hMhj1ubeh}(h]h ]h"]h$]h&]uh1j hjz1ubh)}(h**Description**h]j )}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj2ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjz1ubh)}(hj etar's auto-compress]jWarunning a subset of selftests]jaurefids}nameids}(jS2jP2jjjjjjjjjjjjjjjjjjjjjj jg j jNj* j' ja j^ j j jK2j8j j jjjD2jA2u nametypes}(jS2jjjjjjjjjjjj j j* ja j jK2j jjD2uh}(jP2hjjYjjjjjjjj jjjjjjjjjjjg jjNjm j' jA j^ j- j jd j8j j j jj j j( j j jjjjj1j6j]jbjjjjj$j)jjjj#jA2jjj j/j4jYj^jjjjjjj!j!j!j!j"j"j#j#j$j%j(&j-&jR'jW'j|(j(j)j)j*j*j+j+j$-j)-j.j.j/j /j/j/j!1j&1u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.