Tests: memory protect: add some error test cases

Add some error case for adding and removing memory partition
API.

Signed-off-by: Lixin Guo <lixinx.guo@intel.com>
This commit is contained in:
Lixin Guo 2021-09-28 22:57:27 +08:00 committed by Anas Nashif
commit a5a360d319
3 changed files with 98 additions and 0 deletions

View file

@ -41,6 +41,10 @@ void test_main(void)
ztest_unit_test(test_mem_part_overlap),
ztest_unit_test(test_mem_domain_init_fail),
ztest_unit_test(test_mem_domain_remove_part_fail),
ztest_unit_test(test_mem_part_add_error_null),
ztest_unit_test(test_mem_part_add_error_zerosize),
ztest_unit_test(test_mem_part_error_wraparound),
ztest_unit_test(test_mem_part_remove_error_zerosize),
/* mem_partition.c */
ztest_user_unit_test(test_mem_part_assign_bss_vars_zero),

View file

@ -493,3 +493,93 @@ void test_mem_domain_init_fail(void)
zassert_unreachable("should not be here");
#endif
}
/**
* @brief Test error case of adding null memory partition fail
*
* @details Try to add a null partition to memory domain, then see
* if an expected fatal error happens.
*
* @ingroup kernel_memprotect_tests
*/
void test_mem_part_add_error_null(void)
{
/* add partition fail, expected fault happened */
set_fault_valid(true);
k_mem_domain_add_partition(&test_domain_fail, NULL);
ztest_test_fail();
}
static volatile uint8_t __aligned(MEM_REGION_ALLOC) nosize_buf[MEM_REGION_ALLOC];
K_MEM_PARTITION_DEFINE(nonsize_part, nosize_buf, sizeof(nosize_buf),
K_MEM_PARTITION_P_RO_U_RO);
/**
* @brief Test error case of adding zero sized memory partition fail
*
* @details Try to add a zero sized partition to memory domain, then see
* if an expected fatal error happens.
*
* @ingroup kernel_memprotect_tests
*/
void test_mem_part_add_error_zerosize(void)
{
struct k_mem_partition *nosize_part = &nonsize_part;
nosize_part->size = 0U;
/* add partition fail, expected fault happened */
set_fault_valid(true);
k_mem_domain_add_partition(&test_domain_fail, nosize_part);
ztest_test_fail();
}
/**
* @brief Test error case of memory partition address wraparound
*
* @details Try to add a partition whose adddress is wraparound will cause
* assertion, then triggher an expected fatal error.
*
* @ingroup kernel_memprotect_tests
*/
void test_mem_part_error_wraparound(void)
{
#ifdef CONFIG_64BIT
K_MEM_PARTITION_DEFINE(wraparound_part, 0xfffffffffffff800, 2048,
K_MEM_PARTITION_P_RO_U_RO);
#else
K_MEM_PARTITION_DEFINE(wraparound_part, 0xfffff800, 2048,
K_MEM_PARTITION_P_RO_U_RO);
#endif
/* add partition fail, expected fault happened */
set_fault_valid(true);
k_mem_domain_add_partition(&test_domain_fail, &wraparound_part);
ztest_test_fail();
}
/**
* @brief Test error case of removing memory partition fail
*
* @details Try to remove a partition size mismatched will cause
* assertion, then triggher an expected fatal error.
* And while the fatal error happened, the memory domain spinlock
* is held, we need to release them to make other follow test case.
*
* @ingroup kernel_memprotect_tests
*/
void test_mem_part_remove_error_zerosize(void)
{
struct k_mem_partition *no_parts = &find_no_part;
k_mem_domain_remove_partition(&test_domain, &rw_parts[0]);
k_mem_domain_add_partition(&test_domain, no_parts);
no_parts->size = 0U;
/* remove partition fail, expected fault happened */
need_recover_spinlock = true;
set_fault_valid(true);
k_mem_domain_remove_partition(&test_domain, no_parts);
ztest_test_fail();
}

View file

@ -23,6 +23,10 @@ extern void test_mem_domain_boot_threads(void);
extern void test_mem_domain_migration(void);
extern void test_mem_domain_init_fail(void);
extern void test_mem_domain_remove_part_fail(void);
extern void test_mem_part_add_error_null(void);
extern void test_mem_part_add_error_zerosize(void);
extern void test_mem_part_error_wraparound(void);
extern void test_mem_part_remove_error_zerosize(void);
extern void test_macros_obtain_names_data_bss(void);
extern void test_mem_part_assign_bss_vars_zero(void);