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]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%.}(hhhhhNhNubah}(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 }(hj hhhNhNubh)}(h`Test Harness`_h]h Test Harness}(hjhhhNhNubah}(h]h ]h"]h$]h&]name Test Harnessrefid test-harnessuh1hhj resolvedKubh?. Tests that need to be run in kernel space may wish to use a }(hj hhhNhNubh)}(h`Test Module`_h]h Test Module}(hj*hhhNhNubah}(h]h ]h"]h$]h&]name Test Modulej# test-moduleuh1hhj j%Kubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hDocumentation on the testsh]hDocumentation on the tests}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhhhhhK#ubh)}(h4For documentation on the kselftests themselves, see:h]h4For documentation on the kselftests themselves, see:}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK%hjEhhubhcompound)}(hhh]htoctree)}(hhh]h}(h]h ]h"]h$]h&]hdev-tools/kselftestentries]Ndev-tools/testing-devicesa includefiles]jwamaxdepthJcaptionNglobhidden includehiddennumberedK titlesonly rawentries]uh1jihhhK'hjfubah}(h]h ]toctree-wrapperah"]h$]h&]uh1jdhjEhhhhhK*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.}(hj hhhNhNubah}(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=}(hjhhhNhNubah}(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}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjhhubj)}(h5$ export KBUILD_OUTPUT=/tmp/kselftest; make kselftesth]h5$ export KBUILD_OUTPUT=/tmp/kselftest; make kselftest}hjBsbah}(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.}(hjPhhhNhNubah}(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.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjhhubh)}(h/To run kselftest with summary option enabled ::h]h,To run kselftest with summary option enabled}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKThjhhubj)}(h$ make summary=1 kselftesth]h$ make summary=1 kselftest}hjzsbah}(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}hjsbah}(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}hjsbah}(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.}(hjhhhNhNubah}(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:}(hj-hhhNhNubah}(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}hj;sbah}(h]h ]h"]h$]h&]jjuh1jhhhKshjhhubh)}(h(You can specify multiple tests to skip::h]h'You can specify multiple tests to skip:}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjhhubj)}(h,$ make SKIP_TARGETS="size timers" kselftesth]h,$ make SKIP_TARGETS="size timers" kselftest}hjWsbah}(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:}(hjehhhNhNubah}(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}hjssbah}(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&]uh1hhjhhhhhKubh)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh5 tool) to install selftests in the default location (}(hjhhhNhNubj)}(h+`tools/testing/selftests/kselftest_install`h]h)tools/testing/selftests/kselftest_install}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+), or in a user specified location via the }(hjhhhNhNubj)}(h`INSTALL_PATH`h]h INSTALL_PATH}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh “make” variable.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h*To install selftests in default location::h]h)To install selftests in default location:}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h)$ make -C tools/testing/selftests installh]h)$ make -C tools/testing/selftests install}hj\sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h3To install selftests in a user specified location::h]h2To install selftests in a user specified location:}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hG$ make -C tools/testing/selftests install INSTALL_PATH=/some/other/pathh]hG$ make -C tools/testing/selftests install INSTALL_PATH=/some/other/path}hjxsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(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&]uh1jhjubh 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&]uh1jhjubh 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 }(hj hhhNhNubj)}(h`-c`h]h-c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhH option can be used to run all the tests from a test collection, or the }(hj hhhNhNubj)}(h`-t`h]h-t}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhE option for specific single tests. Either can be used multiple times:}(hj hhhNhNubeh}(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}hj;sbah}(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 }(hjIhhhNhNubj)}(h`-h`h]h-h}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh option.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]running-installed-selftestsah ]h"]running installed selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hTimeout for selftestsh]hTimeout for selftests}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhhhhhKubh)}(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&]uh1jhjubh or the }(hjhhhNhNubj)}(h`--override-timeout`h]h--override-timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@ argument. For example to use 165 seconds instead one would use:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjqhhubj)}(h+$ ./run_kselftest.sh --override-timeout 165h]h+$ ./run_kselftest.sh --override-timeout 165}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjqhhubh)}(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&]uh1hhhhKhjqhhubeh}(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}hjsbah}(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&]uh1jhjubh directory. By default, }(hjhhhNhNubj)}(h`.gz`h]h.gz}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhN format is used. The tar compression format can be overridden by specifying a }(hjhhhNhNubj)}(h`FORMAT`h]hFORMAT}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh( make variable. Any value recognized by }(hjhhhNhNubh)}(h`tar's auto-compress`_h]htar’s auto-compress}(hjChhhNhNubah}(h]h ]h"]h$]h&]nametar's auto-compressrefuriMhttps://www.gnu.org/software/tar/manual/html_node/gzip.html#auto_002dcompressuh1hhjj%Kubh 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}hj_sbah}(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}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh invokes }(hjmhhhNhNubj)}(h`make install`h]h make install}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhP so you can use it to package a subset of tests by using variables specified in }(hjmhhhNhNubh)}(h `Running a subset of selftests`_h]hRunning a subset of selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameRunning a subset of selftestsj#juh1hhjmj%Kubh section:}(hjmhhhNhNubeh}(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&]jSjTuh1jhKhjhhhhjKubeh}(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;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(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}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/ubah}(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.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjGubah}(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.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj_ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKhjubah}(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.}(hjhhhNhNubah}(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.}(hjhhhNhNubah}(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.}(hj#hhhNhNubah}(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.}(hj1hhhNhNubah}(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:}(hj?hhhNhNubah}(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)}(hjVh]h4symlinks to files in other directories are preserved}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjTubah}(h]h ]h"]h$]h&]uh1jhjQubj)}(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}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjkubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]j}j~uh1jhhhMhjMubah}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjubj)}(hTARGETS += androidh]hTARGETS += android}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhM5hjubeh}(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:}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM7hj 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}hj1 sbah}(h]h ]h"]h$]h&]jjuh1jhhhM9hj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j}j~uh1jhhhKhjubah}(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}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjY 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. }(hjj hhhNhNubhliteral)}(h``kselftest/module.sh``h]hkselftest/module.sh}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjj 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:}(hjj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMChjY hhubj)}(hhh](j)}(h.``tools/testing/selftests/kselftest_module.h``h]h)}(hj h]js )}(hj h]h*tools/testing/selftests/kselftest_module.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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]js )}(hj h]h+tools/testing/selftests/kselftest/module.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubah}(h]h ]h"]h$]h&]uh1hhhhMKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubeh}(h]h ]h"]h$]h&]j}-uh1jhhhMJhjY 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 hhhNhNubjs )}(h``tools/testing/``h]htools/testing/}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubh) directory, or for modules which use the }(hj hhhNhNubjs )}(h``kselftest_module.h``h]hkselftest_module.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubh/ header above. Otherwise, you’ll need to add }(hj hhhNhNubjs )}(h``MODULE_INFO(test, "Y")``h]hMODULE_INFO(test, "Y")}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 hhhNhNubjs )}(h``/proc/sys/kernel/tainted``h]h/proc/sys/kernel/tainted}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMMhjY hhubh)}(hhh](h)}(h How to useh]h How to use}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj- 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.}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj- hhubhenumerated_list)}(hhh](j)}(hCreate the test module h]h)}(hCreate the test moduleh]hCreate the test module}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hjQ ubah}(h]h ]h"]h$]h&]uh1jhjN 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. }(hjm hhhNhNubjs )}(h)``tools/testing/selftests/lib/bitmap.sh``h]h%tools/testing/selftests/lib/bitmap.sh}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjm ubeh}(h]h ]h"]h$]h&]uh1hhhhM]hji ubah}(h]h ]h"]h$]h&]uh1jhjN 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 hhhNhNubjs )}(h&``tools/testing/selftests/lib/config``h]h"tools/testing/selftests/lib/config}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubeh}(h]h ]h"]h$]h&]uh1hhhhM`hj ubah}(h]h ]h"]h$]h&]uh1jhjN 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 hhhNhNubjs )}(h(``tools/testing/selftests/lib/Makefile``h]h$tools/testing/selftests/lib/Makefile}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubeh}(h]h ]h"]h$]h&]uh1hhhhMbhj ubah}(h]h ]h"]h$]h&]uh1jhjN 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&]uh1jhjN hhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jL hj- 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}uh1jhhhMfhj- hhubeh}(h] how-to-useah ]h"] how to useah$]h&]uh1hhjY hhhhhMVubh)}(hhh](h)}(hExample Moduleh]hExample Module}(hj 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");}hj8 sbah}(h]h ]h"]h$]h&]jjj j cj }uh1jhhhMthj hhubeh}(h]example-moduleah ]h"]example moduleah$]h&]uh1hhjY hhhhhMpubh)}(hhh](h)}(hExample test scripth]hExample test script}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjP 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}hja sbah}(h]h ]h"]h$]h&]jjj j shj }uh1jhhhMhjP hhubeh}(h]example-test-scriptah ]h"]example test scriptah$]h&]uh1hhjY hhhhhMubeh}(h]j:ah ]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 Modulej#j:uh1hhj j%Kubh 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 jF 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&]uh1j$ hj ubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1j hj hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKcubah}(h]h ]h"]h$]h&]jj add_permalinkuh1j sphinx_line_type declaratorhj hhhj< hKcubah}(h]j ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j hj< hKchj hhubh desc_content)}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj hhhj< hKcubeh}(h]h ](jF macroeh"]h$]h&]domainjF objtypej_ desctypej_ noindex noindexentrynocontentsentryuh1j hhhj hj hNubh)}(h``TH_LOG (fmt, ...)``h]js )}(hjk h]hTH_LOG (fmt, ...)}(hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hji ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKehj 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.hhKWhj ubhdefinition_list)}(hhh](hdefinition_list_item)}(h``fmt`` format string h](hterm)}(h``fmt``h]js )}(hj h]hfmt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKVhj ubh definition)}(hhh]h)}(h format stringh]h format string}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKVhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj hKVhj ubj )}(h``...`` optional arguments h](j )}(h``...``h]js )}(hj h]h...}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKWhj ubj )}(hhh]h)}(hoptional argumentsh]hoptional arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKWhj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1j hj hKWhj 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:431: ./tools/testing/selftests/kselftest_harness.hhKYhj ubj)}(hTH_LOG(format, ...)h]hTH_LOG(format, ...)}hj< sbah}(h]h ]h"]h$]h&]jjj j jF j }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhKYhj 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}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhK]hj ubh)}(hOptionally 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}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM=hj=ubah}(h]h ]h"]h$]h&]uh1jhjOhM=hj 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 )}(hj\h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjZubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMAhjVubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]js )}(hj{h]h fixture_name}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjyubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM@hjuubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM@hjubah}(h]h ]h"]h$]h&]uh1j hjuubeh}(h]h ]h"]h$]h&]uh1j hjhM@hjrubah}(h]h ]h"]h$]h&]uh1j hjVubh)}(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.hhMBhjVubj)}(h:FIXTURE_VARIANT(fixture_name) { type property1; ... };h]h:FIXTURE_VARIANT(fixture_name) { type property1; ... };}hjsbah}(h]h ]h"]h$]h&]jjj j jF j }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMBhjVubh)}(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.hhMIhjVubeh}(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]j )}(hFIXTURE_VARIANT_ADDh]j% )}(hjh]hFIXTURE_VARIANT_ADD}(hj!hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMaubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjhhhj4hMaubah}(h]jah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj4hMahjhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjhhhj4hMaubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jMje jMjf jg jh uh1j hhhj hj hNubh)}(h4``FIXTURE_VARIANT_ADD (fixture_name, variant_name)``h]js )}(hjSh]h0FIXTURE_VARIANT_ADD (fixture_name, variant_name)}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjQubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMchj 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}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMPhjiubah}(h]h ]h"]h$]h&]uh1jhj{hMPhj 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.hhMThjubj )}(hhh](j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]js )}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMShjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMShjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMShjubj )}(h+``variant_name`` name of the parameter set h](j )}(h``variant_name``h]js )}(hjh]h variant_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMThjubj )}(hhh]h)}(hname of the parameter seth]hname of the parameter set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMThjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hjhMThjubeh}(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.hhMVhjubj)}(hOFIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... };h]hOFIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... };}hj1sbah}(h]h ]h"]h$]h&]jjj j jF j }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMVhjubh)}(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 }(hjAhhhNhNubj)}(h *variant*h]hvariant}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh:. Tests of each fixture will be run once for each variant.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhM]hjubeh}(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]j )}(hTEST_Fh]j% )}(hj|h]hTEST_F}(hjhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj~hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjzhhhjhMubah}(h]juah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hjhMhjwhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjwhhhjhMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jje jjf jg jh uh1j hhhj hj hNubh)}(h$``TEST_F (fixture_name, test_name)``h]js )}(hjh]h TEST_F (fixture_name, test_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhj 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.hhMrhjubah}(h]h ]h"]h$]h&]uh1jhjhMrhj 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.hhMvhjubj )}(hhh](j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]js )}(hj h]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMuhjubj )}(hhh]h)}(h fixture nameh]h fixture name}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMuhj"ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hj!hMuhjubj )}(h``test_name`` test name h](j )}(h ``test_name``h]js )}(hjEh]h test_name}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjCubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMvhj?ubj )}(hhh]h)}(h test nameh]h test name}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMvhj[ubah}(h]h ]h"]h$]h&]uh1j hj?ubeh}(h]h ]h"]h$]h&]uh1j hjZhMvhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(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.hhMxhjubj)}(h(TEST_F(fixture, name) { implementation }h]h(TEST_F(fixture, name) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjj j jF j }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMxhjubh)}(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.hhM|hjubh)}(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]j )}(hTEST_HARNESS_MAINh]j% )}(hjh]hTEST_HARNESS_MAIN}(hjhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjhhhj.hMubah}(h]j ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj.hMhj hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj hhhj.hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jGje jGjf jg jh uh1j hhhj hj hNubh)}(h``TEST_HARNESS_MAIN``h]js )}(hjMh]hTEST_HARNESS_MAIN}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjKubah}(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}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjgubah}(h]h ]h"]h$]h&]uh1jhjyhMhjcubh)}(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.hhMhjcubj)}(hTEST_HARNESS_MAINh]hTEST_HARNESS_MAIN}hjsbah}(h]h ]h"]h$]h&]jjj j jF j }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhMhjcubh)}(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.hhMhjcubeh}(h]h ]h"]h$]h&]uh1jhjyhMhj 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]j )}(h ASSERT_EQh]j% )}(hjh]h ASSERT_EQ}(hjhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjhhhjhMubah}(h]jah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hjhMhjhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjhhhjhMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j.je j.jf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_EQ (expected, seen)``h]js )}(hj4h]hASSERT_EQ (expected, seen)}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj2ubah}(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 )}(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:442: ./tools/testing/selftests/kselftest_harness.hhMhjJubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hjoh]hexpected}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjmubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjiubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j hjiubeh}(h]h ]h"]h$]h&]uh1j hjhMhjfubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 hjhMhjfubeh}(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:442: ./tools/testing/selftests/kselftest_harness.hhMhjJubh)}(h3ASSERT_EQ(expected, measured): expected == measuredh]h3ASSERT_EQ(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.hhMhjJubeh}(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]j )}(h ASSERT_NEh]j% )}(hj"h]h ASSERT_NE}(hj,hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj(ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj$hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM ubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj hhhj?hM ubah}(h]jah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj?hM hjhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjhhhj?hM ubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jXje jXjf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_NE (expected, seen)``h]js )}(hj^h]hASSERT_NE (expected, seen)}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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_NE(expected, measured): expected != measuredh](h)}(h**Parameters**h]j )}(hjzh]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjxubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjtubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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]js )}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 hjtubh)}(h**Description**h]j )}(hj h]h Description}(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.hhMhjtubh)}(h3ASSERT_NE(expected, measured): expected != measuredh]h3ASSERT_NE(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.hhMhjtubeh}(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]j )}(h ASSERT_LTh]j% )}(hjLh]h ASSERT_LT}(hjVhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjRubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjNhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjJhhhjihMubah}(h]jEah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hjihMhjGhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjGhhhjihMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jje jjf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_LT (expected, seen)``h]js )}(hjh]hASSERT_LT (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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]js )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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]js )}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 )}(hj7h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5ubah}(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}(hjMhhhNhNubah}(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]j )}(h ASSERT_LEh]j% )}(hjvh]h ASSERT_LE}(hjhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj|ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjxhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM ubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjthhhjhM ubah}(h]joah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hjhM hjqhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjqhhhjhM ubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jje jjf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_LE (expected, seen)``h]js )}(hjh]hASSERT_LE (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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.hhMhjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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]js )}(hj&h]hseen}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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;hMhjubeh}(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:442: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h3ASSERT_LE(expected, measured): expected <= measuredh]h3ASSERT_LE(expected, measured): expected <= measured}(hjwhhhNhNubah}(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_GT (C macro) c.ASSERT_GThNtauh1j hjhhhNhNubj )}(hhh](j )}(h ASSERT_GTh]j )}(h ASSERT_GTh]j )}(h ASSERT_GTh]j% )}(hjh]h ASSERT_GT}(hjhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM+ubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjhhhjhM+ubah}(h]jah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hjhM+hjhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjhhhjhM+ubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jje jjf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_GT (expected, seen)``h]js )}(hjh]hASSERT_GT (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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_GT(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]js )}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hM&hj-ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1j hj,hM&hjubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjPh]hseen}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjNubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM'hjJubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehM'hjfubah}(h]h ]h"]h$]h&]uh1j hjJubeh}(h]h ]h"]h$]h&]uh1j hjehM'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:442: ./tools/testing/selftests/kselftest_harness.hhM)hjubh)}(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]j )}(h ASSERT_GEh]j% )}(hjh]h ASSERT_GE}(hjhhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hjubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM6ubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjhhhjhM6ubah}(h]jah ](jI jJ eh"]h$]h&]jN jO )jP huh1'j hjhM6hjhhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjhhhjhM6ubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j je j jf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_GE (expected, seen)``h]js )}(hj h]hASSERT_GE (expected, seen)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM8hjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_GE(expected, measured): expected >= 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.hhM2hj ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hjA h]hexpected}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj? ubah}(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)}(hexpected valueh]hexpected value}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV hM1hjW ubah}(h]h ]h"]h$]h&]uh1j hj; ubeh}(h]h ]h"]h$]h&]uh1j hjV hM1hj8 ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjz h]hseen}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjx ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM2hjt ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM2hj ubah}(h]h ]h"]h$]h&]uh1j hjt ubeh}(h]h ]h"]h$]h&]uh1j hj hM2hj8 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.hhM4hj 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.hhM4hj 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]j )}(h ASSERT_NULLh]j% )}(hj h]h ASSERT_NULL}(hj hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM@ubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj hhhj!hM@ubah}(h]j ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj!hM@hj hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj hhhj!hM@ubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j*!je j*!jf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_NULL (seen)``h]js )}(hj0!h]hASSERT_NULL (seen)}(hj2!hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj.!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMBhjhhubj )}(hc**Parameters** ``seen`` measured value **Description** ASSERT_NULL(measured): NULL == measuredh](h)}(h**Parameters**h]j )}(hjL!h]h Parameters}(hjN!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjJ!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM=hjF!ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjk!h]hseen}(hjm!hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hji!ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM<hje!ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hM<hj!ubah}(h]h ]h"]h$]h&]uh1j hje!ubeh}(h]h ]h"]h$]h&]uh1j hj!hM<hjb!ubah}(h]h ]h"]h$]h&]uh1j hjF!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>hjF!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.hhM>hjF!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]j )}(h ASSERT_TRUEh]j% )}(hj!h]h ASSERT_TRUE}(hj!hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj!ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj!hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMJubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj!hhhj"hMJubah}(h]j!ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj"hMJhj!hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj!hhhj"hMJubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j"je j"jf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_TRUE (seen)``h]js )}(hj!"h]hASSERT_TRUE (seen)}(hj#"hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj"ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMLhjhhubj )}(h`**Parameters** ``seen`` measured value **Description** ASSERT_TRUE(measured): measured != 0h](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.hhMGhj7"ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj\"h]hseen}(hj^"hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjZ"ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMFhjV"ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hju"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq"hMFhjr"ubah}(h]h ]h"]h$]h&]uh1j hjV"ubeh}(h]h ]h"]h$]h&]uh1j hjq"hMFhjS"ubah}(h]h ]h"]h$]h&]uh1j hj7"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.hhMHhj7"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.hhMHhj7"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]j )}(h ASSERT_FALSEh]j% )}(hj"h]h ASSERT_FALSE}(hj"hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj"ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj"hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMTubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj"hhhj"hMTubah}(h]j"ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj"hMThj"hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj"hhhj"hMTubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j #je j #jf jg jh uh1j hhhjhNhNubh)}(h``ASSERT_FALSE (seen)``h]js )}(hj#h]hASSERT_FALSE (seen)}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj#ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMVhjhhubj )}(ha**Parameters** ``seen`` measured value **Description** ASSERT_FALSE(measured): measured == 0h](h)}(h**Parameters**h]j )}(hj.#h]h Parameters}(hj0#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.hhMQhj(#ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjM#h]hseen}(hjO#hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjK#ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMPhjG#ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjf#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb#hMPhjc#ubah}(h]h ]h"]h$]h&]uh1j hjG#ubeh}(h]h ]h"]h$]h&]uh1j hjb#hMPhjD#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.hhMRhj(#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.hhMRhj(#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]j )}(h ASSERT_STREQh]j% )}(hj#h]h ASSERT_STREQ}(hj#hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj#ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj#hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM_ubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj#hhhj#hM_ubah}(h]j#ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj#hM_hj#hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj#hhhj#hM_ubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j#je j#jf jg jh uh1j hhhjhNhNubh)}(h!``ASSERT_STREQ (expected, seen)``h]js )}(hj$h]hASSERT_STREQ (expected, seen)}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj$ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMahjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_STREQ(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.hhM[hj$ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hj>$h]hexpected}(hj@$hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj<$ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMZhj8$ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjW$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS$hMZhjT$ubah}(h]h ]h"]h$]h&]uh1j hj8$ubeh}(h]h ]h"]h$]h&]uh1j hjS$hMZhj5$ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjw$h]hseen}(hjy$hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hju$ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM[hjq$ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hM[hj$ubah}(h]h ]h"]h$]h&]uh1j hjq$ubeh}(h]h ]h"]h$]h&]uh1j hj$hM[hj5$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.hhM]hj$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.hhM]hj$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]j )}(h ASSERT_STRNEh]j% )}(hj$h]h ASSERT_STRNE}(hj$hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj$ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj$hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMjubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj$hhhj%hMjubah}(h]j$ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj%hMjhj$hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj$hhhj%hMjubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j'%je j'%jf jg jh uh1j hhhjhNhNubh)}(h!``ASSERT_STRNE (expected, seen)``h]js )}(hj-%h]hASSERT_STRNE (expected, seen)}(hj/%hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj+%ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMlhjhhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_STRNE(expected, measured): strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hjI%h]h Parameters}(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.hhMfhjC%ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hjh%h]hexpected}(hjj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjf%ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMehjb%ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}%hMehj~%ubah}(h]h ]h"]h$]h&]uh1j hjb%ubeh}(h]h ]h"]h$]h&]uh1j hj}%hMehj_%ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj%h]hseen}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj%ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMfhj%ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMfhj%ubah}(h]h ]h"]h$]h&]uh1j hj%ubeh}(h]h ]h"]h$]h&]uh1j hj%hMfhj_%ubeh}(h]h ]h"]h$]h&]uh1j hjC%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.hhMhhjC%ubh)}(h'ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hjb'hMhj@'hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj@'hhhjb'hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j{'je j{'jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_NE (expected, seen)``h]js )}(hj'h]hEXPECT_NE (expected, seen)}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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_NE(expected, measured): expected != 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.hhM|hj'ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hj'h]hexpected}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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)}(hexpected valueh]hexpected 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{hj'ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj'h]hseen}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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|hj'ubeh}(h]h ]h"]h$]h&]uh1j hj'ubh)}(h**Description**h]j )}(hj0(h]h Description}(hj2(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)}(h3EXPECT_NE(expected, measured): expected != measuredh]h3EXPECT_NE(expected, measured): expected != measured}(hjF(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhM~hj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjhhhNhNubj )}(hhh]h}(h]h ]h"]h$]h&]entries](j EXPECT_LT (C macro) c.EXPECT_LThNtauh1j hjhhhNhNubj )}(hhh](j )}(h EXPECT_LTh]j )}(h EXPECT_LTh]j )}(h EXPECT_LTh]j% )}(hjo(h]h EXPECT_LT}(hjy(hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hju(ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hjq(hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hjm(hhhj(hMubah}(h]jh(ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj(hMhjj(hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hjj(hhhj(hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j(je j(jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_LT (expected, seen)``h]js )}(hj(h]hEXPECT_LT (expected, seen)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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_LT(expected, measured): expected < 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``expected`` expected value h](j )}(h ``expected``h]js )}(hj(h]hexpected}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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)}(hexpected valueh]hexpected 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(ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj)h]hseen}(hj!)hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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}(hj8)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4)hMhj5)ubah}(h]h ]h"]h$]h&]uh1j hj)ubeh}(h]h ]h"]h$]h&]uh1j hj4)hMhj(ubeh}(h]h ]h"]h$]h&]uh1j hj(ubh)}(h**Description**h]j )}(hjZ)h]h Description}(hj\)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjX)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_LT(expected, measured): expected < measuredh]h2EXPECT_LT(expected, measured): expected < measured}(hjp)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_LE (C macro) c.EXPECT_LEhNtauh1j hjhhhNhNubj )}(hhh](j )}(h EXPECT_LEh]j )}(h EXPECT_LEh]j )}(h EXPECT_LEh]j% )}(hj)h]h EXPECT_LE}(hj)hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj)ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj)hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj)hhhj)hMubah}(h]j)ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj)hMhj)hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj)hhhj)hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j)je j)jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_LE (expected, seen)``h]js )}(hj)h]hEXPECT_LE (expected, seen)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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_LE(expected, measured): expected <= 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``expected`` expected value h](j )}(h ``expected``h]js )}(hj*h]hexpected}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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)}(hexpected valueh]hexpected 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*ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjI*h]hseen}(hjK*hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjG*ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjC*ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjb*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^*hMhj_*ubah}(h]h ]h"]h$]h&]uh1j hjC*ubeh}(h]h ]h"]h$]h&]uh1j hj^*hMhj*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)}(h3EXPECT_LE(expected, measured): expected <= measuredh]h3EXPECT_LE(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_GT (C macro) c.EXPECT_GThNtauh1j hjhhhNhNubj )}(hhh](j )}(h EXPECT_GTh]j )}(h EXPECT_GTh]j )}(h EXPECT_GTh]j% )}(hj*h]h EXPECT_GT}(hj*hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj*ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj*hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj*hhhj*hMubah}(h]j*ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj*hMhj*hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj*hhhj*hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j*je j*jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_GT (expected, seen)``h]js )}(hj*h]hEXPECT_GT (expected, seen)}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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_GT(expected, measured): expected > 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``expected`` expected value h](j )}(h ``expected``h]js )}(hj:+h]hexpected}(hj<+hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj8+ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj4+ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjS+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO+hMhjP+ubah}(h]h ]h"]h$]h&]uh1j hj4+ubeh}(h]h ]h"]h$]h&]uh1j hjO+hMhj1+ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjs+h]hseen}(hju+hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjq+ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjm+ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1j hjm+ubeh}(h]h ]h"]h$]h&]uh1j hj+hMhj1+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]j )}(h EXPECT_GEh]j% )}(hj+h]h EXPECT_GE}(hj+hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj+ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj+hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj+hhhj ,hMubah}(h]j+ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj ,hMhj+hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj+hhhj ,hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j#,je j#,jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_GE (expected, seen)``h]js )}(hj),h]hEXPECT_GE (expected, seen)}(hj+,hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 )}(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``expected`` expected value h](j )}(h ``expected``h]js )}(hjd,h]hexpected}(hjf,hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjb,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)}(hexpected valueh]hexpected value}(hj},hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy,hMhjz,ubah}(h]h ]h"]h$]h&]uh1j hj^,ubeh}(h]h ]h"]h$]h&]uh1j hjy,hMhj[,ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj,h]hseen}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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[,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)}(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.hhMhj?,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]j )}(h EXPECT_NULLh]j% )}(hj-h]h EXPECT_NULL}(hj!-hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj-ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj-hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj-hhhj4-hMubah}(h]j-ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj4-hMhj-hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj-hhhj4-hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jM-je jM-jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_NULL (seen)``h]js )}(hjS-h]hEXPECT_NULL (seen)}(hjU-hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjQ-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 )}(hjo-h]h Parameters}(hjq-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjm-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhji-ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj-h]hseen}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 hji-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.hhMhji-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.hhMhji-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]j )}(h EXPECT_TRUEh]j% )}(hj.h]h EXPECT_TRUE}(hj.hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj.ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj .hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj.hhhj%.hMubah}(h]j.ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj%.hMhj.hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj.hhhj%.hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j>.je j>.jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_TRUE (seen)``h]js )}(hjD.h]hEXPECT_TRUE (seen)}(hjF.hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjB.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 )}(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.hhMhjZ.ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj.h]hseen}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj}.ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjy.ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMhj.ubah}(h]h ]h"]h$]h&]uh1j hjy.ubeh}(h]h ]h"]h$]h&]uh1j hj.hMhjv.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.hhMhjZ.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.hhMhjZ.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]j )}(h EXPECT_FALSEh]j% )}(hj.h]h EXPECT_FALSE}(hj/hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj.ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj.hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj.hhhj/hMubah}(h]j.ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj/hMhj.hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj.hhhj/hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j//je j//jf jg jh uh1j hhhjhNhNubh)}(h``EXPECT_FALSE (seen)``h]js )}(hj5/h]hEXPECT_FALSE (seen)}(hj7/hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj3/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 )}(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.hhMhjK/ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hjp/h]hseen}(hjr/hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjn/ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjj/ubj )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1j hjj/ubeh}(h]h ]h"]h$]h&]uh1j hj/hMhjg/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.hhMhjK/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.hhMhjK/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]j )}(h EXPECT_STREQh]j% )}(hj/h]h EXPECT_STREQ}(hj/hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj/ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj/hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj/hhhj0hMubah}(h]j/ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj0hMhj/hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj/hhhj0hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd j 0je j 0jf jg jh uh1j hhhjhNhNubh)}(h!``EXPECT_STREQ (expected, seen)``h]js )}(hj&0h]hEXPECT_STREQ (expected, seen)}(hj(0hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj$0ubah}(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 )}(hjB0h]h Parameters}(hjD0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj@0ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj<0ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hja0h]hexpected}(hjc0hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hj_0ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhj[0ubj )}(hhh]h)}(hexpected valueh]hexpected value}(hjz0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv0hMhjw0ubah}(h]h ]h"]h$]h&]uh1j hj[0ubeh}(h]h ]h"]h$]h&]uh1j hjv0hMhjX0ubj )}(h``seen`` measured value h](j )}(h``seen``h]js )}(hj0h]hseen}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 hj0hMhjX0ubeh}(h]h ]h"]h$]h&]uh1j hj<0ubh)}(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.hhMhj<0ubh)}(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.hhMhj<0ubeh}(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]j )}(h EXPECT_STRNEh]j% )}(hj1h]h EXPECT_STRNE}(hj1hhhNhNubah}(h]h ]j0 ah"]h$]h&]uh1j$ hj1ubah}(h]h ](j7 j8 eh"]h$]h&]jjuh1j hj1hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjjC uh1j jD jE hj1hhhj11hMubah}(h]j 1ah ](jI jJ eh"]h$]h&]jN jO )jP huh1j hj11hMhj1hhubjR )}(hhh]h}(h]h ]h"]h$]h&]uh1jQ hj1hhhj11hMubeh}(h]h ](jF macroeh"]h$]h&]jc jF jd jJ1je jJ1jf jg jh uh1j hhhjhNhNubh)}(h!``EXPECT_STRNE (expected, seen)``h]js )}(hjP1h]hEXPECT_STRNE (expected, seen)}(hjR1hhhNhNubah}(h]h ]h"]h$]h&]uh1jr hjN1ubah}(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 )}(hjl1h]h Parameters}(hjn1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjj1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjf1ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]js )}(hj1h]hexpected}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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]js )}(hj1h]hseen}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jr 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 hjf1ubh)}(h**Description**h]j )}(hj1h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:442: ./tools/testing/selftests/kselftest_harness.hhMhjf1ubh)}(h'jC'jh(jm(j)j)j*j*j+j+j-j-j.j.j.j.j/j/j 1j1u 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.