Bump version to 1.2.5
[uid_wrapper.git] / tests / test_fork_exec.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 <grp.h>
10 #include <sys/types.h>
11 #include <sys/wait.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <unistd.h>
15
16 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
17
18 #define TEST_MOCK_EXECUTABLE "mock_exec_uid"
19
20 static void test_uwrap_fork_exec(void **state)
21 {
22         pid_t pid;
23         int rc;
24         uid_t cp_ruid, cp_euid, cp_suid;
25         gid_t glist[] = {0, 10000, 20000, 40000, 100000};
26
27         (void)state; /* unused */
28
29         rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
30         assert_return_code(rc, errno);
31         assert_int_equal(cp_ruid, 0);
32         assert_int_equal(cp_euid, 0);
33         assert_int_equal(cp_suid, 0);
34
35         rc = setresuid(2000, -1, 4000);
36         assert_return_code(rc, errno);
37
38         rc = setgid(5000);
39         assert_return_code(rc, errno);
40
41         rc = setgroups(ARRAY_SIZE(glist), glist);
42         assert_return_code(rc, errno);
43
44         pid = fork();
45         assert_return_code(pid, errno);
46
47         /* child */
48         if (pid == 0) {
49                 char const *argv[] = {
50                         TEST_MOCK_EXECUTABLE,
51                         "-r 2000",
52                         "-e 0",
53                         "-s 4000",
54                         "-g 5000",
55                         NULL
56                 };
57                 char cmd[1024] = {0};
58
59                 snprintf(cmd, sizeof(cmd),
60                          "%s/tests/%s",
61                          BINARYDIR,
62                          TEST_MOCK_EXECUTABLE);
63
64                 rc = execvp(cmd, (char *const *)argv);
65                 exit(rc);
66         }
67
68         /* parent */
69         if (pid > 0) {
70                 pid_t child_pid;
71                 int wstatus = -1;
72
73                 rc = setresuid(cp_ruid, cp_euid, cp_suid);
74                 assert_return_code(rc, errno);
75
76                 child_pid = waitpid(-1, &wstatus, 0);
77                 assert_return_code(child_pid, errno);
78
79                 assert_true(WIFEXITED(wstatus));
80
81                 assert_int_equal(WEXITSTATUS(wstatus), 0);
82         }
83 }
84
85 int main(void) {
86         int rc;
87
88         const struct CMUnitTest uwrap_tests[] = {
89                 cmocka_unit_test(test_uwrap_fork_exec),
90         };
91
92         rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);
93
94         return rc;
95 }