tests: Add test_uwrap_syscall().
[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 <stdlib.h>
9 #include <stdio.h>
10 #include <sys/types.h>
11 #include <unistd.h>
12
13 #ifdef HAVE_SYS_SYSCALL_H
14 #include <sys/syscall.h>
15 #endif
16 #ifdef HAVE_SYSCALL_H
17 #include <syscall.h>
18 #endif
19
20 static void test_uwrap_seteuid(void **state)
21 {
22         int rc;
23         uid_t u;
24         char *env;
25
26         env = getenv("UID_WRAPPER");
27         if (env == NULL) {
28                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
29                 return;
30         }
31
32         (void) state; /* unused */
33
34         rc = seteuid(0);
35         assert_int_equal(rc, 0);
36
37         u = geteuid();
38         assert_int_equal(u, 0);
39
40         rc = seteuid(42);
41         assert_int_equal(rc, 0);
42
43         u = geteuid();
44         assert_int_equal(u, 42);
45 }
46
47 static void test_uwrap_setegid(void **state)
48 {
49         int rc;
50         uid_t u;
51         char *env;
52
53         env = getenv("UID_WRAPPER");
54         if (env == NULL) {
55                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
56                 return;
57         }
58
59         (void) state; /* unused */
60
61         rc = setegid(0);
62         assert_int_equal(rc, 0);
63
64         u = getegid();
65         assert_int_equal(u, 0);
66
67         rc = setegid(42);
68         assert_int_equal(rc, 0);
69
70         u = getegid();
71         assert_int_equal(u, 42);
72 }
73
74 #if 0
75 /* FIXME */
76 static void test_uwrap_syscall(void **state)
77 {
78         long int rc;
79         char *env;
80
81         env = getenv("UID_WRAPPER");
82         if (env == NULL) {
83                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
84                 return;
85         }
86
87         (void) state; /* unused */
88
89         rc = access(".", R_OK);
90         assert_int_equal(rc, 0);
91
92         rc = syscall(SYS_access, ".", R_OK);
93         assert_int_equal(rc, 0);
94 }
95 #endif
96
97 static void test_uwrap_syscall_setreuid(void **state)
98 {
99         long int rc;
100         uid_t u;
101         char *env;
102
103         env = getenv("UID_WRAPPER");
104         if (env == NULL) {
105                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
106                 return;
107         }
108
109         (void) state; /* unused */
110
111         rc = syscall(SYS_setreuid, -1, 0);
112         assert_int_equal(rc, 0);
113
114         u = geteuid();
115         assert_int_equal(u, 0);
116
117         rc = syscall(SYS_setreuid, -1, 42);
118         assert_int_equal(rc, 0);
119
120         u = geteuid();
121         assert_int_equal(u, 42);
122 }
123
124 static void test_uwrap_syscall_setregid(void **state)
125 {
126         long int rc;
127         uid_t u;
128         char *env;
129
130         env = getenv("UID_WRAPPER");
131         if (env == NULL) {
132                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
133                 return;
134         }
135
136         (void) state; /* unused */
137
138         rc = syscall(SYS_setregid, -1, 0);
139         assert_int_equal(rc, 0);
140
141         u = getegid();
142         assert_int_equal(u, 0);
143
144         rc = syscall(SYS_setregid, -1, 42);
145         assert_int_equal(rc, 0);
146
147         u = getegid();
148         assert_int_equal(u, 42);
149 }
150
151 int main(void) {
152         int rc;
153
154         const UnitTest tests[] = {
155                 unit_test(test_uwrap_seteuid),
156                 unit_test(test_uwrap_setegid),
157 #if 0
158                 unit_test(test_uwrap_syscall),
159 #endif
160                 unit_test(test_uwrap_syscall_setreuid),
161                 unit_test(test_uwrap_syscall_setregid),
162         };
163
164         rc = run_tests(tests);
165
166         return rc;
167 }