The Pedigree Project 0.1
testsuite/main.c
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include <setjmp.h>
21#include <stdio.h>
22#include <string.h>
23#include <unistd.h>
24
25extern void test_mprotect();
26extern void test_mmap();
27extern void test_prctl(void);
28extern int test_prctl_exec(void);
29extern void test_resource_accounting(void);
30extern void test_syscall_contracts(void);
31extern void test_vm_contracts(void);
32extern void test_usercopy_contracts(void);
33extern void test_tcp_receive_buffers(void);
34extern void test_regular_read_contracts(const char* base);
35extern void test_futex_contracts(const char* program);
36extern void test_fs_mutation_contracts(void);
37extern void test_fs_persistence_contracts(const char* base, int write_phase);
38extern void test_fs();
39extern void test_dup3(void);
40extern void test_epoll_pty(void);
41extern void test_pty_contracts(void);
42extern int exec_shebang_child(int argc, char* argv[]);
43extern void test_exec_shebang(const char* program);
44extern void test_exec_arguments(const char* program);
45extern int exec_arguments_child(int argc, char* argv[]);
46extern void test_unix_seqpacket(void);
47extern int process_exec_signal_child(void);
48extern void test_linux_signal_frame(void);
49extern void test_process(const char* program);
50extern void test_proc_kernel_threads(void);
51extern void test_process_stop_contracts(void);
52extern void test_posix_spawn(const char* program);
53extern void test_scm_rights(void);
54extern void test_scm_rights_stream(void);
55extern void test_unix_stream_interruption(void);
56extern void test_unix_seqpacket_interruption(void);
57
58static jmp_buf buf;
59
60void fail() __attribute__((noreturn));
61
62void fail() {
63 longjmp(buf, 1);
64}
65
66int main(int argc, char* argv[]) {
67 if (argc > 1 && !strcmp(argv[1], "--exec-arguments-child")) {
68 return exec_arguments_child(argc, argv);
69 }
70 if (argc == 2 && !strcmp(argv[1], "--exec-signal-child"))
71 return process_exec_signal_child();
72 if (argc > 1 && !strncmp(argv[1], "--exec-shebang-", sizeof("--exec-shebang-") - 1))
73 return exec_shebang_child(argc, argv);
74
75 if (setjmp(buf) == 1) {
76 printf("FAILED\n");
77 return 1;
78 }
79
80 if (argc == 2 && !strcmp(argv[1], "--exec-arguments")) {
81 test_exec_arguments(argv[0]);
82 return 0;
83 }
84 if (argc == 2 && !strcmp(argv[1], "--unix-seqpacket")) {
85 test_unix_seqpacket();
86 return 0;
87 }
88 if (argc == 2 && !strcmp(argv[1], "--scm-rights")) {
89 test_scm_rights();
90 return 0;
91 }
92 if (argc == 2 && !strcmp(argv[1], "--syscall-contracts")) {
93 test_syscall_contracts();
94 return 0;
95 }
96 if (argc == 2 && !strcmp(argv[1], "--vm-contracts")) {
97 test_vm_contracts();
98 return 0;
99 }
100 if (argc == 2 && !strcmp(argv[1], "--tcp-receive-buffers")) {
101 test_tcp_receive_buffers();
102 return 0;
103 }
104 if (argc == 2 && !strcmp(argv[1], "--usercopy-contracts")) {
105 test_usercopy_contracts();
106 return 0;
107 }
108 if (argc == 3 && !strcmp(argv[1], "--regular-read-contracts")) {
109 test_regular_read_contracts(argv[2]);
110 return 0;
111 }
112 if (argc == 2 && !strcmp(argv[1], "--futex-contracts")) {
113 test_futex_contracts(argv[0]);
114 return 0;
115 }
116 if (argc == 2 && !strcmp(argv[1], "--fs-mutation-contracts")) {
117 test_fs_mutation_contracts();
118 return 0;
119 }
120 if (argc == 3 &&
121 (!strcmp(argv[1], "--fs-persistence-write") || !strcmp(argv[1], "--fs-persistence-read"))) {
122 test_fs_persistence_contracts(argv[2], !strcmp(argv[1], "--fs-persistence-write"));
123 return 0;
124 }
125 if (argc == 2 && !strcmp(argv[1], "--scm-rights-stream")) {
126 test_scm_rights_stream();
127 return 0;
128 }
129 if (argc == 2 && !strcmp(argv[1], "--unix-seqpacket-interruption")) {
130 test_unix_seqpacket_interruption();
131 return 0;
132 }
133 if (argc == 2 && !strcmp(argv[1], "--unix-stream-interruption")) {
134 test_unix_stream_interruption();
135 return 0;
136 }
137 if (argc == 2 && !strcmp(argv[1], "--posix-spawn")) {
138 test_posix_spawn(argv[0]);
139 return 0;
140 }
141 if (argc == 2 && !strcmp(argv[1], "--dup3")) {
142 test_dup3();
143 return 0;
144 }
145 if (argc == 2 && !strcmp(argv[1], "--epoll-pty")) {
146 test_epoll_pty();
147 return 0;
148 }
149 if (argc == 2 && !strcmp(argv[1], "--pty-contracts")) {
150 test_pty_contracts();
151 return 0;
152 }
153 if (argc == 2 && !strcmp(argv[1], "--mmap")) {
154 test_mmap();
155 return 0;
156 }
157 if (argc == 2 && !strcmp(argv[1], "--prctl")) {
158 test_prctl();
159 return 0;
160 }
161 if (argc == 2 && !strcmp(argv[1], "--prctl-exec")) {
162 return test_prctl_exec();
163 }
164 if (argc == 2 && !strcmp(argv[1], "--resource")) {
165 test_resource_accounting();
166 return 0;
167 }
168 if (argc == 2 && !strcmp(argv[1], "--signal-frame")) {
169 test_linux_signal_frame();
170 return 0;
171 }
172 if (argc == 2 && !strcmp(argv[1], "--process-stop-contracts")) {
173 test_process_stop_contracts();
174 return 0;
175 }
176 if (argc == 2 && !strcmp(argv[1], "--proc-kernel-threads")) {
177 test_proc_kernel_threads();
178 return 0;
179 }
180
181 printf("Running tests...\n");
182
183 // Add calls to test functions here...
184 test_mmap();
185 test_mprotect();
186 test_prctl();
187 test_resource_accounting();
188 test_syscall_contracts();
189 test_vm_contracts();
190 test_usercopy_contracts();
191 test_futex_contracts(argv[0]);
192 test_fs_mutation_contracts();
193 test_exec_shebang(argv[0]);
194 test_exec_arguments(argv[0]);
195 test_process(argv[0]);
196 test_dup3();
197 test_epoll_pty();
198 test_pty_contracts();
199 test_scm_rights();
200 test_scm_rights_stream();
201 test_unix_seqpacket();
202 test_unix_stream_interruption();
203 test_unix_seqpacket_interruption();
204 test_fs();
205
206 printf("Tests complete!\n");
207 return 0;
208}