sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget'/translations/zh_CN/dev-tools/kselftestmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/pt_BR/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/dev-tools/kselftestmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hLinux Kernel Selftestsh]hLinux Kernel Selftests}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhA/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest.rsthKubh paragraph)}(hThe kernel contains a set of "self tests" under the tools/testing/selftests/ directory. These are intended to be small tests to exercise individual code paths in the kernel. Tests are intended to be run after building, installing and booting a kernel.h]hThe kernel contains a set of “self tests” under the tools/testing/selftests/ directory. These are intended to be small tests to exercise individual code paths in the kernel. Tests are intended to be run after building, installing and booting a kernel.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXKselftest from mainline can be run on older stable kernels. Running tests from mainline offers the best coverage. Several test rings run mainline kselftest suite on stable releases. The reason is that when a new test gets added to test existing code to regression test a bug, we should be able to run that test on an older kernel. Hence, it is important to keep code that can still test an older kernel and make sure it skips the test gracefully on newer releases.h]hXKselftest from mainline can be run on older stable kernels. Running tests from mainline offers the best coverage. Several test rings run mainline kselftest suite on stable releases. The reason is that when a new test gets added to test existing code to regression test a bug, we should be able to run that test on an older kernel. Hence, it is important to keep code that can still test an older kernel and make sure it skips the test gracefully on newer releases.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(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 }(hhhhhNhNubh reference)}(h`Test Harness`_h]h Test Harness}(hjhhhNhNubah}(h]h ]h"]h$]h&]name Test Harnessrefid test-harnessuh1hhhresolvedKubh?. Tests that need to be run in kernel space may wish to use a }(hhhhhNhNubj)}(h`Test Module`_h]h Test Module}(hjhhhNhNubah}(h]h ]h"]h$]h&]name Test Modulej test-moduleuh1hhhjKubh.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hDocumentation on the testsh]hDocumentation on the tests}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hhhhhKubh)}(h4For documentation on the kselftests themselves, see:h]h4For documentation on the kselftests themselves, see:}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj3hhubhcompound)}(hhh]htoctree)}(hhh]h}(h]h ]h"]h$]h&]hdev-tools/kselftestentries]Ndev-tools/testing-devicesa includefiles]jeamaxdepthJcaptionNglobhidden includehiddennumberedK titlesonly rawentries]uh1jWhhhK"hjTubah}(h]h ]toctree-wrapperah"]h$]h&]uh1jRhj3hhhhhK%ubeh}(h]documentation-on-the-testsah ]h"]documentation on the testsah$]h&]uh1hhhhhhhhKubh)}(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:spacepreserveuh1jhhhK+hjhhubh)}(hTo run the tests::h]hTo run the tests:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjhhubj)}(h+$ make -C tools/testing/selftests run_testsh]h+$ make -C tools/testing/selftests run_tests}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK0hjhhubh)}(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&]uh1hhhhK2hjhhubj)}(h$ make kselftesth]h$ make kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK4hjhhubh)}(h2Note that some tests will require root privileges.h]h2Note that some tests will require root privileges.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjhhubh)}(hX.Kselftest supports saving output files in a separate directory and then running tests. To locate output files in a separate directory two syntaxes are supported. In both cases the working directory must be the root of the kernel src. This is applicable to "Running a subset of selftests" section below.h]hX2Kselftest supports saving output files in a separate directory and then running tests. To locate output files in a separate directory two syntaxes are supported. In both cases the working directory must be the root of the kernel src. This is applicable to “Running a subset of selftests” section below.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjhhubh)}(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&]uh1hhhhK>hjhhubj)}(h!$ make O=/tmp/kselftest kselftesth]h!$ make O=/tmp/kselftest kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK@hjhhubh)}(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}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjhhubj)}(h5$ export KBUILD_OUTPUT=/tmp/kselftest; make kselftesth]h5$ export KBUILD_OUTPUT=/tmp/kselftest; make kselftest}hj0sbah}(h]h ]h"]h$]h&]jjuh1jhhhKDhjhhubh)}(hOThe O= assignment takes precedence over the KBUILD_OUTPUT environment variable.h]hOThe O= assignment takes precedence over the KBUILD_OUTPUT environment variable.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjhhubh)}(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.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh)}(h/To run kselftest with summary option enabled ::h]h,To run kselftest with summary option enabled}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjhhubj)}(h$ make summary=1 kselftesth]h$ make summary=1 kselftest}hjhsbah}(h]h ]h"]h$]h&]jjuh1jhhhKQhjhhubeh}(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&]uh1hhj~hhhhhKTubh)}(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&]uh1hhhhKVhj~hhubh)}(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&]uh1hhhhKYhj~hhubj)}(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[hj~hhubh)}(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&]uh1hhhhK]hj~hhubj)}(h'$ make TARGETS="size timers" kselftesth]h'$ make TARGETS="size timers" kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK_hj~hhubh)}(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&]uh1hhhhKahj~hhubj)}(h7$ make O=/tmp/kselftest TARGETS="size timers" kselftesth]h7$ make O=/tmp/kselftest TARGETS="size timers" kselftest}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKchj~hhubh)}(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&]uh1hhhhKehj~hhubj)}(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&]jjuh1jhhhKghj~hhubh)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihj~hhubh)}(h)To run all tests but a single subsystem::h]h(To run all tests but a single subsystem:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhj~hhubj)}(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&]jjuh1jhhhKnhj~hhubh)}(h(You can specify multiple tests to skip::h]h'You can specify multiple tests to skip:}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKphj~hhubj)}(h,$ make SKIP_TARGETS="size timers" kselftesth]h,$ make SKIP_TARGETS="size timers" kselftest}hjEsbah}(h]h ]h"]h$]h&]jjuh1jhhhKrhj~hhubh)}(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:}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthj~hhubj)}(hE$ make TARGETS="breakpoints size timers" SKIP_TARGETS=size kselftesth]hE$ make TARGETS="breakpoints size timers" SKIP_TARGETS=size kselftest}hjasbah}(h]h ]h"]h$]h&]jjuh1jhhhKwhj~hhubh)}(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.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhj~hhubeh}(h]running-a-subset-of-selftestsah ]h"]running a subset of selftestsah$]h&]uh1hhhhhhhhKT referencedKubh)}(hhh](h)}(h+Requiring all targets to build successfullyh]h+Requiring all targets to build successfully}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK}ubh)}(hBy default, the build succeeds as long as at least one target builds without error. Set ``FORCE_TARGETS=1`` to instead require every target to build successfully; make will abort as soon as any target fails::h](hXBy default, the build succeeds as long as at least one target builds without error. Set }(hjhhhNhNubhliteral)}(h``FORCE_TARGETS=1``h]hFORCE_TARGETS=1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhd to instead require every target to build successfully; make will abort as soon as any target fails:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h1$ make -C tools/testing/selftests FORCE_TARGETS=1h]h1$ make -C tools/testing/selftests FORCE_TARGETS=1}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hThis applies to both the ``all`` and ``install`` targets and is useful in CI environments where a silent partial build would be misleading.h](hThis applies to both the }(hjhhhNhNubj)}(h``all``h]hall}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h ``install``h]hinstall}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh[ targets and is useful in CI environments where a silent partial build would be misleading.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]+requiring-all-targets-to-build-successfullyah ]h"]+requiring all targets to build successfullyah$]h&]uh1hhhhhhhhK}ubh)}(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}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hTo run the hotplug tests::h]hTo run the hotplug tests:}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h-$ make -C tools/testing/selftests run_hotplugh]h-$ make -C tools/testing/selftests run_hotplug}hj<sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h2Note that some tests will require root privileges.h]h2Note that some tests will require root privileges.}(hjJhhhNhNubah}(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}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hhhhhKubh)}(hYou can use the "install" target of "make" (which calls the `kselftest_install.sh` tool) to install selftests in the default location (`tools/testing/selftests/kselftest_install`), or in a user specified location via the `INSTALL_PATH` "make" variable.h](hDYou can use the “install” target of “make” (which calls the }(hjqhhhNhNubhtitle_reference)}(h`kselftest_install.sh`h]hkselftest_install.sh}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjqubh5 tool) to install selftests in the default location (}(hjqhhhNhNubjz)}(h+`tools/testing/selftests/kselftest_install`h]h)tools/testing/selftests/kselftest_install}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjqubh+), or in a user specified location via the }(hjqhhhNhNubjz)}(h`INSTALL_PATH`h]h INSTALL_PATH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjqubh “make” variable.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj`hhubh)}(h*To install selftests in default location::h]h)To install selftests in default location:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj`hhubj)}(h)$ make -C tools/testing/selftests installh]h)$ make -C tools/testing/selftests install}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhj`hhubh)}(h3To install selftests in a user specified location::h]h2To install selftests in a user specified location:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj`hhubj)}(hG$ make -C tools/testing/selftests install INSTALL_PATH=/some/other/pathh]hG$ make -C tools/testing/selftests install INSTALL_PATH=/some/other/path}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhj`hhubeh}(h]install-selftestsah ]h"]install selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hRunning installed selftestsh]hRunning installed selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(h{Found in the install directory, as well as in the Kselftest tarball, is a script named `run_kselftest.sh` to run the tests.h](hWFound in the install directory, as well as in the Kselftest tarball, is a script named }(hjhhhNhNubjz)}(h`run_kselftest.sh`h]hrun_kselftest.sh}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjubh 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:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h+$ cd kselftest_install $ ./run_kselftest.shh]h+$ cd kselftest_install $ ./run_kselftest.sh}hj6sbah}(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 }(hjDhhhNhNubjz)}(h`-l`h]h-l}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjDubh option can be used:}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h$ ./run_kselftest.sh -lh]h$ ./run_kselftest.sh -l}hjdsbah}(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 }(hjrhhhNhNubjz)}(h`-c`h]h-c}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjrubhH option can be used to run all the tests from a test collection, or the }(hjrhhhNhNubjz)}(h`-t`h]h-t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjrubhE option for specific single tests. Either can be used multiple times:}(hjrhhhNhNubeh}(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}hjsbah}(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 }(hjhhhNhNubjz)}(h`-h`h]h-h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjubh option.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]running-installed-selftestsah ]h"]running installed selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hTimeout for selftestsh]hTimeout for selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX:Selftests are designed to be quick and so a default timeout is used of 45 seconds for each test. Tests can override the default timeout by adding a settings file in their directory and set a timeout variable there to the configured a desired upper timeout for the test. Only a few tests override the timeout with a value higher than 45 seconds, selftests strives to keep it that way. Timeouts in selftests are not considered fatal because the system under which a test runs may change and this can also modify the expected time it takes to run a test. If you have control over the systems which will run the tests you can configure a test runner on those systems to use a greater or lower timeout on the command line as with the `-o` or the `--override-timeout` argument. For example to use 165 seconds instead one would use::h](hXSelftests are designed to be quick and so a default timeout is used of 45 seconds for each test. Tests can override the default timeout by adding a settings file in their directory and set a timeout variable there to the configured a desired upper timeout for the test. Only a few tests override the timeout with a value higher than 45 seconds, selftests strives to keep it that way. Timeouts in selftests are not considered fatal because the system under which a test runs may change and this can also modify the expected time it takes to run a test. If you have control over the systems which will run the tests you can configure a test runner on those systems to use a greater or lower timeout on the command line as with the }(hjhhhNhNubjz)}(h`-o`h]h-o}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjubh or the }(hjhhhNhNubjz)}(h`--override-timeout`h]h--override-timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjubh@ argument. For example to use 165 seconds instead one would use:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h+$ ./run_kselftest.sh --override-timeout 165h]h+$ ./run_kselftest.sh --override-timeout 165}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hYou can look at the TAP output to see if you ran into the timeout. Test runners which know a test must run under a specific time can then optionally treat these timeouts then as fatal.h]hYou can look at the TAP output to see if you ran into the timeout. Test runners which know a test must run under a specific time can then optionally treat these timeouts then as fatal.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]timeout-for-selftestsah ]h"]timeout for selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hPackaging selftestsh]hPackaging selftests}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhhhhhKubh)}(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:}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(h)$ make -C tools/testing/selftests gen_tarh]h)$ make -C tools/testing/selftests gen_tar}hj`sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjAhhubh)}(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 }(hjnhhhNhNubjz)}(h!`INSTALL_PATH/kselftest-packages`h]hINSTALL_PATH/kselftest-packages}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjnubh directory. By default, }(hjnhhhNhNubjz)}(h`.gz`h]h.gz}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjnubhN format is used. The tar compression format can be overridden by specifying a }(hjnhhhNhNubjz)}(h`FORMAT`h]hFORMAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjnubh( make variable. Any value recognized by }(hjnhhhNhNubj)}(h`tar's auto-compress`_h]htar’s auto-compress}(hjhhhNhNubah}(h]h ]h"]h$]h&]nametar's auto-compressrefuriMhttps://www.gnu.org/software/tar/manual/html_node/gzip.html#auto_002dcompressuh1hhjnjKubh option is supported, such as:}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(h4$ make -C tools/testing/selftests gen_tar FORMAT=.xzh]h4$ make -C tools/testing/selftests gen_tar FORMAT=.xz}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjAhhubh)}(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](jz)}(h`make gen_tar`h]h make gen_tar}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjubh invokes }(hjhhhNhNubjz)}(h`make install`h]h make install}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jyhjubhP so you can use it to package a subset of tests by using variables specified in }(hjhhhNhNubj)}(h `Running a subset of selftests`_h]hRunning a subset of selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameRunning a subset of selftestsjjuh1hhjjKubh section:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(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&]jjuh1jhhhKhjAhhubhtarget)}(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&]jjuh1j&hKhjAhhhhjKubeh}(h]packaging-selftestsah ]h"]packaging selftestsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hContributing new testsh]hContributing new tests}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hhhhhKubh)}(h'In general, the rules for selftests areh]h'In general, the rules for selftests are}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj<hhubh 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;}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhubah}(h]h ]h"]h$]h&]uh1jfhjcubjg)}(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&]uh1jfhjcubjg)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jfhjcubjg)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jfhjcubjg)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jfhjcubeh}(h]h ]h"]h$]h&]bullet*uh1jahhhKhj]ubah}(h]h ]h"]h$]h&]uh1j[hhhKhj<hhubeh}(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]jb)}(hhh](jg)}(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&]uh1hhhhMhjubj)}(hNCFLAGS = $(KHDR_INCLUDES) TEST_GEN_PROGS := close_range_test include ../lib.mkh]hNCFLAGS = $(KHDR_INCLUDES) TEST_GEN_PROGS := close_range_test include ../lib.mk}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjubeh}(h]h ]h"]h$]h&]uh1jfhj ubjg)}(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.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj4ubh)}(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.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj4ubh)}(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.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubh)}(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.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubh)}(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.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubh)}(hATEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests.h]hATEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj4ubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM!hj4ubj\)}(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]jb)}(hhh](jg)}(h4symlinks to files in other directories are preservedh]h)}(hjh]h4symlinks to files in other directories are preserved}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM%hjubah}(h]h ]h"]h$]h&]uh1jfhjubjg)}(hmthe part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory h]h)}(hlthe part of paths below tools/testing/selftests/ is preserved when copying the files to the output directoryh]hlthe part of paths below tools/testing/selftests/ is preserved when copying the files to the output directory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM&hjubah}(h]h ]h"]h$]h&]uh1jfhjubeh}(h]h ]h"]h$]h&]jjuh1jahhhM%hjubah}(h]h ]h"]h$]h&]uh1j[hhhM%hj4ubh)}(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)hj4ubeh}(h]h ]h"]h$]h&]uh1jfhj ubjg)}(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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM,hj ubah}(h]h ]h"]h$]h&]uh1jfhj ubjg)}(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.}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM2hj$ ubh)}(h+e.g: tools/testing/selftests/android/configh]h+e.g: tools/testing/selftests/android/config}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hj$ ubeh}(h]h ]h"]h$]h&]uh1jfhj ubjg)}(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.}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM7hjJ ubah}(h]h ]h"]h$]h&]uh1jfhj ubjg)}(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:}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM:hjb ubj)}(hTARGETS += androidh]hTARGETS += android}hjt sbah}(h]h ]h"]h$]h&]jjuh1jhhhM<hjb ubeh}(h]h ]h"]h$]h&]uh1jfhj ubjg)}(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&]uh1hhhhM>hj 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}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhM@hj ubeh}(h]h ]h"]h$]h&]uh1jfhj ubeh}(h]h ]h"]h$]h&]jjuh1jahhhMhjubah}(h]h ]h"]h$]h&]uh1j[hhhMhjhhubeh}(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&]uh1hhj hhhhhMHubh)}(hXKselftest tests the kernel from userspace. Sometimes things need testing from within the kernel, one method of doing this is to create a test module. We can tie the module into the kselftest framework by using a shell script test runner. ``kselftest/module.sh`` is designed to facilitate this process. There is also a header file provided to assist writing kernel modules that are for use with kselftest:h](hKselftest tests the kernel from userspace. Sometimes things need testing from within the kernel, one method of doing this is to create a test module. We can tie the module into the kselftest framework by using a shell script test runner. }(hj hhhNhNubj)}(h``kselftest/module.sh``h]hkselftest/module.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh is designed to facilitate this process. There is also a header file provided to assist writing kernel modules that are for use with kselftest:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMJhj hhubjb)}(hhh](jg)}(h.``tools/testing/selftests/kselftest_module.h``h]h)}(hj h]j)}(hj h]h*tools/testing/selftests/kselftest_module.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhhhMQhj ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubjg)}(h0``tools/testing/selftests/kselftest/module.sh`` h]h)}(h/``tools/testing/selftests/kselftest/module.sh``h]j)}(hj h]h+tools/testing/selftests/kselftest/module.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhhhMRhj ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubeh}(h]h ]h"]h$]h&]j-uh1jahhhMQhj hhubh)}(hXNote that test modules should taint the kernel with TAINT_TEST. This will happen automatically for modules which are in the ``tools/testing/`` directory, or for modules which use the ``kselftest_module.h`` header above. Otherwise, you'll need to add ``MODULE_INFO(test, "Y")`` to your module source. selftests which do not load modules typically should not taint the kernel, but in cases where a non-test module is loaded, TEST_TAINT can be applied from userspace by writing to ``/proc/sys/kernel/tainted``.h](h|Note that test modules should taint the kernel with TAINT_TEST. This will happen automatically for modules which are in the }(hj> hhhNhNubj)}(h``tools/testing/``h]htools/testing/}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj> ubh) directory, or for modules which use the }(hj> hhhNhNubj)}(h``kselftest_module.h``h]hkselftest_module.h}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj> ubh/ header above. Otherwise, you’ll need to add }(hj> hhhNhNubj)}(h``MODULE_INFO(test, "Y")``h]hMODULE_INFO(test, "Y")}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj> ubh to your module source. selftests which do not load modules typically should not taint the kernel, but in cases where a non-test module is loaded, TEST_TAINT can be applied from userspace by writing to }(hj> hhhNhNubj)}(h``/proc/sys/kernel/tainted``h]h/proc/sys/kernel/tainted}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj> ubh.}(hj> hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMThj hhubh)}(hhh](h)}(h How to useh]h How to use}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM]ubh)}(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&]uh1hhhhM_hj hhubhenumerated_list)}(hhh](jg)}(hCreate the test module h]h)}(hCreate the test moduleh]hCreate the test module}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMbhj ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubjg)}(hmCreate the test script that will run (load/unload) the module e.g. ``tools/testing/selftests/lib/bitmap.sh`` h]h)}(hlCreate the test script that will run (load/unload) the module e.g. ``tools/testing/selftests/lib/bitmap.sh``h](hCCreate the test script that will run (load/unload) the module e.g. }(hj hhhNhNubj)}(h)``tools/testing/selftests/lib/bitmap.sh``h]h%tools/testing/selftests/lib/bitmap.sh}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hhhhMdhj ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubjg)}(hDAdd line to config file e.g. ``tools/testing/selftests/lib/config`` h]h)}(hCAdd line to config file e.g. ``tools/testing/selftests/lib/config``h](hAdd line to config file e.g. }(hj hhhNhNubj)}(h&``tools/testing/selftests/lib/config``h]h"tools/testing/selftests/lib/config}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hhhhMghj ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubjg)}(hKAdd test script to makefile e.g. ``tools/testing/selftests/lib/Makefile`` h]h)}(hJAdd test script to makefile e.g. ``tools/testing/selftests/lib/Makefile``h](h"Add test script to makefile e.g. }(hj hhhNhNubj)}(h(``tools/testing/selftests/lib/Makefile``h]h$tools/testing/selftests/lib/Makefile}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1hhhhMihj ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubjg)}(hVerify it works: h]h)}(hVerify it works:h]hVerify it works:}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMkhjB ubah}(h]h ]h"]h$]h&]uh1jfhj hhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j hj hhhhhMbubj)}(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}hje sbah}(h]h ]h"]h$]h&]jjforcelanguageshhighlight_args}uh1jhhhMmhj hhubeh}(h] how-to-useah ]h"] how to useah$]h&]uh1hhj hhhhhM]ubh)}(hhh](h)}(hExample Moduleh]hExample Module}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMwubh)}(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&]uh1hhhhMyhj 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");}hj sbah}(h]h ]h"]h$]h&]jjjs jt cjv }uh1jhhhM{hj hhubeh}(h]example-moduleah ]h"]example moduleah$]h&]uh1hhj hhhhhMwubh)}(hhh](h)}(hExample test scripth]hExample test script}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 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}hj sbah}(h]h ]h"]h$]h&]jjjs jt shjv }uh1jhhhMhj hhubeh}(h]example-test-scriptah ]h"]example test scriptah$]h&]uh1hhj hhhhhMubeh}(h]j(ah ]h"] test moduleah$]h&]uh1hhhhhhhhMHjKubh)}(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 hhhNhNubj)}(h`Test Module`_h]h Test Module}(hj hhhNhNubah}(h]h ]h"]h$]h&]name Test Modulejj(uh1hhj jKubh 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}hj9 sbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:431: ./tools/testing/selftests/kselftest_harness.hhK hj( hhubeh}(h]exampleah ]h"]exampleah$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(hHelpersh]hHelpers}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQ hhhhhMubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleTH_LOG (C macro)c.TH_LOGhNtauh1jb hjQ hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./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:438: ./tools/testing/selftests/kselftest_harness.hhK^ubah}(h]h ]h"]h$]h&]jj add_permalinkuh1j sphinx_line_type declaratorhj{ hhhj hK^ubah}(h]jq ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jy hj hK^hjv hhubh desc_content)}(hhh]h}(h]h ]h"]h$]h&]uh1j hjv hhhj hK^ubeh}(h]h ](j macroeh"]h$]h&]domainj objtypej desctypej noindex noindexentrynocontentsentryuh1jt hhhjQ hjs hNubh)}(h``TH_LOG (fmt, ...)``h]j)}(hj h]hTH_LOG (fmt, ...)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhK`hjQ 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:438: ./tools/testing/selftests/kselftest_harness.hhKbhj ubhdefinition_list)}(hhh](hdefinition_list_item)}(h``fmt`` format string h](hterm)}(h``fmt``h]j)}(hj h]hfmt}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhK`hj ubh definition)}(hhh]h)}(h format stringh]h format string}(hj2 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj, hK`hj/ ubah}(h]h ]h"]h$]h&]uh1j- hj ubeh}(h]h ]h"]h$]h&]uh1j hj, hK`hj ubj )}(h``...`` optional arguments h](j )}(h``...``h]j)}(hjR h]h...}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKahjL ubj. )}(hhh]h)}(hoptional argumentsh]hoptional arguments}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg hKahjh ubah}(h]h ]h"]h$]h&]uh1j- hjL ubeh}(h]h ]h"]h$]h&]uh1j hjg hKahj ubeh}(h]h ]h"]h$]h&]uh1j hj ubh)}(h**Description**h]j )}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKchj ubj)}(hTH_LOG(format, ...)h]hTH_LOG(format, ...)}hj sbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhK_hj ubh)}(hOptional debug logging function available for use in tests. Logging may be enabled or disabled by defining TH_LOG_ENABLED. E.g., #define TH_LOG_ENABLED 1h]hOptional debug logging function available for use in tests. Logging may be enabled or disabled by defining TH_LOG_ENABLED. E.g., #define TH_LOG_ENABLED 1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKchj ubh)}(hsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(hAlmost always, you want just FIXTURE() instead (see below). This call may be used when the type of the fixture data is needed. In general, this should not be needed unless the *self* is being passed to a helper directly.h](hAlmost always, you want just FIXTURE() instead (see below). This call may be used when the type of the fixture data is needed. In general, this should not be needed unless the }(hjNhhhNhNubhemphasis)}(h*self*h]hself}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhjNubh& is being passed to a helper directly.}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo FIXTURE (C macro) c.FIXTUREhNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(hFIXTUREh]j )}(hFIXTUREh]j )}(hFIXTUREh]j )}(hjh]hFIXTURE}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhjhKubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hjhKhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhKubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhjQ hjs hNubh)}(h``FIXTURE (fixture_name)``h]j)}(hjh]hFIXTURE (fixture_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjQ hhubj\)}(h7Called once per fixture to setup the data and register h]h)}(h6Called once per fixture to setup the data and registerh]h6Called once per fixture to setup the data and register}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubah}(h]h ]h"]h$]h&]uh1j[hjhKhjQ hhubj )}(hX,**Parameters** ``fixture_name`` fixture name **Description** .. code-block:: c FIXTURE(fixture_name) { type property1; ... }; Defines the data provided to TEST_F()-defined tests as *self*. It should be populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j)}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubj. )}(hhh]h)}(h fixture nameh]h fixture name}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hKhj1ubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hj0hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjTubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubj)}(h2FIXTURE(fixture_name) { type property1; ... };h]h2FIXTURE(fixture_name) { type property1; ... };}hjlsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubh)}(hDefines the data provided to TEST_F()-defined tests as *self*. It should be populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().h](h7Defines the data provided to TEST_F()-defined tests as }(hj|hhhNhNubjW)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhj|ubhV. It should be populated and cleaned up using FIXTURE_SETUP() and FIXTURE_TEARDOWN().}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo FIXTURE_SETUP (C macro)c.FIXTURE_SETUPhNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(h FIXTURE_SETUPh]j )}(h FIXTURE_SETUPh]j )}(h FIXTURE_SETUPh]j )}(hjh]h FIXTURE_SETUP}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhjhKubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hjhKhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhKubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhjQ hjs hNubh)}(h ``FIXTURE_SETUP (fixture_name)``h]j)}(hjh]hFIXTURE_SETUP (fixture_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjQ hhubj\)}(huPrepares the setup function for the fixture. *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. h]h)}(htPrepares the setup function for the fixture. *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly.h](h-Prepares the setup function for the fixture. }(hj hhhNhNubjW)}(h *_metadata*h]h _metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhj ubh< is included so that EXPECT_*, ASSERT_* etc. work correctly.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhj ubah}(h]h ]h"]h$]h&]uh1j[hj-hKhjQ hhubj )}(hX**Parameters** ``fixture_name`` fixture name **Description** .. code-block:: c FIXTURE_SETUP(fixture_name) { implementation } Populates the required "setup" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation. ASSERT_* are valid for use in this context and will prempt the execution of any dependent fixture tests. A bare "return;" statement may be used to return early.h](h)}(h**Parameters**h]j )}(hj:h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj8ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhj4ubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j)}(hjYh]h fixture_name}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhjSubj. )}(hhh]h)}(h fixture nameh]h fixture name}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhKhjoubah}(h]h ]h"]h$]h&]uh1j- hjSubeh}(h]h ]h"]h$]h&]uh1j hjnhKhjPubah}(h]h ]h"]h$]h&]uh1j hj4ubh)}(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:438: ./tools/testing/selftests/kselftest_harness.hhKhj4ubj)}(h.FIXTURE_SETUP(fixture_name) { implementation }h]h.FIXTURE_SETUP(fixture_name) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhKhj4ubh)}(hPopulates the required "setup" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation.h](hPopulates the required “setup” function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as }(hjhhhNhNubjW)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhjubh for the implementation.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhj4ubh)}(hhASSERT_* are valid for use in this context and will prempt the execution of any dependent fixture tests.h]hhASSERT_* are valid for use in this context and will prempt the execution of any dependent fixture tests.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhj4ubh)}(h7A bare "return;" statement may be used to return early.h]h;A bare “return;” statement may be used to return early.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo FIXTURE_TEARDOWN (C macro)c.FIXTURE_TEARDOWNhNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(hFIXTURE_TEARDOWNh]j )}(hFIXTURE_TEARDOWNh]j )}(hFIXTURE_TEARDOWNh]j )}(hjh]hFIXTURE_TEARDOWN}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhj0hMubah}(h]j ah ](j j eh"]h$]h&]j j )j huh1jy hj0hMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj0hMubeh}(h]h ](j macroeh"]h$]h&]j j j jIj jIj j j uh1jt hhhjQ hjs hNubh)}(h#``FIXTURE_TEARDOWN (fixture_name)``h]j)}(hjOh]hFIXTURE_TEARDOWN (fixture_name)}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjQ hhubj )}(hX**Parameters** ``fixture_name`` fixture name **Description** *_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly. .. code-block:: c FIXTURE_TEARDOWN(fixture_name) { implementation } Populates the required "teardown" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation to clean up. A bare "return;" statement may be used to return early.h](h)}(h**Parameters**h]j )}(hjkh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjiubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjeubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j)}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjubj. )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubah}(h]h ]h"]h$]h&]uh1j hjeubh)}(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:438: ./tools/testing/selftests/kselftest_harness.hhMhjeubh)}(hG*_metadata* is included so that EXPECT_*, ASSERT_* etc. work correctly.h](jW)}(h *_metadata*h]h _metadata}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhjubh< is included so that EXPECT_*, ASSERT_* etc. work correctly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjeubj)}(h1FIXTURE_TEARDOWN(fixture_name) { implementation }h]h1FIXTURE_TEARDOWN(fixture_name) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjeubh)}(hPopulates the required "teardown" function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as *self* for the implementation to clean up.h](hPopulates the required “teardown” function for a fixture. An instance of the datatype defined with FIXTURE_DATA() will be exposed as }(hjhhhNhNubjW)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhjubh$ for the implementation to clean up.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjeubh)}(h7A bare "return;" statement may be used to return early.h]h;A bare “return;” statement may be used to return early.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjeubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo FIXTURE_VARIANT (C macro)c.FIXTURE_VARIANThNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(hFIXTURE_VARIANTh]j )}(hFIXTURE_VARIANTh]j )}(hFIXTURE_VARIANTh]j )}(hjRh]hFIXTURE_VARIANT}(hj\hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjXubah}(h]h ](j j eh"]h$]h&]jjuh1j hjThhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMDubah}(h]h ]h"]h$]h&]jjj uh1j j j hjPhhhjohMDubah}(h]jKah ](j j eh"]h$]h&]j j )j huh1jy hjohMDhjMhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjMhhhjohMDubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhjQ hjs hNubh)}(h"``FIXTURE_VARIANT (fixture_name)``h]j)}(hjh]hFIXTURE_VARIANT (fixture_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMFhjQ hhubj\)}(h>Optionally called once per fixture to declare fixture variant h]h)}(h=Optionally called once per fixture to declare fixture varianth]h=Optionally called once per fixture to declare fixture variant}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMDhjubah}(h]h ]h"]h$]h&]uh1j[hjhMDhjQ 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 )}(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:438: ./tools/testing/selftests/kselftest_harness.hhMHhjubj )}(hhh]j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j)}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMGhjubj. )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMGhjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhMGhjubah}(h]h ]h"]h$]h&]uh1j 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:438: ./tools/testing/selftests/kselftest_harness.hhMIhjubj)}(h:FIXTURE_VARIANT(fixture_name) { type property1; ... };h]h:FIXTURE_VARIANT(fixture_name) { type property1; ... };}hj3sbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMHhjubh)}(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 }(hjChhhNhNubjW)}(h *variant*h]hvariant}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhjCubhC. Variants allow the same tests to be run with different arguments.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMOhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo FIXTURE_VARIANT_ADD (C macro)c.FIXTURE_VARIANT_ADDhNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(hFIXTURE_VARIANT_ADDh]j )}(hFIXTURE_VARIANT_ADDh]j )}(hFIXTURE_VARIANT_ADDh]j )}(hj~h]hFIXTURE_VARIANT_ADD}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMWubah}(h]h ]h"]h$]h&]jjj uh1j j j hj|hhhjhMWubah}(h]jwah ](j j eh"]h$]h&]j j )j huh1jy hjhMWhjyhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjyhhhjhMWubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhjQ hjs hNubh)}(h4``FIXTURE_VARIANT_ADD (fixture_name, variant_name)``h]j)}(hjh]h0FIXTURE_VARIANT_ADD (fixture_name, variant_name)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMYhjQ hhubj\)}(h?Called once per fixture variant to setup and register the data h]h)}(h>Called once per fixture variant to setup and register the datah]h>Called once per fixture variant to setup and register the data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMWhjubah}(h]h ]h"]h$]h&]uh1j[hjhMWhjQ 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:438: ./tools/testing/selftests/kselftest_harness.hhM[hjubj )}(hhh](j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j)}(hjh]h fixture_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMZhjubj. )}(hhh]h)}(h fixture nameh]h fixture name}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMZhj$ubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hj#hMZhjubj )}(h+``variant_name`` name of the parameter set h](j )}(h``variant_name``h]j)}(hjGh]h variant_name}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM[hjAubj. )}(hhh]h)}(hname of the parameter seth]hname of the parameter set}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hM[hj]ubah}(h]h ]h"]h$]h&]uh1j- hjAubeh}(h]h ]h"]h$]h&]uh1j hj\hM[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:438: ./tools/testing/selftests/kselftest_harness.hhM]hjubj)}(hOFIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... };h]hOFIXTURE_VARIANT_ADD(fixture_name, variant_name) { .property1 = val1, ... };}hjsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM\hjubh)}(hDefines a variant of the test fixture, provided to FIXTURE_SETUP() and TEST_F() as *variant*. Tests of each fixture will be run once for each variant.h](hSDefines a variant of the test fixture, provided to FIXTURE_SETUP() and TEST_F() as }(hjhhhNhNubjW)}(h *variant*h]hvariant}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhjubh:. Tests of each fixture will be run once for each variant.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMchjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo TEST_F (C macro)c.TEST_FhNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(hTEST_Fh]j )}(hTEST_Fh]j )}(hTEST_Fh]j )}(hjh]hTEST_F}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMyubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhjhMyubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hjhMyhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhMyubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhjQ hjs hNubh)}(h$``TEST_F (fixture_name, test_name)``h]j)}(hjh]h TEST_F (fixture_name, test_name)}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM{hjQ 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}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMyhj5ubah}(h]h ]h"]h$]h&]uh1j[hjGhMyhjQ 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 )}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjRubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM}hjNubj )}(hhh](j )}(h``fixture_name`` fixture name h](j )}(h``fixture_name``h]j)}(hjsh]h fixture_name}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM|hjmubj. )}(hhh]h)}(h fixture nameh]h fixture name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM|hjubah}(h]h ]h"]h$]h&]uh1j- hjmubeh}(h]h ]h"]h$]h&]uh1j hjhM|hjjubj )}(h``test_name`` test name h](j )}(h ``test_name``h]j)}(hjh]h test_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM}hjubj. )}(hhh]h)}(h test nameh]h test name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM}hjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhM}hjjubeh}(h]h ]h"]h$]h&]uh1j hjNubh)}(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:438: ./tools/testing/selftests/kselftest_harness.hhMhjNubj)}(h(TEST_F(fixture, name) { implementation }h]h(TEST_F(fixture, name) { implementation }}hjsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhM~hjNubh)}(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 }(hj hhhNhNubjW)}(h*self*h]hself}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhj ubhU is the setup instance of fixture’s datatype exposed for use by the implementation.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjNubh)}(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_*().}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjNubh)}(hThe *self* object is only shared with the potential forked processes if FIXTURE_TEARDOWN_PARENT() is used instead of FIXTURE_TEARDOWN().h](hThe }(hj=hhhNhNubjW)}(h*self*h]hself}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jVhj=ubh~ object is only shared with the potential forked processes if FIXTURE_TEARDOWN_PARENT() is used instead of FIXTURE_TEARDOWN().}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1j hjQ hhhjs hNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo TEST_HARNESS_MAIN (C macro)c.TEST_HARNESS_MAINhNtauh1jb hjQ hhhjs hNubju )}(hhh](jz )}(hTEST_HARNESS_MAINh]j )}(hTEST_HARNESS_MAINh]j )}(hTEST_HARNESS_MAINh]j )}(hjxh]hTEST_HARNESS_MAIN}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj~ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjzhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjvhhhjhMubah}(h]jqah ](j j eh"]h$]h&]j j )j huh1jy hjhMhjshhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjshhhjhMubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhjQ hjs hNubh)}(h``TEST_HARNESS_MAIN``h]j)}(hjh]hTEST_HARNESS_MAIN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjQ hhubj\)}(h Simple wrapper to run the test harness **Description** .. code-block:: c TEST_HARNESS_MAIN Use once to append a main() to the test file. h](j\)}(h'Simple wrapper to run the test harness h]h)}(h&Simple wrapper to run the test harnessh]h&Simple wrapper to run the test harness}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjubah}(h]h ]h"]h$]h&]uh1j[hjhMhjubh)}(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:438: ./tools/testing/selftests/kselftest_harness.hhMhjubj)}(hTEST_HARNESS_MAINh]hTEST_HARNESS_MAIN}hjsbah}(h]h ]h"]h$]h&]jjjs jt j jv }uh1jhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:438: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(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:438: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ]h"]h$]h&]uh1j[hjhMhjQ hhubeh}(h]helpersah ]h"]helpersah$]h&]uh1hhj hhhhhMubh)}(hhh](h)}(h Operatorsh]h Operators}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhMubh)}(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.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:446: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_EQ (C macro) c.ASSERT_EQhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_EQh]j )}(h ASSERT_EQh]j )}(h ASSERT_EQh]j )}(hj_h]h ASSERT_EQ}(hjihhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjeubah}(h]h ](j j eh"]h$]h&]jjuh1j hjahhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hj]hhhj|hMubah}(h]jXah ](j j eh"]h$]h&]j j )j huh1jy hj|hMhjZhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjZhhhj|hMubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhj,hNhNubh)}(h``ASSERT_EQ (expected, seen)``h]j)}(hjh]hASSERT_EQ (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_EQ(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:449: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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 )}(hjJh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjHubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h3ASSERT_EQ(expected, measured): expected == measuredh]h3ASSERT_EQ(expected, measured): expected == measured}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_NE (C macro) c.ASSERT_NEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_NEh]j )}(h ASSERT_NEh]j )}(h ASSERT_NEh]j )}(hjh]h ASSERT_NE}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM ubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhjhM ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hjhM hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhM ubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhj,hNhNubh)}(h``ASSERT_NE (expected, seen)``h]j)}(hjh]hASSERT_NE (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_NE(expected, measured): expected != measuredh](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hjh]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj9h]hseen}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj3ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjNhMhjOubah}(h]h ]h"]h$]h&]uh1j- hj3ubeh}(h]h ]h"]h$]h&]uh1j hjNhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjth]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjrubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h3ASSERT_NE(expected, measured): expected != measuredh]h3ASSERT_NE(expected, measured): expected != measured}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_LT (C macro) c.ASSERT_LThNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_LTh]j )}(h ASSERT_LTh]j )}(h ASSERT_LTh]j )}(hjh]h ASSERT_LT}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhjhMubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hjhMhjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhMubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhj,hNhNubh)}(h``ASSERT_LT (expected, seen)``h]j)}(hjh]hASSERT_LT (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_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:449: ./tools/testing/selftests/kselftest_harness.hhMhjubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj*h]hexpected}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj$ubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hjChhhNhNubah}(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]j)}(hjch]hseen}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj]ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxhMhjyubah}(h]h ]h"]h$]h&]uh1j- hj]ubeh}(h]h ]h"]h$]h&]uh1j hjxhMhj!ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubh)}(h2ASSERT_LT(expected, measured): expected < measuredh]h2ASSERT_LT(expected, measured): expected < measured}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_LE (C macro) c.ASSERT_LEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_LEh]j )}(h ASSERT_LEh]j )}(h ASSERT_LEh]j )}(hjh]h ASSERT_LE}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjubah}(h]h ](j j eh"]h$]h&]jjuh1j hjhhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM#ubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhjhM#ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hjhM#hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhjhM#ubeh}(h]h ](j macroeh"]h$]h&]j j j jj jj j j uh1jt hhhj,hNhNubh)}(h``ASSERT_LE (expected, seen)``h]j)}(hjh]hASSERT_LE (expected, seen)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM%hj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_LE(expected, measured): expected <= measuredh](h)}(h**Parameters**h]j )}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM'hj/ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hjTh]hexpected}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM%hjNubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihM%hjjubah}(h]h ]h"]h$]h&]uh1j- hjNubeh}(h]h ]h"]h$]h&]uh1j hjihM%hjKubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM&hjubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM&hjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhM&hjKubeh}(h]h ]h"]h$]h&]uh1j hj/ubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM(hj/ubh)}(h3ASSERT_LE(expected, measured): expected <= measuredh]h3ASSERT_LE(expected, measured): expected <= measured}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM$hj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_GT (C macro) c.ASSERT_GThNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_GTh]j )}(h ASSERT_GTh]j )}(h ASSERT_GTh]j )}(hjh]h ASSERT_GT}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM.ubah}(h]h ]h"]h$]h&]jjj uh1j j j hjhhhj$hM.ubah}(h]jah ](j j eh"]h$]h&]j j )j huh1jy hj$hM.hjhhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjhhhj$hM.ubeh}(h]h ](j macroeh"]h$]h&]j j j j=j j=j j j uh1jt hhhj,hNhNubh)}(h``ASSERT_GT (expected, seen)``h]j)}(hjCh]hASSERT_GT (expected, seen)}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM0hj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_GT(expected, measured): expected > measuredh](h)}(h**Parameters**h]j )}(hj_h]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j hj]ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM2hjYubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj~h]hexpected}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM0hjxubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM0hjubah}(h]h ]h"]h$]h&]uh1j- hjxubeh}(h]h ]h"]h$]h&]uh1j hjhM0hjuubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hjh]hseen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM1hjubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM1hjubah}(h]h ]h"]h$]h&]uh1j- hjubeh}(h]h ]h"]h$]h&]uh1j hjhM1hjuubeh}(h]h ]h"]h$]h&]uh1j hjYubh)}(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:449: ./tools/testing/selftests/kselftest_harness.hhM3hjYubh)}(h2ASSERT_GT(expected, measured): expected > measuredh]h2ASSERT_GT(expected, measured): expected > measured}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM/hjYubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_GE (C macro) c.ASSERT_GEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_GEh]j )}(h ASSERT_GEh]j )}(h ASSERT_GEh]j )}(hj1 h]h ASSERT_GE}(hj; hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj7 ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj3 hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM9ubah}(h]h ]h"]h$]h&]jjj uh1j j j hj/ hhhjN hM9ubah}(h]j* ah ](j j eh"]h$]h&]j j )j huh1jy hjN hM9hj, hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj, hhhjN hM9ubeh}(h]h ](j macroeh"]h$]h&]j j j jg j jg j j j uh1jt hhhj,hNhNubh)}(h``ASSERT_GE (expected, seen)``h]j)}(hjm h]hASSERT_GE (expected, seen)}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM;hj,hhubj )}(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:449: ./tools/testing/selftests/kselftest_harness.hhM=hj ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj h]hexpected}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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]j)}(hj h]hseen}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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 )}(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:449: ./tools/testing/selftests/kselftest_harness.hhM>hj ubh)}(h3ASSERT_GE(expected, measured): expected >= measuredh]h3ASSERT_GE(expected, measured): expected >= measured}(hj2!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhM:hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_NULL (C macro) c.ASSERT_NULLhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_NULLh]j )}(h ASSERT_NULLh]j )}(h ASSERT_NULLh]j )}(hj[!h]h ASSERT_NULL}(hje!hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hja!ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj]!hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMDubah}(h]h ]h"]h$]h&]jjj uh1j j j hjY!hhhjx!hMDubah}(h]jT!ah ](j j eh"]h$]h&]j j )j huh1jy hjx!hMDhjV!hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjV!hhhjx!hMDubeh}(h]h ](j macroeh"]h$]h&]j j j j!j j!j j j uh1jt hhhj,hNhNubh)}(h``ASSERT_NULL (seen)``h]j)}(hj!h]hASSERT_NULL (seen)}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMFhj,hhubj )}(hc**Parameters** ``seen`` measured value **Description** ASSERT_NULL(measured): NULL == measuredh](h)}(h**Parameters**h]j )}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj!ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMHhj!ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj!h]hseen}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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!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:449: ./tools/testing/selftests/kselftest_harness.hhMHhj!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:449: ./tools/testing/selftests/kselftest_harness.hhMEhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_TRUE (C macro) c.ASSERT_TRUEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_TRUEh]j )}(h ASSERT_TRUEh]j )}(h ASSERT_TRUEh]j )}(hjL"h]h ASSERT_TRUE}(hjV"hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjR"ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjN"hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMNubah}(h]h ]h"]h$]h&]jjj uh1j j j hjJ"hhhji"hMNubah}(h]jE"ah ](j j eh"]h$]h&]j j )j huh1jy hji"hMNhjG"hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjG"hhhji"hMNubeh}(h]h ](j macroeh"]h$]h&]j j j j"j j"j j j uh1jt hhhj,hNhNubh)}(h``ASSERT_TRUE (seen)``h]j)}(hj"h]hASSERT_TRUE (seen)}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMPhj,hhubj )}(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:449: ./tools/testing/selftests/kselftest_harness.hhMRhj"ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj"h]hseen}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMPhj"ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMPhj"ubah}(h]h ]h"]h$]h&]uh1j- hj"ubeh}(h]h ]h"]h$]h&]uh1j hj"hMPhj"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:449: ./tools/testing/selftests/kselftest_harness.hhMRhj"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:449: ./tools/testing/selftests/kselftest_harness.hhMOhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_FALSE (C macro)c.ASSERT_FALSEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_FALSEh]j )}(h ASSERT_FALSEh]j )}(h ASSERT_FALSEh]j )}(hj=#h]h ASSERT_FALSE}(hjG#hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjC#ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj?#hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMXubah}(h]h ]h"]h$]h&]jjj uh1j j j hj;#hhhjZ#hMXubah}(h]j6#ah ](j j eh"]h$]h&]j j )j huh1jy hjZ#hMXhj8#hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj8#hhhjZ#hMXubeh}(h]h ](j macroeh"]h$]h&]j j j js#j js#j j j uh1jt hhhj,hNhNubh)}(h``ASSERT_FALSE (seen)``h]j)}(hjy#h]hASSERT_FALSE (seen)}(hj{#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw#ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMZhj,hhubj )}(ha**Parameters** ``seen`` measured value **Description** ASSERT_FALSE(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:449: ./tools/testing/selftests/kselftest_harness.hhM\hj#ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj#h]hseen}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMZhj#ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hMZhj#ubah}(h]h ]h"]h$]h&]uh1j- hj#ubeh}(h]h ]h"]h$]h&]uh1j hj#hMZhj#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:449: ./tools/testing/selftests/kselftest_harness.hhM\hj#ubh)}(h%ASSERT_FALSE(measured): measured == 0h]h%ASSERT_FALSE(measured): measured == 0}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMYhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_STREQ (C macro)c.ASSERT_STREQhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_STREQh]j )}(h ASSERT_STREQh]j )}(h ASSERT_STREQh]j )}(hj.$h]h ASSERT_STREQ}(hj8$hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj4$ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj0$hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMbubah}(h]h ]h"]h$]h&]jjj uh1j j j hj,$hhhjK$hMbubah}(h]j'$ah ](j j eh"]h$]h&]j j )j huh1jy hjK$hMbhj)$hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj)$hhhjK$hMbubeh}(h]h ](j macroeh"]h$]h&]j j j jd$j jd$j j j uh1jt hhhj,hNhNubh)}(h!``ASSERT_STREQ (expected, seen)``h]j)}(hjj$h]hASSERT_STREQ (expected, seen)}(hjl$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh$ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMdhj,hhubj )}(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:449: ./tools/testing/selftests/kselftest_harness.hhMfhj$ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj$h]hexpected}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMdhj$ubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMdhj$ubah}(h]h ]h"]h$]h&]uh1j- hj$ubeh}(h]h ]h"]h$]h&]uh1j hj$hMdhj$ubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj$h]hseen}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMehj$ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMehj$ubah}(h]h ]h"]h$]h&]uh1j- hj$ubeh}(h]h ]h"]h$]h&]uh1j hj$hMehj$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:449: ./tools/testing/selftests/kselftest_harness.hhMghj$ubh)}(h=ASSERT_STREQ(expected, measured): !strcmp(expected, measured)h]h=ASSERT_STREQ(expected, measured): !strcmp(expected, measured)}(hj/%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMchj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo ASSERT_STRNE (C macro)c.ASSERT_STRNEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h ASSERT_STRNEh]j )}(h ASSERT_STRNEh]j )}(h ASSERT_STRNEh]j )}(hjX%h]h ASSERT_STRNE}(hjb%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj^%ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjZ%hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMmubah}(h]h ]h"]h$]h&]jjj uh1j j j hjV%hhhju%hMmubah}(h]jQ%ah ](j j eh"]h$]h&]j j )j huh1jy hju%hMmhjS%hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjS%hhhju%hMmubeh}(h]h ](j macroeh"]h$]h&]j j j j%j j%j j j uh1jt hhhj,hNhNubh)}(h!``ASSERT_STRNE (expected, seen)``h]j)}(hj%h]hASSERT_STRNE (expected, seen)}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMohj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** ASSERT_STRNE(expected, measured): strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj%ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMqhj%ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj%h]hexpected}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMohj%ubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMohj%ubah}(h]h ]h"]h$]h&]uh1j- hj%ubeh}(h]h ]h"]h$]h&]uh1j hj%hMohj%ubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj&h]hseen}(hj &hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMphj&ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj!&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMphj&ubah}(h]h ]h"]h$]h&]uh1j- hj&ubeh}(h]h ]h"]h$]h&]uh1j hj&hMphj%ubeh}(h]h ]h"]h$]h&]uh1j hj%ubh)}(h**Description**h]j )}(hjC&h]h Description}(hjE&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjA&ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMrhj%ubh)}(h*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:*ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_LE(expected, measured): expected <= measuredh](h)}(h**Parameters**h]j )}(hjX*h]h Parameters}(hjZ*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjV*ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjR*ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hjw*h]hexpected}(hjy*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju*ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhjq*ubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j- hjq*ubeh}(h]h ]h"]h$]h&]uh1j hj*hMhjn*ubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj*h]hseen}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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*hMhjn*ubeh}(h]h ]h"]h$]h&]uh1j hjR*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:449: ./tools/testing/selftests/kselftest_harness.hhMhjR*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:449: ./tools/testing/selftests/kselftest_harness.hhMhjR*ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_GT (C macro) c.EXPECT_GThNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_GTh]j )}(h EXPECT_GTh]j )}(h EXPECT_GTh]j )}(hj*+h]h EXPECT_GT}(hj4+hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj0+ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj,+hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hj(+hhhjG+hMubah}(h]j#+ah ](j j eh"]h$]h&]j j )j huh1jy hjG+hMhj%+hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj%+hhhjG+hMubeh}(h]h ](j macroeh"]h$]h&]j j j j`+j j`+j j j uh1jt hhhj,hNhNubh)}(h``EXPECT_GT (expected, seen)``h]j)}(hjf+h]hEXPECT_GT (expected, seen)}(hjh+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd+ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(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:449: ./tools/testing/selftests/kselftest_harness.hhMhj|+ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj+h]hexpected}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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]j)}(hj+h]hseen}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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:449: ./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:449: ./tools/testing/selftests/kselftest_harness.hhMhj|+ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_GE (C macro) c.EXPECT_GEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_GEh]j )}(h EXPECT_GEh]j )}(h EXPECT_GEh]j )}(hjT,h]h EXPECT_GE}(hj^,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjZ,ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjV,hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjR,hhhjq,hMubah}(h]jM,ah ](j j eh"]h$]h&]j j )j huh1jy hjq,hMhjO,hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjO,hhhjq,hMubeh}(h]h ](j macroeh"]h$]h&]j j j j,j j,j j j uh1jt hhhj,hNhNubh)}(h``EXPECT_GE (expected, seen)``h]j)}(hj,h]hEXPECT_GE (expected, seen)}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_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:449: ./tools/testing/selftests/kselftest_harness.hhMhj,ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj,h]hexpected}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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]j)}(hj-h]hseen}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./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}(hjA-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,ubh)}(h3EXPECT_GE(expected, measured): expected >= measuredh]h3EXPECT_GE(expected, measured): expected >= measured}(hjU-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_NULL (C macro) c.EXPECT_NULLhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_NULLh]j )}(h EXPECT_NULLh]j )}(h EXPECT_NULLh]j )}(hj~-h]h EXPECT_NULL}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj-ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj-hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hj|-hhhj-hMubah}(h]jw-ah ](j j eh"]h$]h&]j j )j huh1jy hj-hMhjy-hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjy-hhhj-hMubeh}(h]h ](j macroeh"]h$]h&]j j j j-j j-j j j uh1jt hhhj,hNhNubh)}(h``EXPECT_NULL (seen)``h]j)}(hj-h]hEXPECT_NULL (seen)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(hc**Parameters** ``seen`` measured value **Description** EXPECT_NULL(measured): NULL == measuredh](h)}(h**Parameters**h]j )}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj-ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj-ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj-h]hseen}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj-ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj .hMhj .ubah}(h]h ]h"]h$]h&]uh1j- hj-ubeh}(h]h ]h"]h$]h&]uh1j hj .hMhj-ubah}(h]h ]h"]h$]h&]uh1j hj-ubh)}(h**Description**h]j )}(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:449: ./tools/testing/selftests/kselftest_harness.hhMhj-ubh)}(h'EXPECT_NULL(measured): NULL == measuredh]h'EXPECT_NULL(measured): NULL == measured}(hjF.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_TRUE (C macro) c.EXPECT_TRUEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_TRUEh]j )}(h EXPECT_TRUEh]j )}(h EXPECT_TRUEh]j )}(hjo.h]h EXPECT_TRUE}(hjy.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hju.ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjq.hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjm.hhhj.hMubah}(h]jh.ah ](j j eh"]h$]h&]j j )j huh1jy hj.hMhjj.hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjj.hhhj.hMubeh}(h]h ](j macroeh"]h$]h&]j j j j.j j.j j j uh1jt hhhj,hNhNubh)}(h``EXPECT_TRUE (seen)``h]j)}(hj.h]hEXPECT_TRUE (seen)}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h`**Parameters** ``seen`` measured value **Description** EXPECT_TRUE(measured): 0 != 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:449: ./tools/testing/selftests/kselftest_harness.hhMhj.ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj.h]hseen}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj.ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hMhj.ubah}(h]h ]h"]h$]h&]uh1j- hj.ubeh}(h]h ]h"]h$]h&]uh1j hj.hMhj.ubah}(h]h ]h"]h$]h&]uh1j hj.ubh)}(h**Description**h]j )}(hj!/h]h Description}(hj#/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj.ubh)}(h$EXPECT_TRUE(measured): 0 != measuredh]h$EXPECT_TRUE(measured): 0 != measured}(hj7/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_FALSE (C macro)c.EXPECT_FALSEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_FALSEh]j )}(h EXPECT_FALSEh]j )}(h EXPECT_FALSEh]j )}(hj`/h]h EXPECT_FALSE}(hjj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjf/ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjb/hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hj^/hhhj}/hMubah}(h]jY/ah ](j j eh"]h$]h&]j j )j huh1jy hj}/hMhj[/hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hj[/hhhj}/hMubeh}(h]h ](j macroeh"]h$]h&]j j j j/j j/j j j uh1jt hhhj,hNhNubh)}(h``EXPECT_FALSE (seen)``h]j)}(hj/h]hEXPECT_FALSE (seen)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(ha**Parameters** ``seen`` measured value **Description** EXPECT_FALSE(measured): 0 == 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:449: ./tools/testing/selftests/kselftest_harness.hhMhj/ubj )}(hhh]j )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj/h]hseen}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj/ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1j- hj/ubeh}(h]h ]h"]h$]h&]uh1j hj/hMhj/ubah}(h]h ]h"]h$]h&]uh1j hj/ubh)}(h**Description**h]j )}(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:449: ./tools/testing/selftests/kselftest_harness.hhMhj/ubh)}(h%EXPECT_FALSE(measured): 0 == measuredh]h%EXPECT_FALSE(measured): 0 == measured}(hj(0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_STREQ (C macro)c.EXPECT_STREQhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_STREQh]j )}(h EXPECT_STREQh]j )}(h EXPECT_STREQh]j )}(hjQ0h]h EXPECT_STREQ}(hj[0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hjW0ubah}(h]h ](j j eh"]h$]h&]jjuh1j hjS0hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjO0hhhjn0hMubah}(h]jJ0ah ](j j eh"]h$]h&]j j )j huh1jy hjn0hMhjL0hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjL0hhhjn0hMubeh}(h]h ](j macroeh"]h$]h&]j j j j0j j0j j j uh1jt hhhj,hNhNubh)}(h!``EXPECT_STREQ (expected, seen)``h]j)}(hj0h]hEXPECT_STREQ (expected, seen)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_STREQ(expected, measured): !strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj0ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj0h]hexpected}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj0ubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1j- hj0ubeh}(h]h ]h"]h$]h&]uh1j hj0hMhj0ubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj1h]hseen}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj0ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j- hj0ubeh}(h]h ]h"]h$]h&]uh1j hj1hMhj0ubeh}(h]h ]h"]h$]h&]uh1j hj0ubh)}(h**Description**h]j )}(hj<1h]h Description}(hj>1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj:1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj0ubh)}(h=EXPECT_STREQ(expected, measured): !strcmp(expected, measured)h]h=EXPECT_STREQ(expected, measured): !strcmp(expected, measured)}(hjR1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1j hj,hhhNhNubjc )}(hhh]h}(h]h ]h"]h$]h&]entries](jo EXPECT_STRNE (C macro)c.EXPECT_STRNEhNtauh1jb hj,hhhNhNubju )}(hhh](jz )}(h EXPECT_STRNEh]j )}(h EXPECT_STRNEh]j )}(h EXPECT_STRNEh]j )}(hj{1h]h EXPECT_STRNE}(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1j hj1ubah}(h]h ](j j eh"]h$]h&]jjuh1j hj}1hhhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMubah}(h]h ]h"]h$]h&]jjj uh1j j j hjy1hhhj1hMubah}(h]jt1ah ](j j eh"]h$]h&]j j )j huh1jy hj1hMhjv1hhubj )}(hhh]h}(h]h ]h"]h$]h&]uh1j hjv1hhhj1hMubeh}(h]h ](j macroeh"]h$]h&]j j j j1j j1j j j uh1jt hhhj,hNhNubh)}(h!``EXPECT_STRNE (expected, seen)``h]j)}(hj1h]hEXPECT_STRNE (expected, seen)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj,hhubj )}(h**Parameters** ``expected`` expected value ``seen`` measured value **Description** EXPECT_STRNE(expected, measured): strcmp(expected, measured)h](h)}(h**Parameters**h]j )}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj1ubj )}(hhh](j )}(h``expected`` expected value h](j )}(h ``expected``h]j)}(hj1h]hexpected}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj1ubj. )}(hhh]h)}(hexpected valueh]hexpected value}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1j- hj1ubeh}(h]h ]h"]h$]h&]uh1j hj2hMhj1ubj )}(h``seen`` measured value h](j )}(h``seen``h]j)}(hj+2h]hseen}(hj-2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)2ubah}(h]h ]h"]h$]h&]uh1j hp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj%2ubj. )}(hhh]h)}(hmeasured valueh]hmeasured value}(hjD2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@2hMhjA2ubah}(h]h ]h"]h$]h&]uh1j- hj%2ubeh}(h]h ]h"]h$]h&]uh1j hj@2hMhj1ubeh}(h]h ]h"]h$]h&]uh1j hj1ubh)}(h**Description**h]j )}(hjf2h]h Description}(hjh2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjd2ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/dev-tools/kselftest:449: ./tools/testing/selftests/kselftest_harness.hhMhj1ubh)}(hj;j9j6j1j.jjj j j j(j} jz j j j j j2jjN jK j)j&j2j2u nametypes}(j2j~j{jjj]jjj>j9j1jj j j} j j j2jN j)j2uh}(j2hj{j3jxjjj~jjjZjjj`jjj;jj6jAj.j(jj<j jj(j jz j j j j j jj jK j( j&jQ jq j{ j j j jjVj[jjjjj jjKjPjwj|jjjqjvj2j,jXj]jjjjjjjjj* j/ jT!jY!jE"jJ"j6#j;#j'$j,$jQ%jV%j{&j&j'j'j(j(j)j)j#+j(+jM,jR,jw-j|-jh.jm.jY/j^/jJ0jO0jt1jy1u 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.