From e5b5407ece7630fa9e792fc1279a4ec67d733d28 Mon Sep 17 00:00:00 2001 From: Andrew Boie Date: Thu, 12 Oct 2017 12:11:49 -0700 Subject: [PATCH] tests: obj_validation: cleanup Improved test coverage to reflect current policy and converted to ztest. Signed-off-by: Andrew Boie --- .../mem_protect/obj_validation/prj.conf | 1 + .../mem_protect/obj_validation/src/Makefile | 3 +- .../mem_protect/obj_validation/src/main.c | 101 +++++++++++------- 3 files changed, 64 insertions(+), 41 deletions(-) diff --git a/tests/kernel/mem_protect/obj_validation/prj.conf b/tests/kernel/mem_protect/obj_validation/prj.conf index 90b88349b6f..75f9e148078 100644 --- a/tests/kernel/mem_protect/obj_validation/prj.conf +++ b/tests/kernel/mem_protect/obj_validation/prj.conf @@ -1 +1,2 @@ +CONFIG_ZTEST=y CONFIG_USERSPACE=y diff --git a/tests/kernel/mem_protect/obj_validation/src/Makefile b/tests/kernel/mem_protect/obj_validation/src/Makefile index ff9a0446eb9..6b2ef31cafa 100644 --- a/tests/kernel/mem_protect/obj_validation/src/Makefile +++ b/tests/kernel/mem_protect/obj_validation/src/Makefile @@ -1,4 +1,3 @@ -ccflags-y += -I$(ZEPHYR_BASE)/tests/include +include $(ZEPHYR_BASE)/tests/Makefile.test obj-y += main.o - diff --git a/tests/kernel/mem_protect/obj_validation/src/main.c b/tests/kernel/mem_protect/obj_validation/src/main.c index d578f99c405..75fb5fffb2f 100644 --- a/tests/kernel/mem_protect/obj_validation/src/main.c +++ b/tests/kernel/mem_protect/obj_validation/src/main.c @@ -5,10 +5,8 @@ */ #include -#include -#include -#include #include +#include #define SEM_ARRAY_SIZE 16 @@ -16,47 +14,72 @@ static __kernel struct k_sem semarray[SEM_ARRAY_SIZE]; K_SEM_DEFINE(sem1, 0, 1); static __kernel struct k_sem sem2; static __kernel char bad_sem[sizeof(struct k_sem)]; -#ifdef CONFIG_APPLICATION_MEMORY static struct k_sem sem3; -#endif -static int test_bad_object(struct k_sem *sem) +static int test_object(struct k_sem *sem, int retval) { - return !_k_object_validate(_k_object_find(sem), K_OBJ_SEM, 0); -} + int ret; -void main(void) { - struct k_sem stack_sem; - int i, rv; - - TC_START("obj_validation"); - - rv = TC_PASS; - - /* None of these should be even in the table */ - rv |= test_bad_object(&stack_sem); - rv |= test_bad_object((struct k_sem *)&bad_sem); - rv |= test_bad_object((struct k_sem *)0xFFFFFFFF); -#ifdef CONFIG_APPLICATION_MEMORY - rv |= test_bad_object(&sem3); -#endif - - /* sem1 should already be ready to go */ - k_object_access_grant(&sem1, k_current_get()); - rv |= !test_bad_object(&sem1); - - /* sem2 has to be initialized at runtime */ - rv |= test_bad_object(&sem2); - k_sem_init(&sem2, 0, 1); - rv |= !test_bad_object(&sem2); - - for (i = 0; i < SEM_ARRAY_SIZE; i++) { - rv |= test_bad_object(&semarray[i]); - k_sem_init(&semarray[i], 0, 1); - rv |= !test_bad_object(&semarray[i]); + if (retval) { + /* Expected to fail; bypass _obj_validation_check() so we don't + * fill the logs with spam + */ + ret = _k_object_validate(_k_object_find(sem), K_OBJ_SEM, 0); + } else { + ret = _obj_validation_check(sem, K_OBJ_SEM, 0); } - TC_END_RESULT(rv); - TC_END_REPORT(rv); + if (ret != retval) { + TC_PRINT("FAIL check of %p is not %d\n", sem, retval); + return 1; + } + return 0; } +void object_permission_checks(struct k_sem *sem, bool skip_init) +{ + /* Should fail because we don't have perms on this object */ + zassert_false(test_object(sem, -EPERM), + "object should not have had permission granted"); + + k_object_access_grant(sem, k_current_get()); + + if (!skip_init) { + /* Should fail, not initialized and we have no permissions */ + zassert_false(test_object(sem, -EINVAL), + "object should not have been initialized"); + k_sem_init(sem, 0, 1); + } + + /* This should succeed now */ + zassert_false(test_object(sem, 0), + "object should have had sufficient permissions"); +} + +void test_generic_object(void) +{ + struct k_sem stack_sem; + + /* None of these should be even in the table */ + zassert_false(test_object(&stack_sem, -EBADF), NULL); + zassert_false(test_object((struct k_sem *)&bad_sem, -EBADF), NULL); + zassert_false(test_object((struct k_sem *)0xFFFFFFFF, -EBADF), NULL); +#ifdef CONFIG_APPLICATION_MEMORY + zassert_false(test_object(&sem3, -EBADF), NULL); +#else + object_permission_checks(&sem3, false); +#endif + object_permission_checks(&sem1, true); + object_permission_checks(&sem2, false); + + for (int i = 0; i < SEM_ARRAY_SIZE; i++) { + object_permission_checks(&semarray[i], false); + } +} + +void test_main(void) +{ + ztest_test_suite(object_validation, + ztest_unit_test(test_generic_object)); + ztest_run_test_suite(object_validation); +}