parlib: Move alarm/timer functions from benchutil
[akaros.git] / user / utest / dtls.c
1 /* Copyright (c) 2016 Google, Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details. */
4
5 #include <utest/utest.h>
6 #include <parlib/dtls.h>
7 #include <stdio.h>
8
9 TEST_SUITE("DTLS");
10
11 /* <--- Begin definition of test cases ---> */
12
13 bool test_get_without_set(void)
14 {
15         dtls_key_t key;
16         void *got_val;
17
18         key = dtls_key_create(0);
19         got_val = get_dtls(key);
20         UT_ASSERT_FMT("Expected 0, got %p", got_val == 0, 0, got_val);
21         destroy_dtls();
22         return TRUE;
23 }
24
25 /* This catches a bug, but it had to have a set happen at some point. */
26 bool test_get_after_reset(void)
27 {
28         dtls_key_t key;
29         void *set_val = (void*)0x15;
30         void *got_val;
31
32         key = dtls_key_create(0);
33         set_dtls(key, set_val);
34         destroy_dtls();
35
36         key = dtls_key_create(0);
37         got_val = get_dtls(key);
38         UT_ASSERT_FMT("Expected 0, got %p", got_val == 0, 0, got_val);
39         destroy_dtls();
40         return TRUE;
41 }
42
43 bool test_set_and_get(void)
44 {
45         dtls_key_t key;
46         void *set_val = (void*)0x15;
47         void *got_val;
48
49         key = dtls_key_create(0);
50         set_dtls(key, set_val);
51         got_val = get_dtls(key);
52         UT_ASSERT_FMT("Expected %p, got %p", got_val == set_val, set_val, got_val);
53         destroy_dtls();
54         return TRUE;
55 }
56
57 bool test_set_twice(void)
58 {
59         dtls_key_t key;
60         void *set_val = (void*)0x15;
61         void *got_val;
62
63         key = dtls_key_create(0);
64         set_dtls(key, set_val);
65         set_dtls(key, set_val + 1);
66         destroy_dtls();
67         return TRUE;
68 }
69
70 static dtls_key_t sfd_global_key;
71
72 static void setting_dtor(void *arg)
73 {
74         set_dtls(sfd_global_key, (void*)0xf00);
75 }
76
77 /* Users can set from a destructor.  In some implementations of pthread keys,
78  * you can't safely set_specific from within a destructor without the risk of an
79  * infinite loop or storage loss.  Our DTLS implementation shouldn't be doing
80  * either, though we can't check for storage loss. */
81 bool test_set_from_dtor(void)
82 {
83         void *set_val = (void*)0x15;
84
85         sfd_global_key = dtls_key_create(setting_dtor);
86         set_dtls(sfd_global_key, set_val);
87         destroy_dtls();
88         return TRUE;
89 }
90
91 /* <--- End definition of test cases ---> */
92
93 struct utest utests[] = {
94         UTEST_REG(get_without_set),
95         UTEST_REG(get_after_reset),
96         UTEST_REG(set_and_get),
97         UTEST_REG(set_twice),
98         UTEST_REG(set_from_dtor),
99 };
100 int num_utests = sizeof(utests) / sizeof(struct utest);
101
102 int main(int argc, char *argv[])
103 {
104         // Run test suite passing it all the args as whitelist of what tests to run.
105         char **whitelist = &argv[1];
106         int whitelist_len = argc - 1;
107
108         RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
109 }