tests: The tests should always be executed with uid_wrapper.
[obnox/cwrap/uid_wrapper.git] / tests / testsuite.c
1 #include "config.h"
2
3 #include <stdarg.h>
4 #include <stddef.h>
5 #include <setjmp.h>
6 #include <cmocka.h>
7
8 #include <errno.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <sys/time.h>
15 #include <unistd.h>
16
17 #include <grp.h>
18
19 #ifdef HAVE_SYS_SYSCALL_H
20 #include <sys/syscall.h>
21 #endif
22 #ifdef HAVE_SYSCALL_H
23 #include <syscall.h>
24 #endif
25
26 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
27 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
28
29 static void test_uwrap_seteuid(void **state)
30 {
31         int rc;
32         uid_t u;
33
34         (void) state; /* unused */
35
36         rc = seteuid(-1);
37         assert_int_equal(rc, -1);
38
39         rc = seteuid(0);
40         assert_int_equal(rc, 0);
41
42         u = geteuid();
43 #ifdef SYS_geteuid /* not available on Solaris */
44         assert_int_equal(u, syscall(SYS_geteuid));
45 #endif
46
47         rc = setuid(42);
48         assert_int_equal(rc, 0);
49
50         u = getuid();
51         assert_int_equal(u, 42);
52 }
53
54 static void test_uwrap_setuid(void **state)
55 {
56         int rc;
57         uid_t u;
58
59         (void) state; /* unused */
60
61         rc = setuid(-1);
62         assert_int_equal(rc, -1);
63
64         rc = setuid(42);
65         assert_int_equal(rc, 0);
66
67         u = getuid();
68         assert_int_equal(u, 42);
69 }
70
71 static void test_uwrap_setegid(void **state)
72 {
73         int rc;
74         uid_t u;
75
76         (void) state; /* unused */
77
78         rc = setegid(0);
79         assert_int_equal(rc, 0);
80
81         u = getegid();
82 #ifdef SYS_getegid /* Not available on Solaris */
83         assert_int_equal(u, syscall(SYS_getegid));
84 #endif
85
86         rc = setegid(42);
87         assert_int_equal(rc, 0);
88
89         u = getegid();
90         assert_int_equal(u, 42);
91 }
92
93 static void test_uwrap_setgid(void **state)
94 {
95         int rc;
96         gid_t u;
97
98         (void) state; /* unused */
99
100         rc = setgid(-1);
101         assert_int_equal(rc, -1);
102
103         rc = setgid(42);
104         assert_int_equal(rc, 0);
105
106         u = getgid();
107         assert_int_equal(u, 42);
108 }
109
110 static void test_uwrap_syscall(void **state)
111 {
112         long int rc;
113         struct timeval tv1, tv2;
114         struct timezone tz1, tz2;
115
116         (void) state; /* unused */
117
118         rc = syscall(SYS_getpid);
119         assert_int_equal(rc, getpid());
120
121         rc = access(".", R_OK);
122         assert_int_equal(rc, 0);
123
124         rc = syscall(SYS_access, ".", R_OK);
125         assert_int_equal(rc, 0);
126
127         ZERO_STRUCT(tv1);
128         ZERO_STRUCT(tv2);
129         ZERO_STRUCT(tz1);
130         ZERO_STRUCT(tz2);
131
132         rc = gettimeofday(&tv1, &tz1);
133         assert_int_equal(rc, 0);
134
135         rc = syscall(SYS_gettimeofday, &tv2, &tz2);
136         assert_int_equal(rc, 0);
137
138         assert_int_equal(tv1.tv_sec, tv2.tv_sec);
139         assert_int_equal(tz2.tz_dsttime, tz2.tz_dsttime);
140         assert_int_equal(tz2.tz_minuteswest, tz2.tz_minuteswest);
141 }
142
143 static void test_uwrap_syscall_setreuid(void **state)
144 {
145         long int rc;
146         uid_t u;
147
148         (void) state; /* unused */
149
150         rc = syscall(SYS_setreuid, -1, 0);
151         assert_int_equal(rc, 0);
152
153         u = geteuid();
154 #ifdef SYS_geteuid /* not available on Solaris */
155         assert_int_equal(u, syscall(SYS_geteuid));
156 #endif
157
158         rc = syscall(SYS_setreuid, -1, 42);
159         assert_int_equal(rc, 0);
160
161         u = geteuid();
162         assert_int_equal(u, 42);
163 }
164
165 static void test_uwrap_syscall_setregid(void **state)
166 {
167         long int rc;
168         gid_t g;
169
170         (void) state; /* unused */
171
172         rc = syscall(SYS_setregid, -1, 0);
173         assert_int_equal(rc, 0);
174
175         g = getegid();
176 #ifdef SYS_getegid /* Not available on Solaris */
177         assert_int_equal(g, syscall(SYS_getegid));
178 #endif
179
180         rc = syscall(SYS_setregid, -1, 42);
181         assert_int_equal(rc, 0);
182
183         g = getegid();
184         assert_int_equal(g, 42);
185 }
186
187 static void test_uwrap_getgroups(void **state)
188 {
189         gid_t rlist[16] = {0};
190         int rc;
191
192         (void) state; /* unused */
193
194         rc = getgroups(ARRAY_SIZE(rlist), rlist);
195         assert_int_equal(rc, 1);
196         assert_int_equal(rlist[0], getegid());
197 }
198
199 static void test_uwrap_setgroups(void **state)
200 {
201         gid_t glist[] = { 100, 200, 300, 400, 500 };
202         gid_t rlist[16];
203         int rc;
204
205         (void) state; /* unused */
206
207         rc = setgroups(ARRAY_SIZE(glist), glist);
208         assert_int_equal(rc, 0);
209
210         rc = getgroups(ARRAY_SIZE(rlist), rlist);
211         assert_int_equal(rc, 5);
212
213         assert_memory_equal(glist, rlist, sizeof(glist));
214 }
215
216 int main(void) {
217         int rc;
218
219         const UnitTest tests[] = {
220                 unit_test(test_uwrap_syscall),
221                 unit_test(test_uwrap_getgroups),
222
223                 unit_test(test_uwrap_seteuid),
224                 unit_test(test_uwrap_setuid),
225                 unit_test(test_uwrap_setegid),
226                 unit_test(test_uwrap_setgid),
227                 unit_test(test_uwrap_syscall_setreuid),
228                 unit_test(test_uwrap_syscall_setregid),
229                 unit_test(test_uwrap_setgroups),
230         };
231
232         rc = run_tests(tests);
233
234         return rc;
235 }