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