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

endif # ZTEST_NEW_API

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
