diff --git a/tests/posix/common/src/mutex_attr.c b/tests/posix/common/src/mutex_attr.c index 2ecda40ae58..d5f70083d41 100644 --- a/tests/posix/common/src/mutex_attr.c +++ b/tests/posix/common/src/mutex_attr.c @@ -43,64 +43,4 @@ ZTEST(mutex_attr, test_pthread_mutexattr_destroy) } } -ZTEST(mutex_attr, test_pthread_mutexattr_gettype) -{ - int type; - pthread_mutexattr_t attr; - - /* degenerate cases */ - { - if (false) { - /* undefined behaviour */ - zassert_equal(EINVAL, pthread_mutexattr_gettype(&attr, &type)); - } - zassert_equal(EINVAL, pthread_mutexattr_gettype(NULL, NULL)); - zassert_equal(EINVAL, pthread_mutexattr_gettype(NULL, &type)); - zassert_equal(EINVAL, pthread_mutexattr_gettype(&attr, NULL)); - } - - zassert_ok(pthread_mutexattr_init(&attr)); - zassert_ok(pthread_mutexattr_gettype(&attr, &type)); - zassert_equal(type, PTHREAD_MUTEX_DEFAULT); - zassert_ok(pthread_mutexattr_destroy(&attr)); -} - -ZTEST(mutex_attr, test_pthread_mutexattr_settype) -{ - int type; - pthread_mutexattr_t attr; - - /* degenerate cases */ - { - if (false) { - /* undefined behaviour */ - zassert_equal(EINVAL, - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT)); - } - zassert_equal(EINVAL, pthread_mutexattr_settype(NULL, 42)); - zassert_equal(EINVAL, pthread_mutexattr_settype(NULL, PTHREAD_MUTEX_NORMAL)); - zassert_equal(EINVAL, pthread_mutexattr_settype(&attr, 42)); - } - - zassert_ok(pthread_mutexattr_init(&attr)); - - zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT)); - zassert_ok(pthread_mutexattr_gettype(&attr, &type)); - zassert_equal(type, PTHREAD_MUTEX_DEFAULT); - - zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL)); - zassert_ok(pthread_mutexattr_gettype(&attr, &type)); - zassert_equal(type, PTHREAD_MUTEX_NORMAL); - - zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)); - zassert_ok(pthread_mutexattr_gettype(&attr, &type)); - zassert_equal(type, PTHREAD_MUTEX_RECURSIVE); - - zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK)); - zassert_ok(pthread_mutexattr_gettype(&attr, &type)); - zassert_equal(type, PTHREAD_MUTEX_ERRORCHECK); - - zassert_ok(pthread_mutexattr_destroy(&attr)); -} - ZTEST_SUITE(mutex_attr, NULL, NULL, NULL, NULL, NULL); diff --git a/tests/posix/common/src/pthread_attr.c b/tests/posix/common/src/pthread_attr.c index 6d48acb7f7b..dfeb1b48992 100644 --- a/tests/posix/common/src/pthread_attr.c +++ b/tests/posix/common/src/pthread_attr.c @@ -147,56 +147,6 @@ ZTEST(pthread_attr, test_pthread_attr_init_destroy) /* note: attr is still valid and is destroyed in after() */ } -ZTEST(pthread_attr, test_pthread_attr_getguardsize) -{ - size_t guardsize; - - /* degenerate cases */ - { - if (false) { - /* undefined behaviour */ - zassert_equal(pthread_attr_getguardsize(NULL, NULL), EINVAL); - zassert_equal(pthread_attr_getguardsize(NULL, &guardsize), EINVAL); - zassert_equal(pthread_attr_getguardsize(&uninit_attr, &guardsize), EINVAL); - } - zassert_equal(pthread_attr_getguardsize(&attr, NULL), EINVAL); - } - - guardsize = BIOS_FOOD; - zassert_ok(pthread_attr_getguardsize(&attr, &guardsize)); - zassert_not_equal(guardsize, BIOS_FOOD); -} - -ZTEST(pthread_attr, test_pthread_attr_setguardsize) -{ - size_t guardsize = CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_DEFAULT; - size_t sizes[] = {0, BIT_MASK(CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_BITS / 2), - BIT_MASK(CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_BITS)}; - - /* valid value */ - zassert_ok(pthread_attr_getguardsize(&attr, &guardsize)); - - /* degenerate cases */ - { - if (false) { - /* undefined behaviour */ - zassert_equal(pthread_attr_setguardsize(NULL, SIZE_MAX), EINVAL); - zassert_equal(pthread_attr_setguardsize(NULL, guardsize), EINVAL); - zassert_equal(pthread_attr_setguardsize((pthread_attr_t *)&uninit_attr, - guardsize), - EINVAL); - } - zassert_equal(pthread_attr_setguardsize(&attr, SIZE_MAX), EINVAL); - } - - ARRAY_FOR_EACH(sizes, i) { - zassert_ok(pthread_attr_setguardsize(&attr, sizes[i])); - guardsize = ~sizes[i]; - zassert_ok(pthread_attr_getguardsize(&attr, &guardsize)); - zassert_equal(guardsize, sizes[i]); - } -} - ZTEST(pthread_attr, test_pthread_attr_getschedparam) { struct sched_param param = { diff --git a/tests/posix/threads_ext/CMakeLists.txt b/tests/posix/threads_ext/CMakeLists.txt new file mode 100644 index 00000000000..2c3e19d4647 --- /dev/null +++ b/tests/posix/threads_ext/CMakeLists.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(posix_threads_ext) + +target_sources(app PRIVATE src/main.c) + +target_compile_options(app PRIVATE -U_POSIX_C_SOURCE -D_POSIX_C_SOURCE=200809L) diff --git a/tests/posix/threads_ext/prj.conf b/tests/posix/threads_ext/prj.conf new file mode 100644 index 00000000000..dd28c46e49f --- /dev/null +++ b/tests/posix/threads_ext/prj.conf @@ -0,0 +1,5 @@ +CONFIG_POSIX_API=y + +CONFIG_ZTEST=y +CONFIG_POSIX_AEP_CHOICE_BASE=y +CONFIG_POSIX_THREADS_EXT=y diff --git a/tests/posix/threads_ext/src/main.c b/tests/posix/threads_ext/src/main.c new file mode 100644 index 00000000000..eb01ec6843e --- /dev/null +++ b/tests/posix/threads_ext/src/main.c @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2024, Meta + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include +#include + +#define BIOS_FOOD 0xB105F00D +#define SCHED_INVALID 4242 +#define INVALID_DETACHSTATE 7373 + +static bool attr_valid; +static pthread_attr_t attr; +static const pthread_attr_t uninit_attr; + +ZTEST(posix_threads_ext, test_pthread_attr_getguardsize) +{ + size_t guardsize; + + /* degenerate cases */ + { + if (false) { + /* undefined behaviour */ + zassert_equal(pthread_attr_getguardsize(NULL, NULL), EINVAL); + zassert_equal(pthread_attr_getguardsize(NULL, &guardsize), EINVAL); + zassert_equal(pthread_attr_getguardsize(&uninit_attr, &guardsize), EINVAL); + } + zassert_equal(pthread_attr_getguardsize(&attr, NULL), EINVAL); + } + + guardsize = BIOS_FOOD; + zassert_ok(pthread_attr_getguardsize(&attr, &guardsize)); + zassert_not_equal(guardsize, BIOS_FOOD); +} + +ZTEST(posix_threads_ext, test_pthread_attr_setguardsize) +{ + size_t guardsize = CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_DEFAULT; + size_t sizes[] = {0, BIT_MASK(CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_BITS / 2), + BIT_MASK(CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_BITS)}; + + /* valid value */ + zassert_ok(pthread_attr_getguardsize(&attr, &guardsize)); + + /* degenerate cases */ + { + if (false) { + /* undefined behaviour */ + zassert_equal(pthread_attr_setguardsize(NULL, SIZE_MAX), EINVAL); + zassert_equal(pthread_attr_setguardsize(NULL, guardsize), EINVAL); + zassert_equal(pthread_attr_setguardsize((pthread_attr_t *)&uninit_attr, + guardsize), + EINVAL); + } + zassert_equal(pthread_attr_setguardsize(&attr, SIZE_MAX), EINVAL); + } + + ARRAY_FOR_EACH(sizes, i) { + zassert_ok(pthread_attr_setguardsize(&attr, sizes[i])); + guardsize = ~sizes[i]; + zassert_ok(pthread_attr_getguardsize(&attr, &guardsize)); + zassert_equal(guardsize, sizes[i]); + } +} + +ZTEST(posix_threads_ext, test_pthread_mutexattr_gettype) +{ + int type; + pthread_mutexattr_t attr; + + /* degenerate cases */ + { + if (false) { + /* undefined behaviour */ + zassert_equal(EINVAL, pthread_mutexattr_gettype(&attr, &type)); + } + zassert_equal(EINVAL, pthread_mutexattr_gettype(NULL, NULL)); + zassert_equal(EINVAL, pthread_mutexattr_gettype(NULL, &type)); + zassert_equal(EINVAL, pthread_mutexattr_gettype(&attr, NULL)); + } + + zassert_ok(pthread_mutexattr_init(&attr)); + zassert_ok(pthread_mutexattr_gettype(&attr, &type)); + zassert_equal(type, PTHREAD_MUTEX_DEFAULT); + zassert_ok(pthread_mutexattr_destroy(&attr)); +} + +ZTEST(posix_threads_ext, test_pthread_mutexattr_settype) +{ + int type; + pthread_mutexattr_t attr; + + /* degenerate cases */ + { + if (false) { + /* undefined behaviour */ + zassert_equal(EINVAL, + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT)); + } + zassert_equal(EINVAL, pthread_mutexattr_settype(NULL, 42)); + zassert_equal(EINVAL, pthread_mutexattr_settype(NULL, PTHREAD_MUTEX_NORMAL)); + zassert_equal(EINVAL, pthread_mutexattr_settype(&attr, 42)); + } + + zassert_ok(pthread_mutexattr_init(&attr)); + + zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT)); + zassert_ok(pthread_mutexattr_gettype(&attr, &type)); + zassert_equal(type, PTHREAD_MUTEX_DEFAULT); + + zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL)); + zassert_ok(pthread_mutexattr_gettype(&attr, &type)); + zassert_equal(type, PTHREAD_MUTEX_NORMAL); + + zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)); + zassert_ok(pthread_mutexattr_gettype(&attr, &type)); + zassert_equal(type, PTHREAD_MUTEX_RECURSIVE); + + zassert_ok(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK)); + zassert_ok(pthread_mutexattr_gettype(&attr, &type)); + zassert_equal(type, PTHREAD_MUTEX_ERRORCHECK); + + zassert_ok(pthread_mutexattr_destroy(&attr)); +} + +static void before(void *arg) +{ + ARG_UNUSED(arg); + + zassert_ok(pthread_attr_init(&attr)); + /* TODO: pthread_attr_init() should be sufficient to initialize a thread by itself */ + /* zassert_ok(pthread_attr_setstack(&attr, &static_thread_stack, STATIC_THREAD_STACK_SIZE)); + */ + attr_valid = true; +} + +static void after(void *arg) +{ + ARG_UNUSED(arg); + + if (attr_valid) { + (void)pthread_attr_destroy(&attr); + attr_valid = false; + } +} + +ZTEST_SUITE(posix_threads_ext, NULL, NULL, before, after, NULL); diff --git a/tests/posix/threads_ext/testcase.yaml b/tests/posix/threads_ext/testcase.yaml new file mode 100644 index 00000000000..b8e1966a32b --- /dev/null +++ b/tests/posix/threads_ext/testcase.yaml @@ -0,0 +1,25 @@ +common: + filter: not CONFIG_NATIVE_LIBC + tags: + - posix + - threads_ext + # 1 tier0 platform per supported architecture + platform_key: + - arch + - simulation +tests: + portability.posix.threads_ext: + min_flash: 64 + min_ram: 32 + portability.posix.threads_ext.minimal: + extra_configs: + - CONFIG_MINIMAL_LIBC=y + portability.posix.threads_ext.newlib: + filter: TOOLCHAIN_HAS_NEWLIB == 1 + extra_configs: + - CONFIG_NEWLIB_LIBC=y + portability.posix.threads_ext.picolibc: + tags: picolibc + filter: CONFIG_PICOLIBC_SUPPORTED + extra_configs: + - CONFIG_PICOLIBC=y