1 // Copyright 2016 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <assert.h>
6 #include <errno.h>
7 #include <zircon/syscalls.h>
8 #include <unittest/unittest.h>
9 #include <pthread.h>
10 #include <stdio.h>
11
do_test(void * arg)12 static void* do_test(void* arg) {
13 int thread_no = *(int*)arg;
14 unittest_printf("do_test for thread: %d\n", thread_no);
15 errno = -thread_no;
16 zx_nanosleep(zx_deadline_after(ZX_MSEC(300)));
17 unittest_printf("comparing result for: %d\n", thread_no);
18 EXPECT_EQ(errno, -thread_no, "Incorrect errno for this thread");
19 return NULL;
20 }
21
errno_test(void)22 bool errno_test(void) {
23 BEGIN_TEST;
24 int main_thread = 1, thread_1 = 2, thread_2 = 3;
25
26 pthread_t thread2, thread3;
27
28 unittest_printf("creating thread: %d\n", thread_1);
29 pthread_create(&thread2, NULL, do_test, &thread_1);
30
31 unittest_printf("creating thread: %d\n", thread_2);
32 pthread_create(&thread3, NULL, do_test, &thread_2);
33
34 do_test(&main_thread);
35
36 unittest_printf("joining thread: %d\n", thread_1);
37 pthread_join(thread2, NULL);
38
39 unittest_printf("joining thread: %d\n", thread_2);
40 pthread_join(thread3, NULL);
41
42 END_TEST;
43 }
44
45 BEGIN_TEST_CASE(errno_tests)
RUN_TEST(errno_test)46 RUN_TEST(errno_test)
47 END_TEST_CASE(errno_tests)
48
49 int main(int argc, char** argv) {
50 return unittest_run_all_tests(argc, argv) ? 0 : -1;
51 }
52