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

config ZTEST
	bool "Zephyr testing framework"
	select TEST
	select OUTPUT_SYMBOLS
	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_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.

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_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

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
