custom message for vm_update
[minix3.git] / test / test2.c
blob8afbb7eba6e4782872787c2a6642899017379c19
1 /* test 2 */
3 #include <sys/types.h>
4 #include <sys/times.h>
5 #include <sys/wait.h>
6 #include <errno.h>
7 #include <signal.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <time.h>
11 #include <stdio.h>
13 #define ITERATIONS 5
14 int max_error = 4;
15 #include "common.h"
18 int is, array[4], parsigs, parcum, sigct, cumsig, subtest;
19 int iteration, kk = 0;
20 char buf[2048];
23 int main(int argc, char *argv []);
24 void test2a(void);
25 void test2b(void);
26 void test2c(void);
27 void test2d(void);
28 void test2e(void);
29 void test2f(void);
30 void test2g(void);
31 void sigpip(int s);
33 int main(argc, argv)
34 int argc;
35 char *argv[];
37 int i, m = 0xFFFF;
39 start(2);
41 for (i = 0; i < ITERATIONS; i++) {
42 iteration = i;
43 if (m & 0001) test2a();
44 if (m & 0002) test2b();
45 if (m & 0004) test2c();
46 if (m & 0010) test2d();
47 if (m & 0020) test2e();
48 if (m & 0040) test2f();
49 if (m & 0100) test2g();
51 subtest = 100;
52 if (cumsig != ITERATIONS) e(101);
53 quit();
54 return(-1); /* impossible */
57 void test2a()
59 /* Test pipes */
61 int fd[2];
62 int n, i, j, q = 0;
64 subtest = 1;
65 if (pipe(fd) < 0) {
66 printf("pipe error. errno= %d\n", errno);
67 e(10);
68 quit();
70 i = fork();
71 if (i < 0) {
72 printf("fork failed\n");
73 e(11);
74 quit();
76 if (i != 0) {
77 /* Parent code */
78 close(fd[0]);
79 for (i = 0; i < 2048; i++) buf[i] = i & 0377;
80 for (q = 0; q < 8; q++) {
81 if (write(fd[1], buf, 2048) < 0) {
82 printf("write pipe err. errno=%d\n", errno);
83 e(12);
84 quit();
87 close(fd[1]);
88 wait(&q);
89 if (q != 256 * 58) {
90 printf("wrong exit code %d\n", q);
91 e(13);
92 quit();
94 } else {
95 /* Child code */
96 close(fd[1]);
97 for (q = 0; q < 32; q++) {
98 n = read(fd[0], buf, 512);
99 if (n != 512) {
100 printf("read yielded %d bytes, not 512\n", n);
101 e(14);
102 quit();
104 for (j = 0; j < n; j++)
105 if ((buf[j] & 0377) != (kk & 0377)) {
106 printf("wrong data: %d %d %d \n ",
107 j, buf[j] & 0377, kk & 0377);
108 } else {
109 kk++;
112 exit(58);
116 void test2b()
118 int fd[2], n;
119 char buf[4];
121 subtest = 2;
122 sigct = 0;
123 signal(SIGPIPE, sigpip);
124 pipe(fd);
125 if (fork()) {
126 /* Parent */
127 close(fd[0]);
128 while (sigct == 0) {
129 write(fd[1], buf, 1);
131 wait(&n);
132 } else {
133 /* Child */
134 close(fd[0]);
135 close(fd[1]);
136 exit(0);
140 void test2c()
142 int n;
144 subtest = 3;
145 signal(SIGINT, SIG_DFL);
146 is = 0;
147 if ((array[is++] = fork()) > 0) {
148 if ((array[is++] = fork()) > 0) {
149 if ((array[is++] = fork()) > 0) {
150 if ((array[is++] = fork()) > 0) {
151 signal(SIGINT, SIG_IGN);
152 kill(array[0], SIGINT);
153 kill(array[1], SIGINT);
154 kill(array[2], SIGINT);
155 kill(array[3], SIGINT);
156 wait(&n);
157 wait(&n);
158 wait(&n);
159 wait(&n);
160 } else {
161 pause();
163 } else {
164 pause();
166 } else {
167 pause();
169 } else {
170 pause();
174 void test2d()
177 int pid, stat_loc, s;
179 /* Test waitpid. */
180 subtest = 4;
182 /* Test waitpid(pid, arg2, 0) */
183 pid = fork();
184 if (pid < 0) e(1);
185 if (pid > 0) {
186 /* Parent. */
187 s = waitpid(pid, &stat_loc, 0);
188 if (s != pid) e(2);
189 if (WIFEXITED(stat_loc) == 0) e(3);
190 if (WIFSIGNALED(stat_loc) != 0) e(4);
191 if (WEXITSTATUS(stat_loc) != 22) e(5);
192 } else {
193 /* Child */
194 exit(22);
197 /* Test waitpid(-1, arg2, 0) */
198 pid = fork();
199 if (pid < 0) e(6);
200 if (pid > 0) {
201 /* Parent. */
202 s = waitpid(-1, &stat_loc, 0);
203 if (s != pid) e(7);
204 if (WIFEXITED(stat_loc) == 0) e(8);
205 if (WIFSIGNALED(stat_loc) != 0) e(9);
206 if (WEXITSTATUS(stat_loc) != 33) e(10);
207 } else {
208 /* Child */
209 exit(33);
212 /* Test waitpid(0, arg2, 0) */
213 pid = fork();
214 if (pid < 0) e(11);
215 if (pid > 0) {
216 /* Parent. */
217 s = waitpid(0, &stat_loc, 0);
218 if (s != pid) e(12);
219 if (WIFEXITED(stat_loc) == 0) e(13);
220 if (WIFSIGNALED(stat_loc) != 0) e(14);
221 if (WEXITSTATUS(stat_loc) != 44) e(15);
222 } else {
223 /* Child */
224 exit(44);
227 /* Test waitpid(0, arg2, WNOHANG) */
228 signal(SIGTERM, SIG_DFL);
229 pid = fork();
230 if (pid < 0) e(16);
231 if (pid > 0) {
232 /* Parent. */
233 s = waitpid(0, &stat_loc, WNOHANG);
234 if (s != 0) e(17);
235 if (kill(pid, SIGTERM) != 0) e(18);
236 if (waitpid(pid, &stat_loc, 0) != pid) e(19);
237 if (WIFEXITED(stat_loc) != 0) e(20);
238 if (WIFSIGNALED(stat_loc) == 0) e(21);
239 if (WTERMSIG(stat_loc) != SIGTERM) e(22);
240 } else {
241 /* Child */
242 pause();
245 /* Test some error conditions. */
246 errno = 9999;
247 if (waitpid(0, &stat_loc, 0) != -1) e(23);
248 if (errno != ECHILD) e(24);
249 errno = 9999;
250 if (waitpid(0, &stat_loc, WNOHANG) != -1) e(25);
251 if (errno != ECHILD) e(26);
254 void test2e()
257 int pid1, pid2, stat_loc, s;
259 /* Test waitpid with two children. */
260 subtest = 5;
261 if (iteration > 1) return; /* slow test, don't do it too much */
262 if ( (pid1 = fork())) {
263 /* Parent. */
264 if ( (pid2 = fork()) ) {
265 /* Parent. Collect second child first. */
266 s = waitpid(pid2, &stat_loc, 0);
267 if (s != pid2) e(1);
268 if (WIFEXITED(stat_loc) == 0) e(2);
269 if (WIFSIGNALED(stat_loc) != 0) e(3);
270 if (WEXITSTATUS(stat_loc) != 222) e(4);
272 /* Now collect first child. */
273 s = waitpid(pid1, &stat_loc, 0);
274 if (s != pid1) e(5);
275 if (WIFEXITED(stat_loc) == 0) e(6);
276 if (WIFSIGNALED(stat_loc) != 0) e(7);
277 if (WEXITSTATUS(stat_loc) != 111) e(8);
278 } else {
279 /* Child 2. */
280 sleep(2); /* child 2 delays before exiting. */
281 exit(222);
283 } else {
284 /* Child 1. */
285 exit(111); /* child 1 exits immediately */
290 void test2f()
292 /* test getpid, getppid, getuid, etc. */
294 pid_t pid, pid1, ppid, cpid, stat_loc, err;
296 subtest = 6;
297 errno = -2000;
298 err = 0;
299 pid = getpid();
300 if ( (pid1 = fork())) {
301 /* Parent. Do nothing. */
302 if (wait(&stat_loc) != pid1) e(1);
303 if (WEXITSTATUS(stat_loc) != (pid1 & 0377)) e(2);
304 } else {
305 /* Child. Get ppid. */
306 cpid = getpid();
307 ppid = getppid();
308 if (ppid != pid) err = 3;
309 if (cpid == ppid) err = 4;
310 exit(cpid & 0377);
312 if (err != 0) e(err);
315 void test2g()
317 /* test time(), times() */
319 time_t t1, t2;
320 clock_t t3, t4;
321 long clocks_per_sec;
322 struct tms tmsbuf;
324 subtest = 7;
325 errno = -7000;
327 clocks_per_sec = sysconf(_SC_CLK_TCK);
329 /* First time(). */
330 t1 = -1;
331 t2 = -2;
332 t1 = time(&t2);
333 if (t1 < 650000000L) e(1); /* 650000000 is Sept. 1990 */
334 if (t1 != t2) e(2);
335 t1 = -1;
336 t1 = time( (time_t *) NULL);
337 if (t1 < 650000000L) e(3);
338 t3 = times(&tmsbuf);
339 sleep(1);
340 t2 = time( (time_t *) NULL);
341 if (t2 < 0L) e(4);
342 if (t2 - t1 < 1) e(5);
344 /* Now times(). */
345 t4 = times(&tmsbuf);
346 if (t4 == (clock_t) -1) e(6);
347 if (t4 - t3 < clocks_per_sec) e(7);
350 void sigpip(s)
351 int s; /* for ANSI */
353 sigct++;
354 cumsig++;