#
# KUnit base configuration
#

menuconfig KUNIT
	tristate "KUnit - Enable support for unit tests"
	select GLOB
	help
	  Enables support for kernel unit tests (KUnit), a lightweight unit
	  testing and mocking framework for the Linux kernel. These tests are
	  able to be run locally on a developer's workstation without a VM or
	  special hardware when using UML. Can also be used on most other
	  architectures. For more information, please see
	  Documentation/dev-tools/kunit/.

if KUNIT

config KUNIT_DEBUGFS
	bool "KUnit - Enable /sys/kernel/debug/kunit debugfs representation" if !KUNIT_ALL_TESTS
	default KUNIT_ALL_TESTS
	help
	  Enable debugfs representation for kunit.  Currently this consists
	  of /sys/kernel/debug/kunit/<test_suite>/results files for each
	  test suite, which allow users to see results of the last test suite
	  run that occurred.

config KUNIT_FAULT_TEST
	bool "Enable KUnit tests which print BUG stacktraces"
	depends on KUNIT_TEST
	depends on !UML
	default !PANIC_ON_OOPS
	help
	  Enables fault handling tests for the KUnit framework. These tests may
	  trigger a kernel BUG(), and the associated stack trace, even when they
	  pass. If this conflicts with your test infrastrcture (or is confusing
	  or annoying), they can be disabled by setting this to N.

config KUNIT_TEST
	tristate "KUnit test for KUnit" if !KUNIT_ALL_TESTS
	default KUNIT_ALL_TESTS
	help
	  Enables the unit tests for the KUnit test framework. These tests test
	  the KUnit test framework itself; the tests are both written using
	  KUnit and test KUnit. This option should only be enabled for testing
	  purposes by developers interested in testing that KUnit works as
	  expected.

config KUNIT_EXAMPLE_TEST
	tristate "Example test for KUnit" if !KUNIT_ALL_TESTS
	default KUNIT_ALL_TESTS
	help
	  Enables an example unit test that illustrates some of the basic
	  features of KUnit. This test only exists to help new users understand
	  what KUnit is and how it is used. Please refer to the example test
	  itself, lib/kunit/example-test.c, for more information. This option
	  is intended for curious hackers who would like to understand how to
	  use KUnit for kernel development.

config KUNIT_ALL_TESTS
	tristate "All KUnit tests with satisfied dependencies"
	help
	  Enables all KUnit tests, if they can be enabled.
	  KUnit tests run during boot and output the results to the debug log
	  in TAP format (http://testanything.org/). Only useful for kernel devs
	  running the KUnit test harness, and not intended for inclusion into a
	  production build.

	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config KUNIT_DEFAULT_ENABLED
	bool "Default value of kunit.enable"
	default y
	help
	  Sets the default value of kunit.enable. If set to N then KUnit
	  tests will not execute unless kunit.enable=1 is passed to the
	  kernel command line.

	  In most cases this should be left as Y. Only if additional opt-in
	  behavior is needed should this be set to N.

config KUNIT_AUTORUN_ENABLED
	bool "Default value of kunit.autorun"
	default y
	help
	  Sets the default value of kunit.autorun. If set to N then KUnit
	  tests will not run after initialization unless kunit.autorun=1 is
	  passed to the kernel command line. The test can still be run manually
	  via debugfs interface.

	  In most cases this should be left as Y. Only if additional opt-in
	  behavior is needed should this be set to N.

config KUNIT_DEFAULT_FILTER_GLOB
	string "Default value of the filter_glob module parameter"
	help
	  Sets the default value of kunit.filter_glob. If set to a non-empty
	  string only matching tests are executed.

	  If unsure, leave empty so all tests are executed.

config KUNIT_DEFAULT_FILTER
	string "Default value of the filter module parameter"
	help
	  Sets the default value of kunit.filter. If set to a non-empty
	  string only matching tests are executed.

	  If unsure, leave empty so all tests are executed.

config KUNIT_DEFAULT_FILTER_ACTION
	string "Default value of the filter_action module parameter"
	help
	  Sets the default value of kunit.filter_action. If set to a non-empty
	  string only matching tests are executed.

	  If unsure, leave empty so all tests are executed.

config KUNIT_DEFAULT_TIMEOUT
	int "Default value of the timeout module parameter"
	default 300
	help
	  Sets the default timeout, in seconds, for Kunit test cases. This value
	  is further multiplied by a factor determined by the assigned speed
	  setting: 1x for `DEFAULT`, 3x for `KUNIT_SPEED_SLOW`, and 12x for
	  `KUNIT_SPEED_VERY_SLOW`. This allows slower tests on slower machines
	  sufficient time to complete.

	  If unsure, the default timeout of 300 seconds is suitable for most
	  cases.

config KUNIT_UML_PCI
	bool "KUnit UML PCI Support"
	depends on UML
	select UML_PCI
	help
	  Enables the PCI subsystem on UML for use by KUnit tests.
	  Some KUnit tests require the PCI core which is not enabled by
	  default on UML.

	  If unsure, say N.

endif # KUNIT
