#
# 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"
	depends on DEBUG_FS
	default y
	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
