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

menu "Testing"

source "subsys/testsuite/ztest/Kconfig"

config TEST
	bool "Mark project as a test"
	# For tests, store thread names in binary and dump them on crash to
	# ease debugging.
	select THREAD_NAME
	help
	  Mark a project or an application as a test. This will enable a few
	  test defaults.

config TEST_EXTRA_STACK_SIZE
	int "Test function extra thread stack size"
	default 2048 if COVERAGE_GCOV
	default 768 if XTENSA
	default 0
	depends on TEST
	help
	  Additional stack for tests on some platform where default is not
	  enough.

config HAS_COVERAGE_SUPPORT
	bool
	help
	  The code coverage report generation is only available on boards
	  with enough spare RAM to buffer the coverage data, or on boards
	  based on the POSIX ARCH.

config COVERAGE
	bool "Create coverage data"
	depends on HAS_COVERAGE_SUPPORT
	help
	  This option will build your application with the -coverage option
	  which will generate data that can be used to create coverage reports.
	  For more information see
	  https://docs.zephyrproject.org/latest/guides/coverage.html

choice
	prompt "Coverage mode"
	default COVERAGE_NATIVE_GCOV if NATIVE_BUILD
	default COVERAGE_GCOV if !NATIVE_BUILD
	depends on COVERAGE

config COVERAGE_NATIVE_GCOV
	bool "Host compiler gcov based code coverage"
	depends on NATIVE_BUILD
	help
	  Build natively with the compiler standard `--coverage` options,
	  that is with gcov/GCC-compatible coverage

config COVERAGE_NATIVE_SOURCE
	bool "Host compiler source based code coverage"
	depends on NATIVE_BUILD
	depends on "${ZEPHYR_TOOLCHAIN_VARIANT}" = "llvm"
	help
	  Build natively with the compiler source based coverage options.
	  Today this is only supported with LLVM

config COVERAGE_GCOV
	bool "Create Coverage data from hardware platform"
	depends on !NATIVE_BUILD
	help
	  This option will select the custom gcov library. The reports will
	  be available over serial. This serial dump can be passed to
	  gen_gcov_files.py which creates the required .gcda files. These
	  can be read by gcov utility. For more details see gcovr.com .

endchoice

config COVERAGE_GCOV_HEAP_SIZE
	int "Size of heap allocated for gcov coverage data dump"
	depends on COVERAGE_GCOV
	default 32768 if X86 || SOC_SERIES_MPS2
	default 16384
	help
	  This option configures the heap size allocated for gcov coverage
	  data to be dumped over serial. If the value is 0, no buffer will be used,
	  data will be dumped directly over serial.

config COVERAGE_DUMP
	bool "Dump coverage data on exit"
	depends on COVERAGE_GCOV
	help
	  Dump collected coverage information to console on exit.

config FORCE_COVERAGE
	bool "Force coverage"
	select HAS_COVERAGE_SUPPORT
	help
	  Regardless of platform support, it will enable coverage data production.
	  If the platform does not support coverage by default, setting this config
	  does not guarantee that coverage data will be gathered.
	  Application may not fit memory or crash at runtime.

config TEST_USERSPACE
	bool "Indicate that this test exercises user mode"
	help
	  This option indicates that a test case puts threads in user mode,
	  and that the build system will [override and] enable USERSPACE
	  if the platform supports it. It should be set in a .conf file on
	  a per-test basis and is not meant to be used outside test cases.
	  Tests with this option should also have the "userspace" filtering
	  tag in their testcase.yaml file.

	  The userspace APIs are no-ops if userspace is not enabled, so it is
	  OK to enable this even if the test will run on platforms which do
	  not support userspace. The test should still run on those platforms,
	  just with all threads in supervisor mode.

	  If a test *requires* that userspace be enabled in order to
	  pass, CONFIG_ARCH_HAS_USERSPACE should be filtered in its
	  testcase.yaml.

config TEST_LOGGING_DEFAULTS
	bool "Test case logging defaults"
	depends on TEST
	select LOG
	select LOG_DEFAULT_MINIMAL
	default y
	help
	  Option which implements default policy of enabling logging in
	  minimal mode for all test cases. For tests that need alternate
	  logging configuration, or no logging at all, disable this
	  in the project-level defconfig.

config TEST_ENABLE_USERSPACE
	bool
	depends on TEST_USERSPACE
	depends on ARCH_HAS_USERSPACE
	select USERSPACE
	imply DYNAMIC_OBJECTS
	default y
	help
	  This hidden option implements the TEST_USERSPACE logic. It turns on
	  USERSPACE when CONFIG_ARCH_HAS_USERSPACE is set and the test
	  case itself indicates that it exercises user mode via
	  CONFIG_TEST_USERSPACE.

config TEST_USERSPACE_WITHOUT_HW_STACK_PROTECTION
	bool "Run User Mode tests without additionally enabling stack protection"
	depends on TEST_ENABLE_USERSPACE
	default y if SOC_SERIES_KINETIS_KE1XF || SOC_SERIES_S32K1
	help
	  A HW platform might not have sufficient MPU/MMU capabilities to support
	  running all test cases with User Mode and HW Stack Protection features
	  simultaneously enabled. For this platforms we execute the User Mode-
	  related tests without enabling HW stack protection.

config TEST_HW_STACK_PROTECTION
	bool "Hardware-based stack overflow detection if available"
	depends on ARCH_HAS_STACK_PROTECTION
	depends on TEST
	select HW_STACK_PROTECTION
	default y if !TEST_USERSPACE_WITHOUT_HW_STACK_PROTECTION
	help
	  This option will enable hardware-based stack protection by default
	  for all test cases if the hardware supports it.

config TEST_FLASH_DRIVERS
	bool "Test flash drivers"
	depends on BOARD_QEMU_X86
	select FLASH_HAS_DRIVER_ENABLED
	help
	  This option will help test the flash drivers. This should be enabled
	  only when using qemu_x86.

config TEST_ARM_CORTEX_M
	bool
	depends on CPU_CORTEX_M
	depends on TEST
	default y
	select ARM_SECURE_BUSFAULT_HARDFAULT_NMI if ARM_SECURE_FIRMWARE
	help
	  ARM Cortex-M configuration required when testing.

	  This option is used to select stack sizes and enable features for
	  testing.

	  This option is also used to force routing
	  BusFault, HardFault, and NMI exceptions to Secure State,
	  when building a Secure ARMv8-M firmware. This will allow
	  the testing suite to utilize these exceptions, in tests.
	  Note that by default, when building with ARM_SECURE_FIRMWARE
	  set, these exceptions are set to target the Non-Secure state.

config TEST_BUSY_SIM
	bool "Busy simulator"
	depends on TEST
	select ENTROPY_GENERATOR
	select RING_BUFFER if !XOSHIRO_RANDOM_GENERATOR
	select COUNTER
	help
	  It simulates cpu load by using counter device to generate interrupts
	  with random intervals and random busy looping in the interrupt.

endmenu
