tests: Move seteuid test to own executable
[uid_wrapper.git] / tests / test_seteuid.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 <sys/types.h>
9 #include <unistd.h>
10 #include <errno.h>
11
12 #include <pwd.h>
13
14 static void test_uwrap_seteuid(void **state)
15 {
16         int rc;
17         uid_t u;
18 #ifdef HAVE_GETRESUID
19         uid_t cp_ruid, cp_euid, cp_suid;
20 #endif
21
22         (void) state; /* unused */
23
24 #ifdef HAVE_GETRESUID
25         cp_ruid = cp_euid = cp_suid = -1;
26         rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
27         assert_return_code(rc, errno);
28         assert_int_equal(cp_ruid, 0);
29         assert_int_equal(cp_euid, 0);
30         assert_int_equal(cp_suid, 0);
31 #endif
32         u = geteuid();
33         assert_int_equal(u, 0x0);
34
35
36         rc = seteuid(-1);
37         assert_int_equal(rc, -1);
38         assert_int_equal(errno, EINVAL);
39
40         u = geteuid();
41         assert_int_equal(u, 0x0);
42
43         rc = seteuid(0x4444);
44         assert_return_code(rc, errno);
45
46 #ifdef HAVE_GETRESUID
47         cp_ruid = cp_euid = cp_suid = -1;
48         rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
49         assert_return_code(rc, errno);
50         assert_int_equal(cp_ruid, 0);
51         assert_int_equal(cp_euid, 0x4444);
52         assert_int_equal(cp_suid, 0);
53 #endif
54
55         u = geteuid();
56         assert_int_equal(u, 0x4444);
57
58         /*
59          * The euid needs to be 0 in order to change to an
60          * unknown value (here 0x5555).
61          */
62         rc = seteuid(0x5555);
63         assert_int_equal(rc, -1);
64         assert_int_equal(errno, EPERM);
65
66 #ifdef HAVE_GETRESUID
67         cp_ruid = cp_euid = cp_suid = -1;
68         rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
69         assert_return_code(rc, errno);
70         assert_int_equal(cp_ruid, 0);
71         assert_int_equal(cp_euid, 0x4444);
72         assert_int_equal(cp_suid, 0);
73 #endif
74
75         u = geteuid();
76         assert_int_equal(u, 0x4444);
77
78         rc = seteuid(0);
79         assert_int_equal(rc, 0);
80
81 #ifdef HAVE_GETRESUID
82         cp_ruid = cp_euid = cp_suid = -1;
83         rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
84         assert_return_code(rc, errno);
85         assert_int_equal(cp_ruid, 0);
86         assert_int_equal(cp_euid, 0);
87         assert_int_equal(cp_suid, 0);
88 #endif
89
90         u = geteuid();
91         assert_int_equal(u, 0);
92
93         rc = seteuid(0x5555);
94         assert_return_code(rc, errno);
95
96 #ifdef HAVE_GETRESUID
97         cp_ruid = cp_euid = cp_suid = -1;
98         rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
99         assert_return_code(rc, errno);
100         assert_int_equal(cp_ruid, 0);
101         assert_int_equal(cp_euid, 0x5555);
102         assert_int_equal(cp_suid, 0);
103 #endif
104
105         u = geteuid();
106         assert_int_equal(u, 0x5555);
107 }
108
109 int main(void) {
110         int rc;
111
112         const struct CMUnitTest uwrap_tests[] = {
113                 cmocka_unit_test(test_uwrap_seteuid),
114         };
115
116         rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);
117
118         return rc;
119 }