# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

config ZTEST
	bool "Zephyr testing framework"
	select TEST
	help
	  Enable the Zephyr testing framework. You should enable this only
	  if you're writing automated tests.

if ZTEST

config ZTEST_NEW_API
	bool "Use the new Ztest API"
	help
	  Enables the new Ztest APIs for creating suites and unit tests in
	  separate compilation units as well as the new 'rules' API.

config ZTEST_STACK_SIZE
	int "Test function thread stack size"
	default 2048 if COVERAGE_GCOV
	default 1024

config ZTEST_TEST_DELAY_MS
	int "Delay between tests in milliseconds"
	default 0
	help
	  Add a delay between between tests to manage output on the console on
	  systems that can't handle the rapid output rate.

config ZTEST_CPU_HOLD_TIME_MS
	int "Time in milliseconds to hold other CPUs for 1cpu type tests"
	default 3000
	help
	  This option is used to specify the maximum time in milliseconds for
	  which a 1cpu type test may execute on a multicpu system. The default
	  value ought to suffice for most such tests; however slower platforms
	  (which may include simulators) may need to set this to a larger
	  value. Please be aware that increasing it for long-running test cases
	  may overload the CI system. Modify with caution.

config ZTEST_FAIL_FAST
	bool "Abort on first failing test"
	help
	  Stop and abort on first failing test. Do not continue with other
	  tests that might be in the queue.

config ZTEST_ASSERT_VERBOSE
	int "Assertion verbosity level"
	default 1
	help
	  Set verbosity level for assertions.
	  Assertion verbosity levels:
	  0 Write only file and line for failed assertions
	  1 Write file, line number, function and reason for failed assertions
	  2 Log also successful assertions

config ZTEST_THREAD_PRIORITY
	int "Testing thread priority"
	default -2 if !PREEMPT_ENABLED
	default -1
	help
	  Set priority of the testing thread. Default is -1 (cooperative).

config ZTEST_TC_UTIL_USER_OVERRIDE
	bool "Override tc_util.h"
	help
	  Enable overriding defines in tc_util.h.
	  If True the user should provide tc_util_user_override.h in Zephyr's include path,
	  e.g. by adding zephyr_include_directories(project PRIVATE my_folder) to a project's CMakeLists.txt.
	  The override header may now #define the various macros and strings in tc_util.h which are
	  surrounded by #ifndef ... #endif blocks.

config ZTEST_RETEST_IF_PASSED
	bool "Reset the board to test again if the test passed"
	select REBOOT
	help
	  If the test passed reset the board so it is run again.  This
	  may be used as an alternative to manual resets when
	  attempting to reproduce an intermittent failure.

config ZTEST_FATAL_HOOK
	bool "Using a pre-defined fatal handler and hook function"
	help
	  Use the pre-defined common fatal error handler and a post hook to
	  do actions in your test case, this option often enabled when doing
	  error test case. Remember to add ignore_fault tag in yaml file when
	  using twister to run testing.

config ZTEST_ASSERT_HOOK
	bool "Using a pre-defined assert handler and hook function"
	help
	  Use the pre-defined common assert fail handler and a post hook to
	  do actions in your test case, this option often enabled when doing
	  error test case. Remember to add ignore_fault tag in yaml file when
	  using twister to run testing.

config ZTEST_NO_YIELD
	bool "Do not yield to the idle thread after tests complete"
	help
	  When the tests complete, do not yield to the idle thread and instead
	  spin in a loop. This is useful for low power mode tests, where
	  yielding to the idle thread may put the board into a low power state
	  where a debugger cannot connect to it.

config ZTEST_WARN_NO_OPTIMIZATIONS
	bool "Warn when running tests with CONFIG_NO_OPTIMIZATIONS"
	default y if !(ARCH_POSIX || COVERAGE)
	depends on NO_OPTIMIZATIONS
	help
	  Print a CMake warning when building ztests with no compiler
	  optimizations. Please don't file issues when running tests that are
	  not explicitly tuned to work in this configuration.

if ZTEST_NEW_API

menu "ztest provided rules"

config ZTEST_RULE_1CPU
	bool "Run all the tests on a single CPU"
	help
	  This rule will call z_test_1cpu_start before each unit test and
	  ztest_1cpu_stop after each test.

endmenu

config ZTEST_VERIFY_RUN_ALL
	bool "Validates all defined tests have ran"
	default y
	help
	  This rule will fail the project if not all tests have been run.

config ZTEST_SHUFFLE
	bool "Shuffle the order of tests and suites"
	select TEST_RANDOM_GENERATOR if !ENTROPY_HAS_DRIVER
	help
	  This rule will shuffle the order of tests and test suites.

if ZTEST_SHUFFLE
config ZTEST_SHUFFLE_SUITE_REPEAT_COUNT
	int "Number of iterations the test suite will run"
	default 3
	help
	  This rule will execute a test suite N number of times. The tests
	  per suite will be shuffled on each iteration.  The test order will likely
	  be different per iteration.

config ZTEST_SHUFFLE_TEST_REPEAT_COUNT
	int "Number of iterations the test will run"
	default 3
	help
	  This rule will execute a test N number of times.  The test order will
	  likely be different per iteration.

endif #ZTEST_SHUFFLE

config ZTEST_SUMMARY
	bool "Display test summary"
	default y
	help
	  This option controls output of a test summary.

config ZTEST_VERBOSE_OUTPUT
	bool "Verbose test output"
	default y
	help
	  This option controls whether test output is shown verbosely or
	  no output at all.

config ZTEST_VERBOSE_SUMMARY
	bool "Verbose test summary"
	default y
	help
	  This option controls whether suite summary is shown verbosely or
	  just in one line.

config ZTEST_FAIL_ON_ASSUME
	bool "Fail the test run when an assumption fails"
	default y
	help
	  When enabled, the test binary will fail at the end if an assumption failed. This means
	  that while tests will still be marked as skipped on failed zassume calls, the final test
	  result will be shown as a failure in order to increase visibility. This precludes tests
	  that skipped with the ZTEST_EXPECT_SKIP annotation.

endif # ZTEST_NEW_API

config TEST_LOGGING_FLUSH_AFTER_TEST
	bool "When enabled logs are flushed after each test case"
	default y
	depends on MULTITHREADING

endif # ZTEST

config ZTEST_MOCKING
	bool "Mocking support functions"
	help
	  Enable mocking support for Ztest. This allows the test to set
	  return values and expected parameters to functions.

config ZTEST_PARAMETER_COUNT
	int "Count of parameters or return values reserved"
	default 10
	depends on ZTEST_MOCKING
	help
	  Maximum amount of concurrent return values / expected parameters.

config ZTRESS
	bool "Stress test framework"
	select THREAD_RUNTIME_STATS
	select THREAD_MONITOR
	select TEST_RANDOM_GENERATOR if !ENTROPY_HAS_DRIVER
	depends on !USERSPACE

if ZTRESS

config ZTRESS_MAX_THREADS
	int "Maximum number of threads in ztress framework"
	default 3
	range 1 16

config ZTRESS_STACK_SIZE
	int "Stack size of Ztress thread"
	default 4096 if NO_OPTIMIZATIONS
	default 2048

config ZTRESS_REPORT_PROGRESS_MS
	int "Progress report interval (in milliseconds)"
	default 1000
	help
	  Use 0 to disable.
endif # ZTRESS
