Utest: Give the test a little more time to complete
[akaros.git] / user / utest / signal.c
1 #include <utest.h>
2 #include <pthread.h>
3
4 TEST_SUITE("SIGNALS");
5
6 /* <--- Begin definition of test cases ---> */
7
8 bool test_sigmask(void) {
9         int count = 0;
10         pthread_t sigphandle;
11         void *thread_handler(void *arg)
12         {
13                 sigset_t s;
14                 sigemptyset(&s);
15                 sigaddset(&s, SIGUSR2);
16                 pthread_sigmask(SIG_BLOCK, &s, NULL);
17                 for (int i=0; i<100000; i++)
18                         pthread_yield();
19         }
20         void signal_handler(int signo)
21         {
22                 sigphandle = pthread_self();
23                 __sync_fetch_and_add(&count, 1);
24         }
25
26         struct sigaction sigact = {.sa_handler = signal_handler, 0};
27         sigaction(SIGUSR1, &sigact, 0);
28         sigaction(SIGUSR2, &sigact, 0);
29
30         pthread_t phandle;
31         pthread_create(&phandle, NULL, thread_handler, NULL);
32         for (int i=0; i<100; i++)
33                 pthread_yield();
34         pthread_kill(phandle, SIGUSR1);
35         pthread_kill(phandle, SIGUSR2);
36         pthread_join(phandle, NULL);
37
38         UT_ASSERT_M("Should only receive one signal", count == 1); 
39         UT_ASSERT_M("Signal handler run on wrong thread", sigphandle == phandle); 
40         return true;
41 }
42
43 /* <--- End definition of test cases ---> */
44
45 struct utest utests[] = {
46         UTEST_REG(sigmask),
47 };
48 int num_utests = sizeof(utests) / sizeof(struct utest);
49
50 int main(int argc, char *argv[]) {
51         // Run test suite passing it all the args as whitelist of what tests to run.
52         char **whitelist = &argv[1];
53         int whitelist_len = argc - 1;
54         RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
55 }
56
57