From: Martin Willi Date: Mon, 21 Oct 2013 14:37:51 +0000 (+0200) Subject: unit-tests: Add a thread local storage fuzzer test X-Git-Tag: 5.1.2dr1~33^2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b00e63e4980127451607be6145944353e5f0487;p=thirdparty%2Fstrongswan.git unit-tests: Add a thread local storage fuzzer test --- diff --git a/src/libstrongswan/tests/suites/test_threading.c b/src/libstrongswan/tests/suites/test_threading.c index 3282fb975b..7247c3d592 100644 --- a/src/libstrongswan/tests/suites/test_threading.c +++ b/src/libstrongswan/tests/suites/test_threading.c @@ -22,6 +22,7 @@ #include #include #include +#include /******************************************************************************* * recursive mutex test @@ -545,6 +546,65 @@ START_TEST(test_cleanup_pop) } END_TEST +static thread_value_t *tls[10]; + +static void *tls_run(void *data) +{ + uintptr_t value = (uintptr_t)data; + int i, j; + + for (i = 0; i < countof(tls); i++) + { + ck_assert(tls[i]->get(tls[i]) == NULL); + } + for (i = 0; i < countof(tls); i++) + { + tls[i]->set(tls[i], (void*)(value * i)); + } + for (j = 0; j < 1000; j++) + { + for (i = 0; i < countof(tls); i++) + { + tls[i]->set(tls[i], (void*)(value * i)); + ck_assert(tls[i]->get(tls[i]) == (void*)(value * i)); + } + sched_yield(); + } + for (i = 0; i < countof(tls); i++) + { + ck_assert(tls[i]->get(tls[i]) == (void*)(value * i)); + } + return (void*)(value + 1); +} + +START_TEST(test_tls) +{ + thread_t *threads[THREADS]; + int i; + + for (i = 0; i < countof(tls); i++) + { + tls[i] = thread_value_create(NULL); + } + for (i = 0; i < THREADS; i++) + { + threads[i] = thread_create(tls_run, (void*)(uintptr_t)i); + } + + ck_assert_int_eq((uintptr_t)tls_run((void*)(uintptr_t)(THREADS + 1)), + THREADS + 2); + + for (i = 0; i < THREADS; i++) + { + ck_assert_int_eq((uintptr_t)threads[i]->join(threads[i]), i + 1); + } + for (i = 0; i < countof(tls); i++) + { + tls[i]->destroy(tls[i]); + } +} +END_TEST + Suite *threading_suite_create() { Suite *s; @@ -579,5 +639,9 @@ Suite *threading_suite_create() tcase_add_test(tc, test_cleanup_pop); suite_add_tcase(s, tc); + tc = tcase_create("thread local storage"); + tcase_add_test(tc, test_tls); + suite_add_tcase(s, tc); + return s; }