1*a1e26a70SApple OSS Distributions #include <string.h>
2*a1e26a70SApple OSS Distributions #include <errno.h>
3*a1e26a70SApple OSS Distributions #include <pwd.h>
4*a1e26a70SApple OSS Distributions #include <stdarg.h>
5*a1e26a70SApple OSS Distributions #include <stdio.h>
6*a1e26a70SApple OSS Distributions #include <stdlib.h>
7*a1e26a70SApple OSS Distributions #include <unistd.h>
8*a1e26a70SApple OSS Distributions #include <fcntl.h>
9*a1e26a70SApple OSS Distributions #include <pthread.h>
10*a1e26a70SApple OSS Distributions #include <poll.h>
11*a1e26a70SApple OSS Distributions #include <sys/types.h>
12*a1e26a70SApple OSS Distributions #include <sys/event.h>
13*a1e26a70SApple OSS Distributions #include <sys/time.h>
14*a1e26a70SApple OSS Distributions #include <sys/stat.h>
15*a1e26a70SApple OSS Distributions #include <sys/mman.h>
16*a1e26a70SApple OSS Distributions #include <sys/param.h>
17*a1e26a70SApple OSS Distributions #include <sys/mount.h>
18*a1e26a70SApple OSS Distributions #include <sys/xattr.h>
19*a1e26a70SApple OSS Distributions #include <sys/file.h>
20*a1e26a70SApple OSS Distributions
21*a1e26a70SApple OSS Distributions #include <TargetConditionals.h>
22*a1e26a70SApple OSS Distributions #include <darwintest.h>
23*a1e26a70SApple OSS Distributions
24*a1e26a70SApple OSS Distributions T_GLOBAL_META(
25*a1e26a70SApple OSS Distributions T_META_NAMESPACE("xnu.kevent")
26*a1e26a70SApple OSS Distributions );
27*a1e26a70SApple OSS Distributions
28*a1e26a70SApple OSS Distributions #define PDIR "/tmp"
29*a1e26a70SApple OSS Distributions #define DIR1 PDIR "/dir1"
30*a1e26a70SApple OSS Distributions #define DOTDOT ".."
31*a1e26a70SApple OSS Distributions #define DIR2 PDIR "/dir2"
32*a1e26a70SApple OSS Distributions #define FILE1 PDIR "/file1"
33*a1e26a70SApple OSS Distributions #define FILE2 PDIR "/file2"
34*a1e26a70SApple OSS Distributions
35*a1e26a70SApple OSS Distributions #define KEY "somekey"
36*a1e26a70SApple OSS Distributions #define VAL "someval"
37*a1e26a70SApple OSS Distributions
38*a1e26a70SApple OSS Distributions #define NOSLEEP 0
39*a1e26a70SApple OSS Distributions #define SLEEP 1
40*a1e26a70SApple OSS Distributions #define NO_EVENT 0
41*a1e26a70SApple OSS Distributions #define YES_EVENT 1
42*a1e26a70SApple OSS Distributions
43*a1e26a70SApple OSS Distributions
44*a1e26a70SApple OSS Distributions #define OUTPUT_LEVEL 0
45*a1e26a70SApple OSS Distributions #define RESULT_LEVEL 3
46*a1e26a70SApple OSS Distributions
47*a1e26a70SApple OSS Distributions #define TEST_STRING "Some text!!! Yes indeed, some of that very structure which has passed on man's knowledge for generations."
48*a1e26a70SApple OSS Distributions #define HELLO_WORLD "Hello, World!"
49*a1e26a70SApple OSS Distributions #define USLEEP_TIME 5000
50*a1e26a70SApple OSS Distributions #define WAIT_TIME (4l)
51*a1e26a70SApple OSS Distributions #define LENGTHEN_SIZE 500
52*a1e26a70SApple OSS Distributions #define FIFO_SPACE 8192 /* FIFOS have 8K of buffer space */
53*a1e26a70SApple OSS Distributions
54*a1e26a70SApple OSS Distributions /*
55*a1e26a70SApple OSS Distributions * These two variables are the non local memory for holding the return
56*a1e26a70SApple OSS Distributions * values from functions with which pthread_create is called.
57*a1e26a70SApple OSS Distributions */
58*a1e26a70SApple OSS Distributions int thread_status;
59*a1e26a70SApple OSS Distributions int fifo_read_fd;
60*a1e26a70SApple OSS Distributions
61*a1e26a70SApple OSS Distributions /*
62*a1e26a70SApple OSS Distributions * Types of actions for setup, cleanup, and execution of tests
63*a1e26a70SApple OSS Distributions */
64*a1e26a70SApple OSS Distributions typedef enum {CREAT, MKDIR, READ, WRITE, WRITEFD, FILLFD, UNLINK, LSKEE, RMDIR, MKFIFO, LENGTHEN, TRUNC,
65*a1e26a70SApple OSS Distributions SYMLINK, CHMOD, CHOWN, EXCHANGEDATA, RENAME, LSEEK, OPEN, MMAP, NOTHING,
66*a1e26a70SApple OSS Distributions SETXATTR, UTIMES, STAT, HARDLINK, REVOKE, FUNLOCK} action_id_t;
67*a1e26a70SApple OSS Distributions
68*a1e26a70SApple OSS Distributions /*
69*a1e26a70SApple OSS Distributions * Directs an action as mentioned above
70*a1e26a70SApple OSS Distributions */
71*a1e26a70SApple OSS Distributions typedef struct _action {
72*a1e26a70SApple OSS Distributions int act_dosleep;
73*a1e26a70SApple OSS Distributions action_id_t act_id;
74*a1e26a70SApple OSS Distributions void *act_args[5];
75*a1e26a70SApple OSS Distributions int act_fd;
76*a1e26a70SApple OSS Distributions } action_t;
77*a1e26a70SApple OSS Distributions
78*a1e26a70SApple OSS Distributions /*
79*a1e26a70SApple OSS Distributions * A test case. Specifies setup, an event to look for, an action to take to
80*a1e26a70SApple OSS Distributions * cause (or not cause) that event, and cleanup.
81*a1e26a70SApple OSS Distributions */
82*a1e26a70SApple OSS Distributions typedef struct _test {
83*a1e26a70SApple OSS Distributions char *t_testname;
84*a1e26a70SApple OSS Distributions
85*a1e26a70SApple OSS Distributions /* Is this test an expected failure? */
86*a1e26a70SApple OSS Distributions int t_known_failure;
87*a1e26a70SApple OSS Distributions
88*a1e26a70SApple OSS Distributions /* Is this test behaving non-deterministically? */
89*a1e26a70SApple OSS Distributions int t_nondeterministic;
90*a1e26a70SApple OSS Distributions
91*a1e26a70SApple OSS Distributions /* Test kevent() or poll() */
92*a1e26a70SApple OSS Distributions int t_is_poll_test;
93*a1e26a70SApple OSS Distributions
94*a1e26a70SApple OSS Distributions /* Actions for setting up test */
95*a1e26a70SApple OSS Distributions int t_n_prep_actions;
96*a1e26a70SApple OSS Distributions action_t t_prep_actions[5];
97*a1e26a70SApple OSS Distributions
98*a1e26a70SApple OSS Distributions /* Actions for cleaning up test */
99*a1e26a70SApple OSS Distributions int t_n_cleanup_actions;
100*a1e26a70SApple OSS Distributions action_t t_cleanup_actions[5];
101*a1e26a70SApple OSS Distributions
102*a1e26a70SApple OSS Distributions /* Action for thred to take while we wait */
103*a1e26a70SApple OSS Distributions action_t t_helpthreadact;
104*a1e26a70SApple OSS Distributions
105*a1e26a70SApple OSS Distributions /* File to look for event on */
106*a1e26a70SApple OSS Distributions char *t_watchfile; /* set event ident IN TEST (can't know fd beforehand)*/
107*a1e26a70SApple OSS Distributions int t_file_is_fifo;/* FIFOs are handled in a special manner */
108*a1e26a70SApple OSS Distributions
109*a1e26a70SApple OSS Distributions /* Different parameters for poll() vs kevent() */
110*a1e26a70SApple OSS Distributions union {
111*a1e26a70SApple OSS Distributions struct kevent tu_kev;
112*a1e26a70SApple OSS Distributions short tu_pollevents;
113*a1e26a70SApple OSS Distributions } t_union;
114*a1e26a70SApple OSS Distributions
115*a1e26a70SApple OSS Distributions /* Do we expect results? */
116*a1e26a70SApple OSS Distributions int t_want_event;
117*a1e26a70SApple OSS Distributions
118*a1e26a70SApple OSS Distributions /* Not always used--how much data should we find (EVFILT_{READ,WRITE}) */
119*a1e26a70SApple OSS Distributions int t_nbytes;
120*a1e26a70SApple OSS Distributions
121*a1e26a70SApple OSS Distributions /* Hacks for FILT_READ and pipes */
122*a1e26a70SApple OSS Distributions int t_read_to_end_first; /* Consume all data in file before waiting for event */
123*a1e26a70SApple OSS Distributions int t_write_some_data; /* Write some data to file before waiting for event (FIFO hack) */
124*a1e26a70SApple OSS Distributions int t_extra_sleep_hack; /* Sleep before waiting, to let a fifo fill up with data */
125*a1e26a70SApple OSS Distributions } test_t;
126*a1e26a70SApple OSS Distributions
127*a1e26a70SApple OSS Distributions char *
get_action_name(action_id_t a)128*a1e26a70SApple OSS Distributions get_action_name(action_id_t a)
129*a1e26a70SApple OSS Distributions {
130*a1e26a70SApple OSS Distributions switch (a) {
131*a1e26a70SApple OSS Distributions case CREAT:
132*a1e26a70SApple OSS Distributions return "CREAT";
133*a1e26a70SApple OSS Distributions case MKDIR:
134*a1e26a70SApple OSS Distributions return "MKDIR";
135*a1e26a70SApple OSS Distributions case READ:
136*a1e26a70SApple OSS Distributions return "READ";
137*a1e26a70SApple OSS Distributions case WRITE:
138*a1e26a70SApple OSS Distributions return "WRITE";
139*a1e26a70SApple OSS Distributions case WRITEFD:
140*a1e26a70SApple OSS Distributions return "WRITEFD";
141*a1e26a70SApple OSS Distributions case FILLFD:
142*a1e26a70SApple OSS Distributions return "FILLFD";
143*a1e26a70SApple OSS Distributions case UNLINK:
144*a1e26a70SApple OSS Distributions return "UNLINK";
145*a1e26a70SApple OSS Distributions case LSKEE:
146*a1e26a70SApple OSS Distributions return "LSKEE";
147*a1e26a70SApple OSS Distributions case RMDIR:
148*a1e26a70SApple OSS Distributions return "RMDIR";
149*a1e26a70SApple OSS Distributions case MKFIFO:
150*a1e26a70SApple OSS Distributions return "MKFIFO";
151*a1e26a70SApple OSS Distributions case LENGTHEN:
152*a1e26a70SApple OSS Distributions return "LENGTHEN";
153*a1e26a70SApple OSS Distributions case TRUNC:
154*a1e26a70SApple OSS Distributions return "TRUNC";
155*a1e26a70SApple OSS Distributions case SYMLINK:
156*a1e26a70SApple OSS Distributions return "SYMLINK";
157*a1e26a70SApple OSS Distributions case CHMOD:
158*a1e26a70SApple OSS Distributions return "CHMOD";
159*a1e26a70SApple OSS Distributions case CHOWN:
160*a1e26a70SApple OSS Distributions return "CHOWN";
161*a1e26a70SApple OSS Distributions case EXCHANGEDATA:
162*a1e26a70SApple OSS Distributions return "EXCHANGEDATA";
163*a1e26a70SApple OSS Distributions case RENAME:
164*a1e26a70SApple OSS Distributions return "RENAME";
165*a1e26a70SApple OSS Distributions case LSEEK:
166*a1e26a70SApple OSS Distributions return "LSEEK";
167*a1e26a70SApple OSS Distributions case OPEN:
168*a1e26a70SApple OSS Distributions return "OPEN";
169*a1e26a70SApple OSS Distributions case MMAP:
170*a1e26a70SApple OSS Distributions return "MMAP";
171*a1e26a70SApple OSS Distributions case NOTHING:
172*a1e26a70SApple OSS Distributions return "NOTHING";
173*a1e26a70SApple OSS Distributions case SETXATTR:
174*a1e26a70SApple OSS Distributions return "SETXATTR";
175*a1e26a70SApple OSS Distributions case UTIMES:
176*a1e26a70SApple OSS Distributions return "UTIMES";
177*a1e26a70SApple OSS Distributions case STAT:
178*a1e26a70SApple OSS Distributions return "STAT";
179*a1e26a70SApple OSS Distributions case HARDLINK:
180*a1e26a70SApple OSS Distributions return "HARDLINK";
181*a1e26a70SApple OSS Distributions case REVOKE:
182*a1e26a70SApple OSS Distributions return "REVOKE";
183*a1e26a70SApple OSS Distributions case FUNLOCK:
184*a1e26a70SApple OSS Distributions return "FUNLOCK";
185*a1e26a70SApple OSS Distributions }
186*a1e26a70SApple OSS Distributions return "Unknown";
187*a1e26a70SApple OSS Distributions }
188*a1e26a70SApple OSS Distributions /*
189*a1e26a70SApple OSS Distributions * Initialize an action struct. Whether to sleep, what action to take,
190*a1e26a70SApple OSS Distributions * and arguments for that action.
191*a1e26a70SApple OSS Distributions */
192*a1e26a70SApple OSS Distributions void
init_action(action_t * act,int sleep,action_id_t call,int nargs,...)193*a1e26a70SApple OSS Distributions init_action(action_t *act, int sleep, action_id_t call, int nargs, ...)
194*a1e26a70SApple OSS Distributions {
195*a1e26a70SApple OSS Distributions int i;
196*a1e26a70SApple OSS Distributions va_list ap;
197*a1e26a70SApple OSS Distributions va_start(ap, nargs);
198*a1e26a70SApple OSS Distributions act->act_dosleep = sleep;
199*a1e26a70SApple OSS Distributions act->act_id = call;
200*a1e26a70SApple OSS Distributions
201*a1e26a70SApple OSS Distributions for (i = 0; i < nargs; i++) {
202*a1e26a70SApple OSS Distributions act->act_args[i] = va_arg(ap, void*);
203*a1e26a70SApple OSS Distributions }
204*a1e26a70SApple OSS Distributions
205*a1e26a70SApple OSS Distributions va_end(ap);
206*a1e26a70SApple OSS Distributions }
207*a1e26a70SApple OSS Distributions
208*a1e26a70SApple OSS Distributions /*
209*a1e26a70SApple OSS Distributions * Opening a fifo is complicated: need to open both sides at once
210*a1e26a70SApple OSS Distributions */
211*a1e26a70SApple OSS Distributions void *
open_fifo_readside(void * arg)212*a1e26a70SApple OSS Distributions open_fifo_readside(void *arg)
213*a1e26a70SApple OSS Distributions {
214*a1e26a70SApple OSS Distributions if ((fifo_read_fd = open((char*)arg, O_RDONLY)) == -1) {
215*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDONLY) failed: %d (%s)\n", arg, errno, strerror(errno));
216*a1e26a70SApple OSS Distributions }
217*a1e26a70SApple OSS Distributions return &fifo_read_fd;
218*a1e26a70SApple OSS Distributions }
219*a1e26a70SApple OSS Distributions
220*a1e26a70SApple OSS Distributions /*
221*a1e26a70SApple OSS Distributions * Open a fifo, setting read and write descriptors. Return 0 for success, -1 for failure.
222*a1e26a70SApple OSS Distributions * Only set FD args upon success; they will be unmodified on failure.
223*a1e26a70SApple OSS Distributions */
224*a1e26a70SApple OSS Distributions int
open_fifo(const char * path,int * readfd,int * writefd)225*a1e26a70SApple OSS Distributions open_fifo(const char *path, int *readfd, int *writefd)
226*a1e26a70SApple OSS Distributions {
227*a1e26a70SApple OSS Distributions pthread_t thread;
228*a1e26a70SApple OSS Distributions int waitres;
229*a1e26a70SApple OSS Distributions int res;
230*a1e26a70SApple OSS Distributions int *tmpreadfd, tmpwritefd;
231*a1e26a70SApple OSS Distributions
232*a1e26a70SApple OSS Distributions fifo_read_fd = -1;
233*a1e26a70SApple OSS Distributions res = pthread_create(&thread, 0, open_fifo_readside, (void*)path);
234*a1e26a70SApple OSS Distributions if (res == 0) {
235*a1e26a70SApple OSS Distributions if ((tmpwritefd = open(path, O_WRONLY)) == -1) {
236*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_WRONLY) failed: %d (%s)\n", path, errno, strerror(errno));
237*a1e26a70SApple OSS Distributions return -1;
238*a1e26a70SApple OSS Distributions }
239*a1e26a70SApple OSS Distributions waitres = pthread_join(thread, (void**) &tmpreadfd);
240*a1e26a70SApple OSS Distributions
241*a1e26a70SApple OSS Distributions fcntl(tmpwritefd, F_SETFL, O_WRONLY | O_NONBLOCK);
242*a1e26a70SApple OSS Distributions
243*a1e26a70SApple OSS Distributions if ((waitres == 0) && (tmpwritefd >= 0) && (*tmpreadfd >= 0)) {
244*a1e26a70SApple OSS Distributions *readfd = *tmpreadfd;
245*a1e26a70SApple OSS Distributions *writefd = tmpwritefd;
246*a1e26a70SApple OSS Distributions } else {
247*a1e26a70SApple OSS Distributions res = -1;
248*a1e26a70SApple OSS Distributions }
249*a1e26a70SApple OSS Distributions }
250*a1e26a70SApple OSS Distributions
251*a1e26a70SApple OSS Distributions return res;
252*a1e26a70SApple OSS Distributions }
253*a1e26a70SApple OSS Distributions
254*a1e26a70SApple OSS Distributions /*
255*a1e26a70SApple OSS Distributions * Just concatenate a directory and a filename, sticking a "/" betwixt them
256*a1e26a70SApple OSS Distributions */
257*a1e26a70SApple OSS Distributions void
makepath(char * buf,const char * dir,const char * file)258*a1e26a70SApple OSS Distributions makepath(char *buf, const char *dir, const char *file)
259*a1e26a70SApple OSS Distributions {
260*a1e26a70SApple OSS Distributions strcpy(buf, dir);
261*a1e26a70SApple OSS Distributions strcat(buf, "/");
262*a1e26a70SApple OSS Distributions strcat(buf, file);
263*a1e26a70SApple OSS Distributions }
264*a1e26a70SApple OSS Distributions
265*a1e26a70SApple OSS Distributions
266*a1e26a70SApple OSS Distributions /* Execute a prep, cleanup, or test action; specific tricky notes below.
267*a1e26a70SApple OSS Distributions *
268*a1e26a70SApple OSS Distributions * CREAT: comes to life and given length 1
269*a1e26a70SApple OSS Distributions * READ: try to read one char
270*a1e26a70SApple OSS Distributions * WRITE: try to write TEST_STRING to file
271*a1e26a70SApple OSS Distributions * LENGTHEN: make longer by LENGTHEN_SIZE
272*a1e26a70SApple OSS Distributions * MMAP: mmap first 20 bytes of file, write HELLO_WORLD in
273*a1e26a70SApple OSS Distributions * SETXATTR: set the KEY attribute to value VAL
274*a1e26a70SApple OSS Distributions * WRITEFD: instead of opening fresh, take an FD in the action struct (FIFOs)
275*a1e26a70SApple OSS Distributions * FILLFD: write a file until you can no longer. for filling FIFOS.
276*a1e26a70SApple OSS Distributions *
277*a1e26a70SApple OSS Distributions * * Several of these have hard-coded sizes.
278*a1e26a70SApple OSS Distributions */
279*a1e26a70SApple OSS Distributions void*
execute_action(void * actionptr)280*a1e26a70SApple OSS Distributions execute_action(void *actionptr)
281*a1e26a70SApple OSS Distributions {
282*a1e26a70SApple OSS Distributions action_t *act = (action_t*)actionptr;
283*a1e26a70SApple OSS Distributions void **args = act->act_args;
284*a1e26a70SApple OSS Distributions char c;
285*a1e26a70SApple OSS Distributions int res = -1, tmpfd, tmpfd2;
286*a1e26a70SApple OSS Distributions static int lastfd;
287*a1e26a70SApple OSS Distributions void *addr;
288*a1e26a70SApple OSS Distributions struct timeval tv;
289*a1e26a70SApple OSS Distributions struct stat sstat;
290*a1e26a70SApple OSS Distributions
291*a1e26a70SApple OSS Distributions T_LOG("Beginning action of type %d: %s\n", act->act_id, get_action_name(act->act_id));
292*a1e26a70SApple OSS Distributions
293*a1e26a70SApple OSS Distributions /* Let other thread get into kevent() sleep */
294*a1e26a70SApple OSS Distributions if (SLEEP == act->act_dosleep) {
295*a1e26a70SApple OSS Distributions usleep(USLEEP_TIME);
296*a1e26a70SApple OSS Distributions }
297*a1e26a70SApple OSS Distributions switch (act->act_id) {
298*a1e26a70SApple OSS Distributions case NOTHING:
299*a1e26a70SApple OSS Distributions res = 0;
300*a1e26a70SApple OSS Distributions break;
301*a1e26a70SApple OSS Distributions case CREAT:
302*a1e26a70SApple OSS Distributions if ((tmpfd = creat((char*)args[0], 0755)) == -1) {
303*a1e26a70SApple OSS Distributions T_LOG("creat() failed on \"%s\": %d (%s)\n", args[0], errno, strerror(errno));
304*a1e26a70SApple OSS Distributions res = -1;
305*a1e26a70SApple OSS Distributions break;
306*a1e26a70SApple OSS Distributions }
307*a1e26a70SApple OSS Distributions ftruncate(tmpfd, 1); /* So that mmap() doesn't fool us */
308*a1e26a70SApple OSS Distributions close(tmpfd);
309*a1e26a70SApple OSS Distributions res = 0;
310*a1e26a70SApple OSS Distributions break;
311*a1e26a70SApple OSS Distributions case MKDIR:
312*a1e26a70SApple OSS Distributions res = mkdir((char*)args[0], 0755);
313*a1e26a70SApple OSS Distributions break;
314*a1e26a70SApple OSS Distributions case READ:
315*a1e26a70SApple OSS Distributions if ((tmpfd = open((char*)args[0], O_RDONLY)) == -1) {
316*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDONLY) failed: %d (%s)\n", args[0], errno, strerror(errno));
317*a1e26a70SApple OSS Distributions res = -1;
318*a1e26a70SApple OSS Distributions break;
319*a1e26a70SApple OSS Distributions }
320*a1e26a70SApple OSS Distributions res = read(tmpfd, &c, 1);
321*a1e26a70SApple OSS Distributions res = (res == 1 ? 0 : -1);
322*a1e26a70SApple OSS Distributions close(tmpfd);
323*a1e26a70SApple OSS Distributions break;
324*a1e26a70SApple OSS Distributions case WRITE:
325*a1e26a70SApple OSS Distributions if ((tmpfd = open((char*)args[0], O_RDWR)) == -1) {
326*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDWR) failed: %d (%s)\n", args[0], errno, strerror(errno));
327*a1e26a70SApple OSS Distributions res = -1;
328*a1e26a70SApple OSS Distributions break;
329*a1e26a70SApple OSS Distributions }
330*a1e26a70SApple OSS Distributions res = write(tmpfd, TEST_STRING, strlen(TEST_STRING));
331*a1e26a70SApple OSS Distributions if (res == strlen(TEST_STRING)) {
332*a1e26a70SApple OSS Distributions res = 0;
333*a1e26a70SApple OSS Distributions } else {
334*a1e26a70SApple OSS Distributions res = -1;
335*a1e26a70SApple OSS Distributions }
336*a1e26a70SApple OSS Distributions close(tmpfd);
337*a1e26a70SApple OSS Distributions break;
338*a1e26a70SApple OSS Distributions case WRITEFD:
339*a1e26a70SApple OSS Distributions res = write((int)act->act_fd, TEST_STRING, strlen(TEST_STRING));
340*a1e26a70SApple OSS Distributions if (res == strlen(TEST_STRING)) {
341*a1e26a70SApple OSS Distributions res = 0;
342*a1e26a70SApple OSS Distributions } else {
343*a1e26a70SApple OSS Distributions res = -1;
344*a1e26a70SApple OSS Distributions }
345*a1e26a70SApple OSS Distributions break;
346*a1e26a70SApple OSS Distributions case FILLFD:
347*a1e26a70SApple OSS Distributions while (write((int)act->act_fd, "a", 1) > 0) {
348*a1e26a70SApple OSS Distributions ;
349*a1e26a70SApple OSS Distributions }
350*a1e26a70SApple OSS Distributions res = 0;
351*a1e26a70SApple OSS Distributions break;
352*a1e26a70SApple OSS Distributions case UNLINK:
353*a1e26a70SApple OSS Distributions res = unlink((char*)args[0]);
354*a1e26a70SApple OSS Distributions break;
355*a1e26a70SApple OSS Distributions case LSEEK:
356*a1e26a70SApple OSS Distributions res = lseek((int)act->act_fd, (int)args[0], SEEK_SET);
357*a1e26a70SApple OSS Distributions res = (res == (int)args[0] ? 0 : -1);
358*a1e26a70SApple OSS Distributions break;
359*a1e26a70SApple OSS Distributions case RMDIR:
360*a1e26a70SApple OSS Distributions res = rmdir((char*)args[0]);
361*a1e26a70SApple OSS Distributions break;
362*a1e26a70SApple OSS Distributions case MKFIFO:
363*a1e26a70SApple OSS Distributions res = mkfifo((char*)args[0], 0755);
364*a1e26a70SApple OSS Distributions break;
365*a1e26a70SApple OSS Distributions case LENGTHEN:
366*a1e26a70SApple OSS Distributions res = truncate((char*)args[0], LENGTHEN_SIZE);
367*a1e26a70SApple OSS Distributions break;
368*a1e26a70SApple OSS Distributions case TRUNC:
369*a1e26a70SApple OSS Distributions res = truncate((char*)args[0], 0);
370*a1e26a70SApple OSS Distributions break;
371*a1e26a70SApple OSS Distributions case SYMLINK:
372*a1e26a70SApple OSS Distributions res = symlink((char*)args[0], (char*)args[1]);
373*a1e26a70SApple OSS Distributions break;
374*a1e26a70SApple OSS Distributions case CHMOD:
375*a1e26a70SApple OSS Distributions res = chmod((char*)args[0], (int)args[1]);
376*a1e26a70SApple OSS Distributions break;
377*a1e26a70SApple OSS Distributions case CHOWN:
378*a1e26a70SApple OSS Distributions /* path, uid, gid */
379*a1e26a70SApple OSS Distributions res = chown((char*)args[0], (int) args[1], (int) args[2]);
380*a1e26a70SApple OSS Distributions break;
381*a1e26a70SApple OSS Distributions case EXCHANGEDATA:
382*a1e26a70SApple OSS Distributions res = exchangedata((char*)args[0], (char*)args[1], 0);
383*a1e26a70SApple OSS Distributions break;
384*a1e26a70SApple OSS Distributions case RENAME:
385*a1e26a70SApple OSS Distributions res = rename((char*)args[0], (char*)args[1]);
386*a1e26a70SApple OSS Distributions break;
387*a1e26a70SApple OSS Distributions case OPEN:
388*a1e26a70SApple OSS Distributions if ((tmpfd = open((char*)args[0], O_RDONLY | O_CREAT)) == -1) {
389*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDONLY | O_CREAT) failed: %d (%s)\n", args[0], errno, strerror(errno));
390*a1e26a70SApple OSS Distributions res = -1;
391*a1e26a70SApple OSS Distributions break;
392*a1e26a70SApple OSS Distributions }
393*a1e26a70SApple OSS Distributions res = close(tmpfd);
394*a1e26a70SApple OSS Distributions break;
395*a1e26a70SApple OSS Distributions case MMAP:
396*a1e26a70SApple OSS Distributions /* It had best already exist with nonzero size */
397*a1e26a70SApple OSS Distributions if ((tmpfd = open((char*)args[0], O_RDWR)) == -1) {
398*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDWR) failed: %d (%s)\n", args[0], errno, strerror(errno));
399*a1e26a70SApple OSS Distributions res = -1;
400*a1e26a70SApple OSS Distributions break;
401*a1e26a70SApple OSS Distributions }
402*a1e26a70SApple OSS Distributions addr = mmap(0, 20, PROT_WRITE | PROT_READ, MAP_FILE | MAP_SHARED, tmpfd, 0);
403*a1e26a70SApple OSS Distributions if (addr != ((void*)-1)) {
404*a1e26a70SApple OSS Distributions res = 0;
405*a1e26a70SApple OSS Distributions if ((int)args[1]) {
406*a1e26a70SApple OSS Distributions strcpy((char*)addr, HELLO_WORLD);
407*a1e26a70SApple OSS Distributions msync(addr, 20, MS_SYNC);
408*a1e26a70SApple OSS Distributions }
409*a1e26a70SApple OSS Distributions }
410*a1e26a70SApple OSS Distributions close(tmpfd);
411*a1e26a70SApple OSS Distributions munmap(addr, 20);
412*a1e26a70SApple OSS Distributions break;
413*a1e26a70SApple OSS Distributions case SETXATTR:
414*a1e26a70SApple OSS Distributions res = setxattr((char*)args[0], KEY, (void*)VAL, strlen(VAL),
415*a1e26a70SApple OSS Distributions 0, 0);
416*a1e26a70SApple OSS Distributions break;
417*a1e26a70SApple OSS Distributions case UTIMES:
418*a1e26a70SApple OSS Distributions tv.tv_sec = time(NULL);
419*a1e26a70SApple OSS Distributions tv.tv_usec = 0;
420*a1e26a70SApple OSS Distributions res = utimes((char*)args[0], &tv);
421*a1e26a70SApple OSS Distributions break;
422*a1e26a70SApple OSS Distributions case STAT:
423*a1e26a70SApple OSS Distributions res = lstat((char*)args[0], &sstat);
424*a1e26a70SApple OSS Distributions break;
425*a1e26a70SApple OSS Distributions case HARDLINK:
426*a1e26a70SApple OSS Distributions res = link((char*)args[0], (char*)args[1]);
427*a1e26a70SApple OSS Distributions break;
428*a1e26a70SApple OSS Distributions case REVOKE:
429*a1e26a70SApple OSS Distributions if ((tmpfd = open((char*)args[0], O_RDONLY)) == -1) {
430*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDONLY) failed: %d (%s)\n", args[0], errno, strerror(errno));
431*a1e26a70SApple OSS Distributions res = -1;
432*a1e26a70SApple OSS Distributions break;
433*a1e26a70SApple OSS Distributions }
434*a1e26a70SApple OSS Distributions res = revoke((char*)args[0]);
435*a1e26a70SApple OSS Distributions close(tmpfd);
436*a1e26a70SApple OSS Distributions break;
437*a1e26a70SApple OSS Distributions case FUNLOCK:
438*a1e26a70SApple OSS Distributions if ((tmpfd = open((char*)args[0], O_RDONLY)) == -1) {
439*a1e26a70SApple OSS Distributions T_LOG("open(%s, O_RDONLY) failed: %d (%s)\n", args[0], errno, strerror(errno));
440*a1e26a70SApple OSS Distributions res = -1;
441*a1e26a70SApple OSS Distributions break;
442*a1e26a70SApple OSS Distributions }
443*a1e26a70SApple OSS Distributions if ((res = flock(tmpfd, LOCK_EX)) == -1) {
444*a1e26a70SApple OSS Distributions T_LOG("flock() LOCK_EX failed: %d (%s)\n", errno, strerror(errno));
445*a1e26a70SApple OSS Distributions close(tmpfd);
446*a1e26a70SApple OSS Distributions break;
447*a1e26a70SApple OSS Distributions }
448*a1e26a70SApple OSS Distributions if ((res = flock(tmpfd, LOCK_UN)) == -1) {
449*a1e26a70SApple OSS Distributions T_LOG("flock() LOCK_UN failed: %d (%s)\n", errno, strerror(errno));
450*a1e26a70SApple OSS Distributions close(tmpfd);
451*a1e26a70SApple OSS Distributions break;
452*a1e26a70SApple OSS Distributions }
453*a1e26a70SApple OSS Distributions close(tmpfd);
454*a1e26a70SApple OSS Distributions break;
455*a1e26a70SApple OSS Distributions default:
456*a1e26a70SApple OSS Distributions res = -1;
457*a1e26a70SApple OSS Distributions break;
458*a1e26a70SApple OSS Distributions }
459*a1e26a70SApple OSS Distributions
460*a1e26a70SApple OSS Distributions thread_status = res;
461*a1e26a70SApple OSS Distributions return &thread_status;
462*a1e26a70SApple OSS Distributions }
463*a1e26a70SApple OSS Distributions
464*a1e26a70SApple OSS Distributions /*
465*a1e26a70SApple OSS Distributions * Read until the end of a file, for EVFILT_READ purposes (considers file position)
466*a1e26a70SApple OSS Distributions */
467*a1e26a70SApple OSS Distributions void
read_to_end(int fd)468*a1e26a70SApple OSS Distributions read_to_end(int fd)
469*a1e26a70SApple OSS Distributions {
470*a1e26a70SApple OSS Distributions char buf[50];
471*a1e26a70SApple OSS Distributions while (read(fd, buf, sizeof(buf)) > 0) {
472*a1e26a70SApple OSS Distributions ;
473*a1e26a70SApple OSS Distributions }
474*a1e26a70SApple OSS Distributions }
475*a1e26a70SApple OSS Distributions
476*a1e26a70SApple OSS Distributions /*
477*a1e26a70SApple OSS Distributions * Helper for setup and cleanup; just execute every action in an array
478*a1e26a70SApple OSS Distributions * of actions. "failout" parameter indicates whether to stop if one fails.
479*a1e26a70SApple OSS Distributions */
480*a1e26a70SApple OSS Distributions int
execute_action_list(action_t * actions,int nactions,int failout)481*a1e26a70SApple OSS Distributions execute_action_list(action_t *actions, int nactions, int failout)
482*a1e26a70SApple OSS Distributions {
483*a1e26a70SApple OSS Distributions int i, res;
484*a1e26a70SApple OSS Distributions for (i = 0, res = 0; (0 == res || (!failout)) && (i < nactions); i++) {
485*a1e26a70SApple OSS Distributions T_LOG("Starting prep action %d\n", i);
486*a1e26a70SApple OSS Distributions res = *((int *) execute_action(&(actions[i])));
487*a1e26a70SApple OSS Distributions if (res != 0) {
488*a1e26a70SApple OSS Distributions T_LOG("Action list failed on step %d. res = %d errno = %d (%s)\n", i, res,
489*a1e26a70SApple OSS Distributions errno, strerror(errno));
490*a1e26a70SApple OSS Distributions } else {
491*a1e26a70SApple OSS Distributions T_LOG("Action list work succeeded on step %d.\n", i);
492*a1e26a70SApple OSS Distributions }
493*a1e26a70SApple OSS Distributions }
494*a1e26a70SApple OSS Distributions
495*a1e26a70SApple OSS Distributions return res;
496*a1e26a70SApple OSS Distributions }
497*a1e26a70SApple OSS Distributions
498*a1e26a70SApple OSS Distributions /*
499*a1e26a70SApple OSS Distributions * Execute a full test, return success value.
500*a1e26a70SApple OSS Distributions */
501*a1e26a70SApple OSS Distributions int
execute_test(test_t * test)502*a1e26a70SApple OSS Distributions execute_test(test_t *test)
503*a1e26a70SApple OSS Distributions {
504*a1e26a70SApple OSS Distributions int i, kqfd, filefd = -1, res2, res, cnt, writefd = -1;
505*a1e26a70SApple OSS Distributions int retval = -1;
506*a1e26a70SApple OSS Distributions pthread_t thr;
507*a1e26a70SApple OSS Distributions struct kevent evlist;
508*a1e26a70SApple OSS Distributions struct timespec ts = {WAIT_TIME, 0l};
509*a1e26a70SApple OSS Distributions int *status;
510*a1e26a70SApple OSS Distributions
511*a1e26a70SApple OSS Distributions memset(&evlist, 0, sizeof(evlist));
512*a1e26a70SApple OSS Distributions
513*a1e26a70SApple OSS Distributions T_LOG("[BEGIN] %s\n", test->t_testname);
514*a1e26a70SApple OSS Distributions
515*a1e26a70SApple OSS Distributions T_LOG(test->t_want_event ? "Expecting an event.\n" : "Not expecting events.\n");
516*a1e26a70SApple OSS Distributions
517*a1e26a70SApple OSS Distributions res = execute_action_list(test->t_prep_actions, test->t_n_prep_actions, 1);
518*a1e26a70SApple OSS Distributions
519*a1e26a70SApple OSS Distributions /* If prep succeeded */
520*a1e26a70SApple OSS Distributions if (0 == res) {
521*a1e26a70SApple OSS Distributions /* Create kqueue for kqueue tests*/
522*a1e26a70SApple OSS Distributions if (!test->t_is_poll_test) {
523*a1e26a70SApple OSS Distributions if ((kqfd = kqueue()) == -1) {
524*a1e26a70SApple OSS Distributions T_LOG("kqueue() failed: %d (%s)\n", errno, strerror(errno));
525*a1e26a70SApple OSS Distributions }
526*a1e26a70SApple OSS Distributions }
527*a1e26a70SApple OSS Distributions
528*a1e26a70SApple OSS Distributions if ((test->t_is_poll_test) || kqfd >= 0) {
529*a1e26a70SApple OSS Distributions /* Open the file we're to monitor. Fifos get special handling */
530*a1e26a70SApple OSS Distributions if (test->t_file_is_fifo) {
531*a1e26a70SApple OSS Distributions filefd = -1;
532*a1e26a70SApple OSS Distributions open_fifo(test->t_watchfile, &filefd, &writefd);
533*a1e26a70SApple OSS Distributions } else {
534*a1e26a70SApple OSS Distributions if ((filefd = open(test->t_watchfile, O_RDONLY | O_SYMLINK)) == -1) {
535*a1e26a70SApple OSS Distributions T_LOG("open() of watchfile %s failed: %d (%s)\n", test->t_watchfile,
536*a1e26a70SApple OSS Distributions errno, strerror(errno));
537*a1e26a70SApple OSS Distributions res = -1;
538*a1e26a70SApple OSS Distributions }
539*a1e26a70SApple OSS Distributions }
540*a1e26a70SApple OSS Distributions
541*a1e26a70SApple OSS Distributions if (filefd >= 0) {
542*a1e26a70SApple OSS Distributions T_LOG("Opened file to monitor.\n");
543*a1e26a70SApple OSS Distributions
544*a1e26a70SApple OSS Distributions /*
545*a1e26a70SApple OSS Distributions * Fill in the fd to monitor once you know it
546*a1e26a70SApple OSS Distributions * If it's a fifo test, then the helper is definitely going to want the write end.
547*a1e26a70SApple OSS Distributions */
548*a1e26a70SApple OSS Distributions test->t_helpthreadact.act_fd = (writefd >= 0 ? writefd : filefd);
549*a1e26a70SApple OSS Distributions
550*a1e26a70SApple OSS Distributions if (test->t_read_to_end_first) {
551*a1e26a70SApple OSS Distributions read_to_end(filefd);
552*a1e26a70SApple OSS Distributions } else if (test->t_write_some_data) {
553*a1e26a70SApple OSS Distributions action_t dowr;
554*a1e26a70SApple OSS Distributions init_action(&dowr, NOSLEEP, WRITEFD, 0);
555*a1e26a70SApple OSS Distributions dowr.act_fd = writefd;
556*a1e26a70SApple OSS Distributions (void)execute_action(&dowr);
557*a1e26a70SApple OSS Distributions }
558*a1e26a70SApple OSS Distributions
559*a1e26a70SApple OSS Distributions /* Helper modifies the file that we're listening on (sleeps first, in general) */
560*a1e26a70SApple OSS Distributions thread_status = 0;
561*a1e26a70SApple OSS Distributions res = pthread_create(&thr, NULL, execute_action, (void*) &test->t_helpthreadact);
562*a1e26a70SApple OSS Distributions if (0 == res) {
563*a1e26a70SApple OSS Distributions T_LOG("Created helper thread.\n");
564*a1e26a70SApple OSS Distributions
565*a1e26a70SApple OSS Distributions /* This is ugly business to hack on filling up a FIFO */
566*a1e26a70SApple OSS Distributions if (test->t_extra_sleep_hack) {
567*a1e26a70SApple OSS Distributions usleep(USLEEP_TIME);
568*a1e26a70SApple OSS Distributions }
569*a1e26a70SApple OSS Distributions
570*a1e26a70SApple OSS Distributions if (test->t_is_poll_test) {
571*a1e26a70SApple OSS Distributions struct pollfd pl;
572*a1e26a70SApple OSS Distributions pl.fd = filefd;
573*a1e26a70SApple OSS Distributions pl.events = test->t_union.tu_pollevents;
574*a1e26a70SApple OSS Distributions cnt = poll(&pl, 1, WAIT_TIME);
575*a1e26a70SApple OSS Distributions T_LOG("Finished poll() call.\n");
576*a1e26a70SApple OSS Distributions if ((cnt < 0)) {
577*a1e26a70SApple OSS Distributions T_LOG("error is in errno, %s\n", strerror(errno));
578*a1e26a70SApple OSS Distributions res = cnt;
579*a1e26a70SApple OSS Distributions }
580*a1e26a70SApple OSS Distributions } else {
581*a1e26a70SApple OSS Distributions test->t_union.tu_kev.ident = filefd;
582*a1e26a70SApple OSS Distributions cnt = kevent(kqfd, &test->t_union.tu_kev, 1, &evlist, 1, &ts);
583*a1e26a70SApple OSS Distributions T_LOG("Finished kevent() call.\n");
584*a1e26a70SApple OSS Distributions
585*a1e26a70SApple OSS Distributions if ((cnt < 0) || (evlist.flags & EV_ERROR)) {
586*a1e26a70SApple OSS Distributions T_LOG("kevent() call failed.\n");
587*a1e26a70SApple OSS Distributions if (cnt < 0) {
588*a1e26a70SApple OSS Distributions T_LOG("error is in errno, %s\n", strerror(errno));
589*a1e26a70SApple OSS Distributions } else {
590*a1e26a70SApple OSS Distributions T_LOG("error is in data, %s\n", strerror(evlist.data));
591*a1e26a70SApple OSS Distributions }
592*a1e26a70SApple OSS Distributions res = cnt;
593*a1e26a70SApple OSS Distributions }
594*a1e26a70SApple OSS Distributions }
595*a1e26a70SApple OSS Distributions
596*a1e26a70SApple OSS Distributions /* Success only if you've succeeded to this point AND joined AND other thread is happy*/
597*a1e26a70SApple OSS Distributions status = NULL;
598*a1e26a70SApple OSS Distributions res2 = pthread_join(thr, (void **)&status);
599*a1e26a70SApple OSS Distributions if (res2 != 0) {
600*a1e26a70SApple OSS Distributions T_LOG("Couldn't join helper thread: %d (%s).\n", res2,
601*a1e26a70SApple OSS Distributions strerror(res2));
602*a1e26a70SApple OSS Distributions } else if (*status) {
603*a1e26a70SApple OSS Distributions T_LOG("Helper action had result %d\n", *status);
604*a1e26a70SApple OSS Distributions }
605*a1e26a70SApple OSS Distributions res = ((res == 0) && (res2 == 0) && (*status == 0)) ? 0 : -1;
606*a1e26a70SApple OSS Distributions } else {
607*a1e26a70SApple OSS Distributions T_LOG("Couldn't start thread: %d (%s).\n", res, strerror(res));
608*a1e26a70SApple OSS Distributions }
609*a1e26a70SApple OSS Distributions
610*a1e26a70SApple OSS Distributions close(filefd);
611*a1e26a70SApple OSS Distributions if (test->t_file_is_fifo) {
612*a1e26a70SApple OSS Distributions close(writefd);
613*a1e26a70SApple OSS Distributions }
614*a1e26a70SApple OSS Distributions }
615*a1e26a70SApple OSS Distributions if (!test->t_is_poll_test) {
616*a1e26a70SApple OSS Distributions close(kqfd);
617*a1e26a70SApple OSS Distributions }
618*a1e26a70SApple OSS Distributions } else {
619*a1e26a70SApple OSS Distributions T_LOG("Couldn't open kqueue.\n");
620*a1e26a70SApple OSS Distributions res = -1;
621*a1e26a70SApple OSS Distributions }
622*a1e26a70SApple OSS Distributions }
623*a1e26a70SApple OSS Distributions
624*a1e26a70SApple OSS Distributions /* Cleanup work */
625*a1e26a70SApple OSS Distributions execute_action_list(test->t_cleanup_actions, test->t_n_cleanup_actions, 0);
626*a1e26a70SApple OSS Distributions
627*a1e26a70SApple OSS Distributions /* Success if nothing failed and we either received or did not receive event,
628*a1e26a70SApple OSS Distributions * as expected
629*a1e26a70SApple OSS Distributions */
630*a1e26a70SApple OSS Distributions if (0 == res) {
631*a1e26a70SApple OSS Distributions T_LOG(cnt > 0 ? "Got an event.\n" : "Did not get an event.\n");
632*a1e26a70SApple OSS Distributions if (((cnt > 0) && (test->t_want_event)) || ((cnt == 0) && (!test->t_want_event))) {
633*a1e26a70SApple OSS Distributions if ((!test->t_is_poll_test) && (test->t_union.tu_kev.filter == EVFILT_READ || test->t_union.tu_kev.filter == EVFILT_WRITE)
634*a1e26a70SApple OSS Distributions && (test->t_nbytes) && (test->t_nbytes != evlist.data)) {
635*a1e26a70SApple OSS Distributions T_LOG("Read wrong number of bytes available. Wanted %d, got %d\n", test->t_nbytes, evlist.data);
636*a1e26a70SApple OSS Distributions retval = -1;
637*a1e26a70SApple OSS Distributions } else {
638*a1e26a70SApple OSS Distributions retval = 0;
639*a1e26a70SApple OSS Distributions }
640*a1e26a70SApple OSS Distributions } else {
641*a1e26a70SApple OSS Distributions T_LOG("Got unexpected event or lack thereof.\n");
642*a1e26a70SApple OSS Distributions retval = -1;
643*a1e26a70SApple OSS Distributions }
644*a1e26a70SApple OSS Distributions } else {
645*a1e26a70SApple OSS Distributions T_LOG("Failed to execute test. res = %d\n", res);
646*a1e26a70SApple OSS Distributions retval = -1;
647*a1e26a70SApple OSS Distributions }
648*a1e26a70SApple OSS Distributions
649*a1e26a70SApple OSS Distributions if (test->t_nondeterministic) {
650*a1e26a70SApple OSS Distributions T_LOG("XXX non-deterministic test result = %d (%s)\n", retval,
651*a1e26a70SApple OSS Distributions (retval == 0) ? "pass" : "fail");
652*a1e26a70SApple OSS Distributions T_MAYFAIL;
653*a1e26a70SApple OSS Distributions } else {
654*a1e26a70SApple OSS Distributions if (test->t_known_failure) {
655*a1e26a70SApple OSS Distributions // Signal to harness that this test is expected to fail.
656*a1e26a70SApple OSS Distributions T_EXPECTFAIL;
657*a1e26a70SApple OSS Distributions }
658*a1e26a70SApple OSS Distributions }
659*a1e26a70SApple OSS Distributions
660*a1e26a70SApple OSS Distributions if (retval == 0) {
661*a1e26a70SApple OSS Distributions T_PASS("%s", test->t_testname);
662*a1e26a70SApple OSS Distributions } else {
663*a1e26a70SApple OSS Distributions T_FAIL("%s", test->t_testname);
664*a1e26a70SApple OSS Distributions }
665*a1e26a70SApple OSS Distributions
666*a1e26a70SApple OSS Distributions T_LOG("Test %s done with result %d.\n", test->t_testname, retval);
667*a1e26a70SApple OSS Distributions return retval;
668*a1e26a70SApple OSS Distributions }
669*a1e26a70SApple OSS Distributions
670*a1e26a70SApple OSS Distributions
671*a1e26a70SApple OSS Distributions
672*a1e26a70SApple OSS Distributions void
init_test_common(test_t * tst,char * testname,char * watchfile,int nprep,int nclean,int event,int want,int ispoll)673*a1e26a70SApple OSS Distributions init_test_common(test_t *tst, char *testname, char *watchfile, int nprep, int nclean, int event, int want, int ispoll)
674*a1e26a70SApple OSS Distributions {
675*a1e26a70SApple OSS Distributions memset(tst, 0, sizeof(test_t));
676*a1e26a70SApple OSS Distributions tst->t_testname = testname;
677*a1e26a70SApple OSS Distributions tst->t_known_failure = 0;
678*a1e26a70SApple OSS Distributions tst->t_nondeterministic = 0;
679*a1e26a70SApple OSS Distributions tst->t_watchfile = watchfile;
680*a1e26a70SApple OSS Distributions tst->t_n_prep_actions = nprep;
681*a1e26a70SApple OSS Distributions tst->t_n_cleanup_actions = nclean;
682*a1e26a70SApple OSS Distributions tst->t_want_event = (want > 0);
683*a1e26a70SApple OSS Distributions
684*a1e26a70SApple OSS Distributions if (ispoll) {
685*a1e26a70SApple OSS Distributions tst->t_is_poll_test = 1;
686*a1e26a70SApple OSS Distributions tst->t_union.tu_pollevents = (short)event;
687*a1e26a70SApple OSS Distributions } else {
688*a1e26a70SApple OSS Distributions /* Can do this because filter is negative, notes are positive */
689*a1e26a70SApple OSS Distributions if (event == EVFILT_READ || event == EVFILT_WRITE) {
690*a1e26a70SApple OSS Distributions EV_SET(&tst->t_union.tu_kev, 0, event, EV_ADD | EV_ENABLE, 0, 0, NULL);
691*a1e26a70SApple OSS Distributions tst->t_nbytes = want;
692*a1e26a70SApple OSS Distributions } else {
693*a1e26a70SApple OSS Distributions EV_SET(&tst->t_union.tu_kev, 0, EVFILT_VNODE, EV_ADD | EV_ENABLE, event, 0, NULL);
694*a1e26a70SApple OSS Distributions }
695*a1e26a70SApple OSS Distributions }
696*a1e26a70SApple OSS Distributions }
697*a1e26a70SApple OSS Distributions
698*a1e26a70SApple OSS Distributions /*
699*a1e26a70SApple OSS Distributions * Initialize a test case, not including its actions. Meaning: a name for it, what filename to watch,
700*a1e26a70SApple OSS Distributions * counts of prep and cleanup actions, what event to watch for, and whether you want an event/how many bytes read.
701*a1e26a70SApple OSS Distributions *
702*a1e26a70SApple OSS Distributions * "want" does double duty as whether you want an event and how many bytes you might want to read
703*a1e26a70SApple OSS Distributions * "event" is either an event flag (e.g. NOTE_WRITE) or EVFILT_READ
704*a1e26a70SApple OSS Distributions */
705*a1e26a70SApple OSS Distributions void
init_test(test_t * tst,char * testname,char * watchfile,int nprep,int nclean,int event,int want)706*a1e26a70SApple OSS Distributions init_test(test_t *tst, char *testname, char *watchfile, int nprep, int nclean, int event, int want)
707*a1e26a70SApple OSS Distributions {
708*a1e26a70SApple OSS Distributions init_test_common(tst, testname, watchfile, nprep, nclean, event, want, 0);
709*a1e26a70SApple OSS Distributions }
710*a1e26a70SApple OSS Distributions
711*a1e26a70SApple OSS Distributions /*
712*a1e26a70SApple OSS Distributions * Same as above, but for a poll() test
713*a1e26a70SApple OSS Distributions */
714*a1e26a70SApple OSS Distributions void
init_poll_test(test_t * tst,char * testname,char * watchfile,int nprep,int nclean,int event,int want)715*a1e26a70SApple OSS Distributions init_poll_test(test_t *tst, char *testname, char *watchfile, int nprep, int nclean, int event, int want)
716*a1e26a70SApple OSS Distributions {
717*a1e26a70SApple OSS Distributions init_test_common(tst, testname, watchfile, nprep, nclean, event, want, 1);
718*a1e26a70SApple OSS Distributions }
719*a1e26a70SApple OSS Distributions
720*a1e26a70SApple OSS Distributions void
run_note_delete_tests()721*a1e26a70SApple OSS Distributions run_note_delete_tests()
722*a1e26a70SApple OSS Distributions {
723*a1e26a70SApple OSS Distributions test_t test;
724*a1e26a70SApple OSS Distributions
725*a1e26a70SApple OSS Distributions init_test(&test, "1.1.2: unlink a file", FILE1, 1, 0, NOTE_DELETE, YES_EVENT);
726*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
727*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
728*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)FILE1, NULL);
729*a1e26a70SApple OSS Distributions execute_test(&test);
730*a1e26a70SApple OSS Distributions
731*a1e26a70SApple OSS Distributions init_test(&test, "1.1.3: rmdir a dir", DIR1, 1, 0, NOTE_DELETE, YES_EVENT);
732*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
733*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
734*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RMDIR, 2, (void*)DIR1, NULL);
735*a1e26a70SApple OSS Distributions execute_test(&test);
736*a1e26a70SApple OSS Distributions
737*a1e26a70SApple OSS Distributions init_test(&test, "1.1.4: rename one file over another", FILE2, 2, 1, NOTE_DELETE, YES_EVENT);
738*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
739*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
740*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE2, (void*)NULL);
741*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
742*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
743*a1e26a70SApple OSS Distributions execute_test(&test);
744*a1e26a70SApple OSS Distributions
745*a1e26a70SApple OSS Distributions init_test(&test, "1.1.5: rename one dir over another", DIR2, 2, 1, NOTE_DELETE, YES_EVENT);
746*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
747*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
748*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)DIR2, (void*)NULL);
749*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
750*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, NULL);
751*a1e26a70SApple OSS Distributions execute_test(&test);
752*a1e26a70SApple OSS Distributions
753*a1e26a70SApple OSS Distributions /* Do FIFO stuff here */
754*a1e26a70SApple OSS Distributions init_test(&test, "1.1.6: make a fifo, unlink it", FILE1, 1, 0, NOTE_DELETE, YES_EVENT);
755*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
756*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 2, (void*)FILE1, (void*)NULL);
757*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 1, (void*)FILE1);
758*a1e26a70SApple OSS Distributions execute_test(&test);
759*a1e26a70SApple OSS Distributions
760*a1e26a70SApple OSS Distributions init_test(&test, "1.1.7: rename a file over a fifo", FILE1, 2, 1, NOTE_DELETE, YES_EVENT);
761*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
762*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
763*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 2, (void*)FILE1, (void*)NULL);
764*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE2, (void*)NULL);
765*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE2, (void*)FILE1);
766*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
767*a1e26a70SApple OSS Distributions execute_test(&test);
768*a1e26a70SApple OSS Distributions
769*a1e26a70SApple OSS Distributions init_test(&test, "1.1.8: unlink a symlink to a file", FILE2, 2, 1, NOTE_DELETE, YES_EVENT);
770*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
771*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
772*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, SYMLINK, 2, (void*)FILE1, (void*)FILE2);
773*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)FILE2, NULL);
774*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
775*a1e26a70SApple OSS Distributions execute_test(&test);
776*a1e26a70SApple OSS Distributions
777*a1e26a70SApple OSS Distributions /* ================= */
778*a1e26a70SApple OSS Distributions
779*a1e26a70SApple OSS Distributions init_test(&test, "1.2.1: Straight-up rename file", FILE1, 1, 1, NOTE_DELETE, NO_EVENT);
780*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
781*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
782*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, (void*)NULL);
783*a1e26a70SApple OSS Distributions execute_test(&test);
784*a1e26a70SApple OSS Distributions
785*a1e26a70SApple OSS Distributions init_test(&test, "1.2.2: Straight-up rename dir", DIR1, 1, 1, NOTE_DELETE, NO_EVENT);
786*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
787*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
788*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, (void*)NULL);
789*a1e26a70SApple OSS Distributions execute_test(&test);
790*a1e26a70SApple OSS Distributions
791*a1e26a70SApple OSS Distributions init_test(&test, "1.2.3: Null action on file", FILE1, 1, 1, NOTE_DELETE, NO_EVENT);
792*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
793*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 2, NULL, NULL); /* The null action */
794*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
795*a1e26a70SApple OSS Distributions execute_test(&test);
796*a1e26a70SApple OSS Distributions
797*a1e26a70SApple OSS Distributions init_test(&test, "1.2.4: Rename one file over another: watch the file that lives", FILE1, 2, 1, NOTE_DELETE, NO_EVENT);
798*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
799*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE2, (void*)NULL);
800*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
801*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
802*a1e26a70SApple OSS Distributions execute_test(&test);
803*a1e26a70SApple OSS Distributions
804*a1e26a70SApple OSS Distributions init_test(&test, "1.2.5: Rename one dir over another, watch the dir that lives", DIR1, 2, 1, NOTE_DELETE, NO_EVENT);
805*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
806*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)DIR2, (void*)NULL);
807*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
808*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, NULL);
809*a1e26a70SApple OSS Distributions }
810*a1e26a70SApple OSS Distributions
811*a1e26a70SApple OSS Distributions static bool
path_on_apfs(const char * path)812*a1e26a70SApple OSS Distributions path_on_apfs(const char *path)
813*a1e26a70SApple OSS Distributions {
814*a1e26a70SApple OSS Distributions struct statfs sfs = {};
815*a1e26a70SApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(statfs(path, &sfs), NULL);
816*a1e26a70SApple OSS Distributions return memcmp(&sfs.f_fstypename[0], "apfs", strlen("apfs")) == 0;
817*a1e26a70SApple OSS Distributions }
818*a1e26a70SApple OSS Distributions
819*a1e26a70SApple OSS Distributions void
run_note_write_tests()820*a1e26a70SApple OSS Distributions run_note_write_tests()
821*a1e26a70SApple OSS Distributions {
822*a1e26a70SApple OSS Distributions char pathbuf[50];
823*a1e26a70SApple OSS Distributions char otherpathbuf[50];
824*a1e26a70SApple OSS Distributions
825*a1e26a70SApple OSS Distributions test_t test;
826*a1e26a70SApple OSS Distributions
827*a1e26a70SApple OSS Distributions init_test(&test, "2.1.1: Straight-up write to a file", FILE1, 1, 1, NOTE_WRITE, YES_EVENT);
828*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
829*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITE, 2, (void*)FILE1, NULL);
830*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
831*a1e26a70SApple OSS Distributions execute_test(&test);
832*a1e26a70SApple OSS Distributions
833*a1e26a70SApple OSS Distributions
834*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
835*a1e26a70SApple OSS Distributions init_test(&test, "2.1.2: creat() file inside a dir", DIR1, 1, 2, NOTE_WRITE, YES_EVENT);
836*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
837*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
838*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CREAT, 2, (void*)pathbuf, NULL);
839*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
840*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
841*a1e26a70SApple OSS Distributions execute_test(&test);
842*a1e26a70SApple OSS Distributions
843*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
844*a1e26a70SApple OSS Distributions init_test(&test, "2.1.3: open() file inside a dir", DIR1, 1, 2, NOTE_WRITE, YES_EVENT);
845*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
846*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
847*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, OPEN, 2, (void*)pathbuf, NULL);
848*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
849*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
850*a1e26a70SApple OSS Distributions execute_test(&test);
851*a1e26a70SApple OSS Distributions
852*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
853*a1e26a70SApple OSS Distributions init_test(&test, "2.1.4: unlink a file from a dir", DIR1, 2, 1, NOTE_WRITE, YES_EVENT);
854*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
855*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
856*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
857*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)pathbuf, NULL);
858*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
859*a1e26a70SApple OSS Distributions execute_test(&test);
860*a1e26a70SApple OSS Distributions
861*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
862*a1e26a70SApple OSS Distributions makepath(otherpathbuf, DIR1, FILE2);
863*a1e26a70SApple OSS Distributions init_test(&test, "2.1.5: rename a file in a dir", DIR1, 2, 2, NOTE_WRITE, YES_EVENT);
864*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
865*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
866*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
867*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)pathbuf, (void*)otherpathbuf);
868*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)otherpathbuf, (void*)NULL);
869*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
870*a1e26a70SApple OSS Distributions execute_test(&test);
871*a1e26a70SApple OSS Distributions
872*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
873*a1e26a70SApple OSS Distributions init_test(&test, "2.1.6: rename a file to outside of a dir", DIR1, 2, 2, NOTE_WRITE, YES_EVENT);
874*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
875*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
876*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
877*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)pathbuf, (void*)FILE1);
878*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
879*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
880*a1e26a70SApple OSS Distributions execute_test(&test);
881*a1e26a70SApple OSS Distributions
882*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
883*a1e26a70SApple OSS Distributions init_test(&test, "2.1.7: rename a file into a dir", DIR1, 2, 2, NOTE_WRITE, YES_EVENT);
884*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
885*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
886*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
887*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)pathbuf);
888*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
889*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
890*a1e26a70SApple OSS Distributions execute_test(&test);
891*a1e26a70SApple OSS Distributions
892*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
893*a1e26a70SApple OSS Distributions init_test(&test, "2.1.9: unlink a fifo from a dir", DIR1, 2, 1, NOTE_WRITE, YES_EVENT);
894*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
895*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
896*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKFIFO, 2, (void*)pathbuf, (void*)NULL);
897*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)pathbuf, NULL);
898*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
899*a1e26a70SApple OSS Distributions execute_test(&test);
900*a1e26a70SApple OSS Distributions
901*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
902*a1e26a70SApple OSS Distributions init_test(&test, "2.1.10: make symlink in a dir", DIR1, 1, 2, NOTE_WRITE, YES_EVENT);
903*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
904*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
905*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SYMLINK, 2, (void*)DOTDOT, (void*)pathbuf);
906*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
907*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
908*a1e26a70SApple OSS Distributions execute_test(&test);
909*a1e26a70SApple OSS Distributions
910*a1e26a70SApple OSS Distributions init_test(&test, "2.1.12: write to a FIFO", FILE1, 1, 1, NOTE_WRITE, YES_EVENT);
911*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
912*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 2, (void*)FILE1, (void*)NULL);
913*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
914*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITEFD, 0);
915*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
916*a1e26a70SApple OSS Distributions execute_test(&test);
917*a1e26a70SApple OSS Distributions
918*a1e26a70SApple OSS Distributions
919*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
920*a1e26a70SApple OSS Distributions init_test(&test, "2.1.13: delete a symlink in a dir", DIR1, 2, 1, NOTE_WRITE, YES_EVENT);
921*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
922*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
923*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, SYMLINK, 2, (void*)DOTDOT, (void*)pathbuf);
924*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)pathbuf, (void*)FILE1);
925*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
926*a1e26a70SApple OSS Distributions execute_test(&test);
927*a1e26a70SApple OSS Distributions
928*a1e26a70SApple OSS Distributions /* exchangedata is not supported on APFS volumes */
929*a1e26a70SApple OSS Distributions if (!path_on_apfs(PDIR)) {
930*a1e26a70SApple OSS Distributions /* This actually should not generate an event, though it's in this section */
931*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
932*a1e26a70SApple OSS Distributions makepath(otherpathbuf, DIR1, FILE2);
933*a1e26a70SApple OSS Distributions init_test(&test, "2.1.14: exchangedata two files in a dir", DIR1, 3, 3, NOTE_WRITE, NO_EVENT);
934*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
935*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
936*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
937*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[2]), NOSLEEP, CREAT, 2, (void*)otherpathbuf, (void*)NULL);
938*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, EXCHANGEDATA, 2, (void*)pathbuf, (void*)otherpathbuf);
939*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
940*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, UNLINK, 2, (void*)otherpathbuf, (void*)NULL);
941*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[2], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
942*a1e26a70SApple OSS Distributions execute_test(&test);
943*a1e26a70SApple OSS Distributions }
944*a1e26a70SApple OSS Distributions
945*a1e26a70SApple OSS Distributions init_test(&test, "2.1.15: Change a file with mmap()", FILE1, 1, 1, NOTE_WRITE, YES_EVENT);
946*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
947*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, MMAP, 2, (void*)FILE1, (void*)1); /* 1 -> "modify it"*/
948*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
949*a1e26a70SApple OSS Distributions execute_test(&test);
950*a1e26a70SApple OSS Distributions
951*a1e26a70SApple OSS Distributions /*================= no-event tests ==================*/
952*a1e26a70SApple OSS Distributions init_test(&test, "2.2.1: just open and close existing file", FILE1, 1, 1, NOTE_WRITE, NO_EVENT);
953*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
954*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, OPEN, 2, (void*)FILE1, NULL);
955*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
956*a1e26a70SApple OSS Distributions execute_test(&test);
957*a1e26a70SApple OSS Distributions
958*a1e26a70SApple OSS Distributions init_test(&test, "2.2.2: read from existing file", FILE1, 1, 1, NOTE_WRITE, NO_EVENT);
959*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
960*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, READ, 2, (void*)FILE1, NULL);
961*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
962*a1e26a70SApple OSS Distributions execute_test(&test);
963*a1e26a70SApple OSS Distributions
964*a1e26a70SApple OSS Distributions init_test(&test, "2.2.3: rename existing file", FILE1, 1, 1, NOTE_WRITE, NO_EVENT);
965*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
966*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
967*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, (void*)NULL);
968*a1e26a70SApple OSS Distributions execute_test(&test);
969*a1e26a70SApple OSS Distributions
970*a1e26a70SApple OSS Distributions init_test(&test, "2.2.4: just open and close dir", DIR1, 1, 1, NOTE_WRITE, NO_EVENT);
971*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
972*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, OPEN, 2, (void*)DIR1, (void*)NULL);
973*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
974*a1e26a70SApple OSS Distributions execute_test(&test);
975*a1e26a70SApple OSS Distributions
976*a1e26a70SApple OSS Distributions /* There are no tests 2.2.5 or 2.2.6 */
977*a1e26a70SApple OSS Distributions
978*a1e26a70SApple OSS Distributions init_test(&test, "2.2.7: rename a dir", DIR1, 1, 1, NOTE_WRITE, NO_EVENT);
979*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
980*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
981*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, (void*)NULL);
982*a1e26a70SApple OSS Distributions execute_test(&test);
983*a1e26a70SApple OSS Distributions
984*a1e26a70SApple OSS Distributions init_test(&test, "2.2.8: rename a fifo", FILE1, 1, 1, NOTE_WRITE, NO_EVENT);
985*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
986*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 2, (void*)FILE1, (void*)NULL);
987*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
988*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, (void*)NULL);
989*a1e26a70SApple OSS Distributions execute_test(&test);
990*a1e26a70SApple OSS Distributions
991*a1e26a70SApple OSS Distributions init_test(&test, "2.2.9: unlink a fifo", FILE1, 1, 0, NOTE_WRITE, NO_EVENT);
992*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
993*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 2, (void*)FILE1, (void*)NULL);
994*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 1, (void*)FILE1);
995*a1e26a70SApple OSS Distributions execute_test(&test);
996*a1e26a70SApple OSS Distributions
997*a1e26a70SApple OSS Distributions init_test(&test, "2.2.10: chmod a file", FILE1, 1, 1, NOTE_WRITE, NO_EVENT);
998*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
999*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHMOD, 2, (void*)FILE1, (void*)0700);
1000*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1001*a1e26a70SApple OSS Distributions execute_test(&test);
1002*a1e26a70SApple OSS Distributions
1003*a1e26a70SApple OSS Distributions struct passwd *pwd = getpwnam("local");
1004*a1e26a70SApple OSS Distributions
1005*a1e26a70SApple OSS Distributions if (pwd != NULL) {
1006*a1e26a70SApple OSS Distributions init_test(&test, "2.2.11: chown a file", FILE1, 2, 1, NOTE_WRITE, NO_EVENT);
1007*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1008*a1e26a70SApple OSS Distributions init_action(&test.t_prep_actions[1], NOSLEEP, CHOWN, 3, (void*)FILE1, (void*)pwd->pw_uid, (void*)pwd->pw_gid);
1009*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHOWN, 3, (void*)FILE1, (void*)getuid(), (void*)getgid());
1010*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1011*a1e26a70SApple OSS Distributions execute_test(&test);
1012*a1e26a70SApple OSS Distributions }
1013*a1e26a70SApple OSS Distributions
1014*a1e26a70SApple OSS Distributions init_test(&test, "2.2.12: chmod a dir", DIR1, 1, 1, NOTE_WRITE, NO_EVENT);
1015*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1016*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHMOD, 2, (void*)DIR1, (void*)0700);
1017*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1018*a1e26a70SApple OSS Distributions execute_test(&test);
1019*a1e26a70SApple OSS Distributions
1020*a1e26a70SApple OSS Distributions if (pwd != NULL) {
1021*a1e26a70SApple OSS Distributions init_test(&test, "2.2.13: chown a dir", DIR1, 2, 1, NOTE_WRITE, NO_EVENT);
1022*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1023*a1e26a70SApple OSS Distributions init_action(&test.t_prep_actions[1], NOSLEEP, CHOWN, 3, (void*)DIR1, (void*)pwd->pw_uid, (void*)pwd->pw_gid);
1024*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHOWN, 3, (void*)DIR1, (void*)getuid(), (void*)getgid());
1025*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1026*a1e26a70SApple OSS Distributions execute_test(&test);
1027*a1e26a70SApple OSS Distributions }
1028*a1e26a70SApple OSS Distributions
1029*a1e26a70SApple OSS Distributions T_LOG("MMAP will never give a notification on HFS.\n");
1030*a1e26a70SApple OSS Distributions init_test(&test, "2.1.14: mmap() a file but do not change it", FILE1, 1, 1, NOTE_WRITE, NO_EVENT);
1031*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1032*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, MMAP, 2, (void*)FILE1, (void*)0);
1033*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1034*a1e26a70SApple OSS Distributions execute_test(&test);
1035*a1e26a70SApple OSS Distributions }
1036*a1e26a70SApple OSS Distributions
1037*a1e26a70SApple OSS Distributions void
run_note_extend_tests()1038*a1e26a70SApple OSS Distributions run_note_extend_tests()
1039*a1e26a70SApple OSS Distributions {
1040*a1e26a70SApple OSS Distributions test_t test;
1041*a1e26a70SApple OSS Distributions char pathbuf[50];
1042*a1e26a70SApple OSS Distributions
1043*a1e26a70SApple OSS Distributions T_LOG("THESE TESTS MAY FAIL ON HFS\n");
1044*a1e26a70SApple OSS Distributions
1045*a1e26a70SApple OSS Distributions init_test(&test, "3.1.1: write beyond the end of a file", FILE1, 1, 1, NOTE_EXTEND, YES_EVENT);
1046*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1047*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1048*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITE, 2, (void*)FILE1, (void*)NULL);
1049*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1050*a1e26a70SApple OSS Distributions execute_test(&test);
1051*a1e26a70SApple OSS Distributions
1052*a1e26a70SApple OSS Distributions /*
1053*a1e26a70SApple OSS Distributions * We won't concern ourselves with lengthening directories: commenting these out
1054*a1e26a70SApple OSS Distributions *
1055*a1e26a70SApple OSS Distributions *
1056*a1e26a70SApple OSS Distributions * makepath(pathbuf, DIR1, FILE1);
1057*a1e26a70SApple OSS Distributions * init_test(&test, "3.1.2: add a file to a directory with creat()", DIR1, 1, 2, NOTE_EXTEND, YES_EVENT);
1058*a1e26a70SApple OSS Distributions * init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1059*a1e26a70SApple OSS Distributions * init_action(&test.t_helpthreadact, SLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1060*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1061*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1062*a1e26a70SApple OSS Distributions * execute_test(&test);
1063*a1e26a70SApple OSS Distributions *
1064*a1e26a70SApple OSS Distributions * makepath(pathbuf, DIR1, FILE1);
1065*a1e26a70SApple OSS Distributions * init_test(&test, "3.1.3: add a file to a directory with open()", DIR1, 1, 2, NOTE_EXTEND, YES_EVENT);
1066*a1e26a70SApple OSS Distributions * init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1067*a1e26a70SApple OSS Distributions * init_action(&test.t_helpthreadact, SLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1068*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1069*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1070*a1e26a70SApple OSS Distributions * execute_test(&test);
1071*a1e26a70SApple OSS Distributions *
1072*a1e26a70SApple OSS Distributions * makepath(pathbuf, DIR1, FILE1);
1073*a1e26a70SApple OSS Distributions * init_test(&test, "3.1.4: add a file to a directory with rename()", DIR1, 2, 2, NOTE_EXTEND, YES_EVENT);
1074*a1e26a70SApple OSS Distributions * init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1075*a1e26a70SApple OSS Distributions * init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1076*a1e26a70SApple OSS Distributions * init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)pathbuf);
1077*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1078*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1079*a1e26a70SApple OSS Distributions * execute_test(&test);
1080*a1e26a70SApple OSS Distributions */
1081*a1e26a70SApple OSS Distributions
1082*a1e26a70SApple OSS Distributions /* 3.1.5: a placeholder for a potential kernel test */
1083*a1e26a70SApple OSS Distributions /*
1084*a1e26a70SApple OSS Distributions * makepath(pathbuf, DIR1, DIR2);
1085*a1e26a70SApple OSS Distributions * init_test(&test, "3.1.6: add a file to a directory with mkdir()", DIR1, 1, 2, NOTE_EXTEND, YES_EVENT);
1086*a1e26a70SApple OSS Distributions * init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1087*a1e26a70SApple OSS Distributions * init_action(&test.t_helpthreadact, SLEEP, MKDIR, 2, (void*)pathbuf, (void*)NULL);
1088*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)pathbuf, (void*)NULL);
1089*a1e26a70SApple OSS Distributions * init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1090*a1e26a70SApple OSS Distributions * execute_test(&test);
1091*a1e26a70SApple OSS Distributions */
1092*a1e26a70SApple OSS Distributions init_test(&test, "3.1.7: lengthen a file with truncate()", FILE1, 1, 1, NOTE_EXTEND, YES_EVENT);
1093*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1094*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1095*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, LENGTHEN, 2, FILE1, (void*)NULL);
1096*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1097*a1e26a70SApple OSS Distributions execute_test(&test);
1098*a1e26a70SApple OSS Distributions
1099*a1e26a70SApple OSS Distributions
1100*a1e26a70SApple OSS Distributions /** ========== NO EVENT SECTION ============== **/
1101*a1e26a70SApple OSS Distributions init_test(&test, "3.2.1: setxattr() a file", FILE1, 1, 1, NOTE_EXTEND, NO_EVENT);
1102*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1103*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SETXATTR, 2, FILE1, (void*)NULL);
1104*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1105*a1e26a70SApple OSS Distributions execute_test(&test);
1106*a1e26a70SApple OSS Distributions
1107*a1e26a70SApple OSS Distributions init_test(&test, "3.2.2: chmod a file", FILE1, 1, 1, NOTE_EXTEND, NO_EVENT);
1108*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1109*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHMOD, 2, (void*)FILE1, (void*)0700);
1110*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1111*a1e26a70SApple OSS Distributions execute_test(&test);
1112*a1e26a70SApple OSS Distributions
1113*a1e26a70SApple OSS Distributions struct passwd *pwd = getpwnam("local");
1114*a1e26a70SApple OSS Distributions if (pwd != NULL) {
1115*a1e26a70SApple OSS Distributions init_test(&test, "3.2.3: chown a file", FILE1, 2, 1, NOTE_EXTEND, NO_EVENT);
1116*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1117*a1e26a70SApple OSS Distributions init_action(&test.t_prep_actions[1], NOSLEEP, CHOWN, 3, (void*)FILE1, (void*)pwd->pw_uid, (void*)pwd->pw_gid);
1118*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHOWN, 3, (void*)FILE1, (void*)getuid(), (void*)getgid());
1119*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1120*a1e26a70SApple OSS Distributions execute_test(&test);
1121*a1e26a70SApple OSS Distributions } else {
1122*a1e26a70SApple OSS Distributions T_LOG("Couldn't getpwnam for user \"local\"\n");
1123*a1e26a70SApple OSS Distributions }
1124*a1e26a70SApple OSS Distributions
1125*a1e26a70SApple OSS Distributions init_test(&test, "3.2.4: chmod a dir", DIR1, 1, 1, NOTE_EXTEND, NO_EVENT);
1126*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1127*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHMOD, 2, (void*)DIR1, (void*)0700);
1128*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1129*a1e26a70SApple OSS Distributions execute_test(&test);
1130*a1e26a70SApple OSS Distributions
1131*a1e26a70SApple OSS Distributions if (pwd != NULL) {
1132*a1e26a70SApple OSS Distributions init_test(&test, "3.2.5: chown a dir", DIR1, 2, 1, NOTE_EXTEND, NO_EVENT);
1133*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1134*a1e26a70SApple OSS Distributions init_action(&test.t_prep_actions[1], NOSLEEP, CHOWN, 3, (void*)DIR1, (void*)pwd->pw_uid, (void*)pwd->pw_gid);
1135*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHOWN, 3, (void*)DIR1, (void*)getuid(), (void*)getgid());
1136*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1137*a1e26a70SApple OSS Distributions execute_test(&test);
1138*a1e26a70SApple OSS Distributions }
1139*a1e26a70SApple OSS Distributions
1140*a1e26a70SApple OSS Distributions init_test(&test, "3.2.6: TRUNC a file with truncate()", FILE1, 1, 1, NOTE_EXTEND, NO_EVENT);
1141*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1142*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, TRUNC, 2, FILE1, (void*)NULL);
1143*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1144*a1e26a70SApple OSS Distributions execute_test(&test);
1145*a1e26a70SApple OSS Distributions }
1146*a1e26a70SApple OSS Distributions
1147*a1e26a70SApple OSS Distributions void
run_note_attrib_tests()1148*a1e26a70SApple OSS Distributions run_note_attrib_tests()
1149*a1e26a70SApple OSS Distributions {
1150*a1e26a70SApple OSS Distributions test_t test;
1151*a1e26a70SApple OSS Distributions char pathbuf[50];
1152*a1e26a70SApple OSS Distributions
1153*a1e26a70SApple OSS Distributions init_test(&test, "4.1.1: chmod a file", FILE1, 1, 1, NOTE_ATTRIB, YES_EVENT);
1154*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1155*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1156*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHMOD, 2, FILE1, (void*)0700);
1157*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1158*a1e26a70SApple OSS Distributions execute_test(&test);
1159*a1e26a70SApple OSS Distributions
1160*a1e26a70SApple OSS Distributions struct passwd *pwd = getpwnam("local");
1161*a1e26a70SApple OSS Distributions if (pwd != NULL) {
1162*a1e26a70SApple OSS Distributions init_test(&test, "4.1.2: chown a file", FILE1, 2, 1, NOTE_ATTRIB, YES_EVENT);
1163*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1164*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CHOWN, 3, (void*)FILE1, (void*)pwd->pw_uid, (void*)pwd->pw_gid);
1165*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHOWN, 3, FILE1, (void*)getuid(), (void*)pwd->pw_gid);
1166*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1167*a1e26a70SApple OSS Distributions execute_test(&test);
1168*a1e26a70SApple OSS Distributions }
1169*a1e26a70SApple OSS Distributions
1170*a1e26a70SApple OSS Distributions init_test(&test, "4.1.3: chmod a dir", DIR1, 1, 1, NOTE_ATTRIB, YES_EVENT);
1171*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1172*a1e26a70SApple OSS Distributions init_action(&(test.t_helpthreadact), SLEEP, CHMOD, 2, (void*)DIR1, (void*)0700);
1173*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1174*a1e26a70SApple OSS Distributions execute_test(&test);
1175*a1e26a70SApple OSS Distributions
1176*a1e26a70SApple OSS Distributions if (pwd != NULL) {
1177*a1e26a70SApple OSS Distributions init_test(&test, "4.1.4: chown a dir", DIR1, 2, 1, NOTE_ATTRIB, YES_EVENT);
1178*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1179*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CHOWN, 3, (void*)DIR1, (void*) pwd->pw_uid, (void*)pwd->pw_gid);
1180*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CHOWN, 3, DIR1, (void*)getuid(), (void*)getgid());
1181*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1182*a1e26a70SApple OSS Distributions execute_test(&test);
1183*a1e26a70SApple OSS Distributions }
1184*a1e26a70SApple OSS Distributions
1185*a1e26a70SApple OSS Distributions init_test(&test, "4.1.5: setxattr on a file", FILE1, 1, 1, NOTE_ATTRIB, YES_EVENT);
1186*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1187*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1188*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SETXATTR, 2, (void*)FILE1, (void*)NULL);
1189*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1190*a1e26a70SApple OSS Distributions execute_test(&test);
1191*a1e26a70SApple OSS Distributions
1192*a1e26a70SApple OSS Distributions init_test(&test, "4.1.6: setxattr on a dir", DIR1, 1, 1, NOTE_ATTRIB, YES_EVENT);
1193*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1194*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1195*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SETXATTR, 2, (void*)DIR1, (void*)NULL);
1196*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1197*a1e26a70SApple OSS Distributions execute_test(&test);
1198*a1e26a70SApple OSS Distributions
1199*a1e26a70SApple OSS Distributions /* exchangedata is not supported on APFS volumes */
1200*a1e26a70SApple OSS Distributions if (!path_on_apfs(PDIR)) {
1201*a1e26a70SApple OSS Distributions init_test(&test, "4.1.7: exchangedata", FILE1, 2, 2, NOTE_ATTRIB, YES_EVENT);
1202*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1203*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE2, (void*)NULL);
1204*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, EXCHANGEDATA, 2, (void*)FILE1, (void*)FILE2);
1205*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1206*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, UNLINK, 2, (void*)FILE2, (void*)NULL);
1207*a1e26a70SApple OSS Distributions execute_test(&test);
1208*a1e26a70SApple OSS Distributions }
1209*a1e26a70SApple OSS Distributions
1210*a1e26a70SApple OSS Distributions init_test(&test, "4.1.8: utimes on a file", FILE1, 1, 1, NOTE_ATTRIB, YES_EVENT);
1211*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1212*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1213*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UTIMES, 2, (void*)FILE1, (void*)NULL);
1214*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1215*a1e26a70SApple OSS Distributions execute_test(&test);
1216*a1e26a70SApple OSS Distributions
1217*a1e26a70SApple OSS Distributions init_test(&test, "4.1.9: utimes on a dir", DIR1, 1, 1, NOTE_ATTRIB, YES_EVENT);
1218*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1219*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UTIMES, 2, (void*)DIR1, (void*)NULL);
1220*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1221*a1e26a70SApple OSS Distributions execute_test(&test);
1222*a1e26a70SApple OSS Distributions
1223*a1e26a70SApple OSS Distributions
1224*a1e26a70SApple OSS Distributions /* ====== NO EVENT TESTS ========== */
1225*a1e26a70SApple OSS Distributions
1226*a1e26a70SApple OSS Distributions init_test(&test, "4.2.1: rename a file", FILE1, 1, 1, NOTE_ATTRIB, NO_EVENT);
1227*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1228*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
1229*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1230*a1e26a70SApple OSS Distributions execute_test(&test);
1231*a1e26a70SApple OSS Distributions
1232*a1e26a70SApple OSS Distributions init_test(&test, "4.2.2: open (do not change) a file", FILE1, 1, 1, NOTE_ATTRIB, NO_EVENT);
1233*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1234*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, OPEN, 2, (void*)FILE1, NULL);
1235*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1236*a1e26a70SApple OSS Distributions execute_test(&test);
1237*a1e26a70SApple OSS Distributions
1238*a1e26a70SApple OSS Distributions init_test(&test, "4.2.3: stat a file", FILE1, 1, 1, NOTE_ATTRIB, NO_EVENT);
1239*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1240*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, STAT, 2, (void*)FILE1, NULL);
1241*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1242*a1e26a70SApple OSS Distributions execute_test(&test);
1243*a1e26a70SApple OSS Distributions
1244*a1e26a70SApple OSS Distributions init_test(&test, "4.2.4: unlink a file", FILE1, 1, 0, NOTE_ATTRIB, NO_EVENT);
1245*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1246*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)FILE1, NULL);
1247*a1e26a70SApple OSS Distributions execute_test(&test);
1248*a1e26a70SApple OSS Distributions
1249*a1e26a70SApple OSS Distributions init_test(&test, "4.2.5: write to a file", FILE1, 1, 1, NOTE_ATTRIB, NO_EVENT);
1250*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1251*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITE, 2, (void*)FILE1, (void*)NULL);
1252*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1253*a1e26a70SApple OSS Distributions execute_test(&test);
1254*a1e26a70SApple OSS Distributions
1255*a1e26a70SApple OSS Distributions T_LOG("EXPECT SPURIOUS NOTE_ATTRIB EVENTS FROM DIRECTORY OPERATIONS on HFS.\n");
1256*a1e26a70SApple OSS Distributions init_test(&test, "4.2.6: add a file to a directory with creat()", DIR1, 1, 2, NOTE_ATTRIB, NO_EVENT);
1257*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1258*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1259*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1260*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1261*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1262*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1263*a1e26a70SApple OSS Distributions execute_test(&test);
1264*a1e26a70SApple OSS Distributions
1265*a1e26a70SApple OSS Distributions init_test(&test, "4.2.7: mkdir in a dir", DIR1, 1, 2, NOTE_ATTRIB, NO_EVENT);
1266*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1267*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, DIR2);
1268*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1269*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, MKDIR, 2, (void*)pathbuf, (void*)NULL);
1270*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)pathbuf, (void*)NULL);
1271*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1272*a1e26a70SApple OSS Distributions execute_test(&test);
1273*a1e26a70SApple OSS Distributions
1274*a1e26a70SApple OSS Distributions init_test(&test, "4.2.8: add a symlink to a directory", DIR1, 1, 2, NOTE_ATTRIB, NO_EVENT);
1275*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1276*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1277*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1278*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SYMLINK, 2, (void*)DOTDOT, (void*)pathbuf);
1279*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1280*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1281*a1e26a70SApple OSS Distributions execute_test(&test);
1282*a1e26a70SApple OSS Distributions
1283*a1e26a70SApple OSS Distributions init_test(&test, "4.2.9: rename into a dir()", DIR1, 2, 2, NOTE_ATTRIB, NO_EVENT);
1284*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1285*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1286*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1287*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1288*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)pathbuf);
1289*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1290*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1291*a1e26a70SApple OSS Distributions execute_test(&test);
1292*a1e26a70SApple OSS Distributions
1293*a1e26a70SApple OSS Distributions init_test(&test, "4.2.10: unlink() file from dir", DIR1, 2, 1, NOTE_ATTRIB, NO_EVENT);
1294*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1295*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1296*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1297*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1298*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1299*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1300*a1e26a70SApple OSS Distributions execute_test(&test);
1301*a1e26a70SApple OSS Distributions
1302*a1e26a70SApple OSS Distributions init_test(&test, "4.2.11: mkfifo in a directory", DIR1, 1, 2, NOTE_ATTRIB, NO_EVENT);
1303*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1304*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1305*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1306*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, MKFIFO, 1, (void*)pathbuf);
1307*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1308*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1309*a1e26a70SApple OSS Distributions execute_test(&test);
1310*a1e26a70SApple OSS Distributions }
1311*a1e26a70SApple OSS Distributions
1312*a1e26a70SApple OSS Distributions
1313*a1e26a70SApple OSS Distributions void
run_note_link_tests()1314*a1e26a70SApple OSS Distributions run_note_link_tests()
1315*a1e26a70SApple OSS Distributions {
1316*a1e26a70SApple OSS Distributions test_t test;
1317*a1e26a70SApple OSS Distributions char pathbuf[50];
1318*a1e26a70SApple OSS Distributions char otherpathbuf[50];
1319*a1e26a70SApple OSS Distributions
1320*a1e26a70SApple OSS Distributions T_LOG("HFS DOES NOT HANDLE UNLINK CORRECTLY...\n");
1321*a1e26a70SApple OSS Distributions init_test(&test, "5.1.1: unlink() a file", FILE1, 1, 0, NOTE_LINK, YES_EVENT);
1322*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1323*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1324*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)FILE1, (void*)NULL);
1325*a1e26a70SApple OSS Distributions execute_test(&test);
1326*a1e26a70SApple OSS Distributions
1327*a1e26a70SApple OSS Distributions
1328*a1e26a70SApple OSS Distributions init_test(&test, "5.1.1.5: link A to B, watch A, remove B", FILE1, 2, 1, NOTE_LINK, YES_EVENT);
1329*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1330*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, HARDLINK, 2, (void*)FILE1, (void*)FILE2);
1331*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)FILE2, (void*)NULL);
1332*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1333*a1e26a70SApple OSS Distributions execute_test(&test);
1334*a1e26a70SApple OSS Distributions
1335*a1e26a70SApple OSS Distributions init_test(&test, "5.1.2: link() to a file", FILE1, 1, 2, NOTE_LINK, YES_EVENT);
1336*a1e26a70SApple OSS Distributions #if TARGET_OS_WATCH
1337*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1338*a1e26a70SApple OSS Distributions #endif
1339*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1340*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, HARDLINK, 2, (void*)FILE1, (void*)FILE2);
1341*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1342*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1343*a1e26a70SApple OSS Distributions execute_test(&test);
1344*a1e26a70SApple OSS Distributions
1345*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, DIR2);
1346*a1e26a70SApple OSS Distributions init_test(&test, "5.1.3: make one dir in another", DIR1, 1, 2, NOTE_LINK, YES_EVENT);
1347*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1348*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1349*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, MKDIR, 2, (void*)pathbuf, (void*)NULL);
1350*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)pathbuf, NULL);
1351*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1352*a1e26a70SApple OSS Distributions execute_test(&test);
1353*a1e26a70SApple OSS Distributions
1354*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, DIR2);
1355*a1e26a70SApple OSS Distributions init_test(&test, "5.1.4: rmdir a dir from within another", DIR1, 2, 1, NOTE_LINK, YES_EVENT);
1356*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1357*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1358*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)pathbuf, (void*)NULL);
1359*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RMDIR, 2, (void*)pathbuf, (void*)NULL);
1360*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1361*a1e26a70SApple OSS Distributions execute_test(&test);
1362*a1e26a70SApple OSS Distributions
1363*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, DIR2);
1364*a1e26a70SApple OSS Distributions makepath(otherpathbuf, DIR1, DIR1);
1365*a1e26a70SApple OSS Distributions init_test(&test, "5.1.5: rename dir A over dir B inside dir C", DIR1, 3, 2, NOTE_LINK, YES_EVENT);
1366*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1367*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1368*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)pathbuf, (void*)NULL);
1369*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[2]), NOSLEEP, MKDIR, 2, (void*)otherpathbuf, (void*)NULL);
1370*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)pathbuf, (void*)otherpathbuf);
1371*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)otherpathbuf, NULL);
1372*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1373*a1e26a70SApple OSS Distributions execute_test(&test);
1374*a1e26a70SApple OSS Distributions
1375*a1e26a70SApple OSS Distributions T_LOG("HFS bypasses hfs_makenode to create in target, so misses knote.\n");
1376*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, DIR2);
1377*a1e26a70SApple OSS Distributions init_test(&test, "5.1.6: rename one dir into another", DIR1, 2, 2, NOTE_LINK, YES_EVENT);
1378*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1379*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1380*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)DIR2, (void*)NULL);
1381*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR2, (void*)pathbuf);
1382*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)pathbuf, NULL);
1383*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1384*a1e26a70SApple OSS Distributions execute_test(&test);
1385*a1e26a70SApple OSS Distributions
1386*a1e26a70SApple OSS Distributions T_LOG("HFS bypasses hfs_removedir to remove from source, so misses knote.\n");
1387*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, DIR2);
1388*a1e26a70SApple OSS Distributions init_test(&test, "5.1.7: rename one dir out of another", DIR1, 2, 2, NOTE_LINK, YES_EVENT);
1389*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1390*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1391*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)pathbuf, (void*)NULL);
1392*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)pathbuf, (void*)DIR2);
1393*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, NULL);
1394*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1395*a1e26a70SApple OSS Distributions execute_test(&test);
1396*a1e26a70SApple OSS Distributions
1397*a1e26a70SApple OSS Distributions init_test(&test, "5.1.8: rmdir a dir", DIR1, 1, 0, NOTE_LINK, YES_EVENT);
1398*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1399*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1400*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RMDIR, 2, (void*)DIR1, (void*)NULL);
1401*a1e26a70SApple OSS Distributions execute_test(&test);
1402*a1e26a70SApple OSS Distributions
1403*a1e26a70SApple OSS Distributions /* ============= NO EVENT SECTION ============== */
1404*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1405*a1e26a70SApple OSS Distributions init_test(&test, "5.2.1: make a file in a dir", DIR1, 1, 2, NOTE_LINK, NO_EVENT);
1406*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1407*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1408*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1409*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, NULL);
1410*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1411*a1e26a70SApple OSS Distributions execute_test(&test);
1412*a1e26a70SApple OSS Distributions
1413*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1414*a1e26a70SApple OSS Distributions init_test(&test, "5.2.2: unlink a file in a dir", DIR1, 2, 1, NOTE_LINK, NO_EVENT);
1415*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1416*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1417*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1418*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)pathbuf, (void*)NULL);
1419*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1420*a1e26a70SApple OSS Distributions execute_test(&test);
1421*a1e26a70SApple OSS Distributions
1422*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1423*a1e26a70SApple OSS Distributions makepath(otherpathbuf, DIR1, FILE2);
1424*a1e26a70SApple OSS Distributions init_test(&test, "5.2.3: rename a file within a dir", DIR1, 2, 2, NOTE_LINK, NO_EVENT);
1425*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1426*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1427*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)pathbuf, (void*)NULL);
1428*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)pathbuf, (void*)otherpathbuf);
1429*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)otherpathbuf, NULL);
1430*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1431*a1e26a70SApple OSS Distributions execute_test(&test);
1432*a1e26a70SApple OSS Distributions
1433*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1434*a1e26a70SApple OSS Distributions init_test(&test, "5.2.4: rename a file into a dir", DIR1, 2, 2, NOTE_LINK, NO_EVENT);
1435*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1436*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1437*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1438*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)pathbuf);
1439*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, NULL);
1440*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1441*a1e26a70SApple OSS Distributions execute_test(&test);
1442*a1e26a70SApple OSS Distributions
1443*a1e26a70SApple OSS Distributions makepath(pathbuf, DIR1, FILE1);
1444*a1e26a70SApple OSS Distributions init_test(&test, "5.2.5: make a symlink in a dir", DIR1, 1, 2, NOTE_LINK, NO_EVENT);
1445*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1446*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1447*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SYMLINK, 2, (void*)DOTDOT, (void*)pathbuf);
1448*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)pathbuf, NULL);
1449*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1450*a1e26a70SApple OSS Distributions execute_test(&test);
1451*a1e26a70SApple OSS Distributions
1452*a1e26a70SApple OSS Distributions init_test(&test, "5.2.6: make a symlink to a dir", DIR1, 1, 2, NOTE_LINK, NO_EVENT);
1453*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1454*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1455*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SYMLINK, 2, (void*)DIR1, (void*)FILE1);
1456*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1457*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1458*a1e26a70SApple OSS Distributions execute_test(&test);
1459*a1e26a70SApple OSS Distributions
1460*a1e26a70SApple OSS Distributions init_test(&test, "5.2.7: make a symlink to a file", FILE1, 1, 2, NOTE_LINK, NO_EVENT);
1461*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1462*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, SYMLINK, 2, (void*)FILE1, (void*)FILE2);
1463*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1464*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1465*a1e26a70SApple OSS Distributions execute_test(&test);
1466*a1e26a70SApple OSS Distributions }
1467*a1e26a70SApple OSS Distributions
1468*a1e26a70SApple OSS Distributions void
run_note_rename_tests()1469*a1e26a70SApple OSS Distributions run_note_rename_tests()
1470*a1e26a70SApple OSS Distributions {
1471*a1e26a70SApple OSS Distributions test_t test;
1472*a1e26a70SApple OSS Distributions
1473*a1e26a70SApple OSS Distributions init_test(&test, "6.1.1: rename a file", FILE1, 1, 1, NOTE_RENAME, YES_EVENT);
1474*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1475*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1476*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
1477*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1478*a1e26a70SApple OSS Distributions execute_test(&test);
1479*a1e26a70SApple OSS Distributions
1480*a1e26a70SApple OSS Distributions init_test(&test, "6.1.2: rename a dir", DIR1, 1, 1, NOTE_RENAME, YES_EVENT);
1481*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1482*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1483*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
1484*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, NULL);
1485*a1e26a70SApple OSS Distributions execute_test(&test);
1486*a1e26a70SApple OSS Distributions
1487*a1e26a70SApple OSS Distributions init_test(&test, "6.1.3: rename one file over another", FILE1, 2, 1, NOTE_RENAME, YES_EVENT);
1488*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1489*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE2, (void*)NULL);
1490*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
1491*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1492*a1e26a70SApple OSS Distributions execute_test(&test);
1493*a1e26a70SApple OSS Distributions
1494*a1e26a70SApple OSS Distributions init_test(&test, "6.1.4: rename one dir over another", DIR1, 2, 1, NOTE_RENAME, YES_EVENT);
1495*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1496*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1497*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)DIR2, (void*)NULL);
1498*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
1499*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, NULL);
1500*a1e26a70SApple OSS Distributions execute_test(&test);
1501*a1e26a70SApple OSS Distributions
1502*a1e26a70SApple OSS Distributions /* ========= NO EVENT SECTION =========== */
1503*a1e26a70SApple OSS Distributions
1504*a1e26a70SApple OSS Distributions init_test(&test, "6.2.1: unlink a file", FILE1, 1, 0, NOTE_RENAME, NO_EVENT);
1505*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1506*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 2, (void*)FILE1, NULL);
1507*a1e26a70SApple OSS Distributions execute_test(&test);
1508*a1e26a70SApple OSS Distributions
1509*a1e26a70SApple OSS Distributions init_test(&test, "6.2.2: rmdir a dir", DIR1, 1, 0, NOTE_RENAME, NO_EVENT);
1510*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1511*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RMDIR, 2, (void*)DIR1, NULL);
1512*a1e26a70SApple OSS Distributions execute_test(&test);
1513*a1e26a70SApple OSS Distributions
1514*a1e26a70SApple OSS Distributions init_test(&test, "6.2.3: link() to a file", FILE1, 1, 2, NOTE_RENAME, NO_EVENT);
1515*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1516*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, HARDLINK, 2, (void*)FILE1, (void*)FILE2);
1517*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1518*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[1], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1519*a1e26a70SApple OSS Distributions execute_test(&test);
1520*a1e26a70SApple OSS Distributions
1521*a1e26a70SApple OSS Distributions init_test(&test, "6.2.4: rename one file over another: watch deceased",
1522*a1e26a70SApple OSS Distributions FILE2, 2, 1, NOTE_RENAME, NO_EVENT);
1523*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1524*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, CREAT, 2, (void*)FILE2, (void*)NULL);
1525*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
1526*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1527*a1e26a70SApple OSS Distributions execute_test(&test);
1528*a1e26a70SApple OSS Distributions
1529*a1e26a70SApple OSS Distributions init_test(&test, "6.2.5: rename one dir over another: watch deceased",
1530*a1e26a70SApple OSS Distributions DIR2, 2, 1, NOTE_RENAME, NO_EVENT);
1531*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1532*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, MKDIR, 2, (void*)DIR2, (void*)NULL);
1533*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR2);
1534*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR2, NULL);
1535*a1e26a70SApple OSS Distributions execute_test(&test);
1536*a1e26a70SApple OSS Distributions
1537*a1e26a70SApple OSS Distributions init_test(&test, "6.2.6: rename a file to itself", FILE1, 1, 1, NOTE_RENAME, NO_EVENT);
1538*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1539*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE1);
1540*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1541*a1e26a70SApple OSS Distributions execute_test(&test);
1542*a1e26a70SApple OSS Distributions
1543*a1e26a70SApple OSS Distributions init_test(&test, "6.2.7: rename a dir to itself", DIR1, 1, 1, NOTE_RENAME, NO_EVENT);
1544*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKDIR, 2, (void*)DIR1, (void*)NULL);
1545*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)DIR1, (void*)DIR1);
1546*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, RMDIR, 2, (void*)DIR1, NULL);
1547*a1e26a70SApple OSS Distributions execute_test(&test);
1548*a1e26a70SApple OSS Distributions }
1549*a1e26a70SApple OSS Distributions
1550*a1e26a70SApple OSS Distributions void
run_note_revoke_tests()1551*a1e26a70SApple OSS Distributions run_note_revoke_tests()
1552*a1e26a70SApple OSS Distributions {
1553*a1e26a70SApple OSS Distributions test_t test;
1554*a1e26a70SApple OSS Distributions init_test(&test, "7.1.1: revoke file", FILE1, 1, 1, NOTE_REVOKE, YES_EVENT);
1555*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1556*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, REVOKE, 1, (void*)FILE1);
1557*a1e26a70SApple OSS Distributions init_action(&(test.t_cleanup_actions[0]), NOSLEEP, UNLINK, 1, (void*)FILE1);
1558*a1e26a70SApple OSS Distributions execute_test(&test);
1559*a1e26a70SApple OSS Distributions
1560*a1e26a70SApple OSS Distributions init_test(&test, "7.2.1: delete file", FILE1, 1, 0, NOTE_REVOKE, NO_EVENT);
1561*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1562*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 1, (void*)FILE1);
1563*a1e26a70SApple OSS Distributions execute_test(&test);
1564*a1e26a70SApple OSS Distributions }
1565*a1e26a70SApple OSS Distributions
1566*a1e26a70SApple OSS Distributions
1567*a1e26a70SApple OSS Distributions void
run_evfilt_read_tests()1568*a1e26a70SApple OSS Distributions run_evfilt_read_tests()
1569*a1e26a70SApple OSS Distributions {
1570*a1e26a70SApple OSS Distributions test_t test;
1571*a1e26a70SApple OSS Distributions init_test(&test, "8.1.1: how much data in file of length LENGTHEN_SIZE?", FILE1, 2, 1, EVFILT_READ, LENGTHEN_SIZE);
1572*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void*)NULL);
1573*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, LENGTHEN, 2, (void*)FILE1, (void*)NULL);
1574*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1575*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1576*a1e26a70SApple OSS Distributions execute_test(&test);
1577*a1e26a70SApple OSS Distributions
1578*a1e26a70SApple OSS Distributions init_test(&test, "8.1.2: block, then write to file", FILE1, 2, 1, EVFILT_READ, strlen(TEST_STRING));
1579*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1580*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, TRUNC, 1, (void*)FILE1);
1581*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITE, 1, (void*)FILE1);
1582*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1583*a1e26a70SApple OSS Distributions execute_test(&test);
1584*a1e26a70SApple OSS Distributions
1585*a1e26a70SApple OSS Distributions init_test(&test, "8.1.3: block, then extend", FILE1, 2, 1, EVFILT_READ, LENGTHEN_SIZE);
1586*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1587*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, TRUNC, 1, (void*)FILE1);
1588*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, LENGTHEN, 1, (void*)FILE1);
1589*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1590*a1e26a70SApple OSS Distributions execute_test(&test);
1591*a1e26a70SApple OSS Distributions
1592*a1e26a70SApple OSS Distributions init_test(&test, "8.1.4: block, then seek to beginning", FILE1, 2, 1, EVFILT_READ, strlen(TEST_STRING));
1593*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1594*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, WRITE, 1, (void*)FILE1);
1595*a1e26a70SApple OSS Distributions test.t_read_to_end_first = 1; /* hack means that we've gotten to EOF before we block */
1596*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, LSEEK, 1, (void*)0);
1597*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1598*a1e26a70SApple OSS Distributions execute_test(&test);
1599*a1e26a70SApple OSS Distributions
1600*a1e26a70SApple OSS Distributions
1601*a1e26a70SApple OSS Distributions init_test(&test, "8.1.5: block, then write to fifo", FILE1, 1, 1, EVFILT_READ, strlen(TEST_STRING));
1602*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1);
1603*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1604*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITE, 1, (void*)FILE1);
1605*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1606*a1e26a70SApple OSS Distributions execute_test(&test);
1607*a1e26a70SApple OSS Distributions
1608*a1e26a70SApple OSS Distributions /* No result section... */
1609*a1e26a70SApple OSS Distributions init_test(&test, "8.2.1: just rename", FILE1, 2, 1, EVFILT_READ, NO_EVENT);
1610*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1611*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, TRUNC, 1, (void*)FILE1);
1612*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, RENAME, 2, (void*)FILE1, (void*)FILE2);
1613*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE2, NULL);
1614*a1e26a70SApple OSS Distributions execute_test(&test);
1615*a1e26a70SApple OSS Distributions
1616*a1e26a70SApple OSS Distributions init_test(&test, "8.2.2: delete file", FILE1, 2, 0, EVFILT_READ, NO_EVENT);
1617*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1618*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, TRUNC, 1, (void*)FILE1);
1619*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, UNLINK, 1, (void*)FILE1);
1620*a1e26a70SApple OSS Distributions execute_test(&test);
1621*a1e26a70SApple OSS Distributions
1622*a1e26a70SApple OSS Distributions init_test(&test, "8.2.3: write to beginning", FILE1, 2, 1, EVFILT_READ, NO_EVENT);
1623*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1624*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, WRITE, 1, (void*)FILE1);
1625*a1e26a70SApple OSS Distributions test.t_read_to_end_first = 1; /* hack means that we've gotten to EOF before we block */
1626*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, WRITE, 1, (void*)FILE1);
1627*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 1, (void*)FILE1);
1628*a1e26a70SApple OSS Distributions execute_test(&test);
1629*a1e26a70SApple OSS Distributions
1630*a1e26a70SApple OSS Distributions init_test(&test, "8.1.4: block, then seek to current location", FILE1, 2, 1, EVFILT_READ, 0);
1631*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1);
1632*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, WRITE, 1, (void*)FILE1);
1633*a1e26a70SApple OSS Distributions test.t_read_to_end_first = 1; /* hack means that we've gotten to EOF before we block */
1634*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, LSEEK, 1, (void*)strlen(TEST_STRING));
1635*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1636*a1e26a70SApple OSS Distributions execute_test(&test);
1637*a1e26a70SApple OSS Distributions
1638*a1e26a70SApple OSS Distributions init_test(&test, "8.2.5: trying to read from empty fifo", FILE1, 1, 1, EVFILT_READ, 0);
1639*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1);
1640*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1641*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 1, (void*)0);
1642*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1643*a1e26a70SApple OSS Distributions execute_test(&test);
1644*a1e26a70SApple OSS Distributions }
1645*a1e26a70SApple OSS Distributions
1646*a1e26a70SApple OSS Distributions
1647*a1e26a70SApple OSS Distributions
1648*a1e26a70SApple OSS Distributions void*
read_from_fd(void * arg)1649*a1e26a70SApple OSS Distributions read_from_fd(void *arg)
1650*a1e26a70SApple OSS Distributions {
1651*a1e26a70SApple OSS Distributions char buf[50];
1652*a1e26a70SApple OSS Distributions int fd = (int) arg;
1653*a1e26a70SApple OSS Distributions usleep(USLEEP_TIME);
1654*a1e26a70SApple OSS Distributions return (void*) read(fd, buf, sizeof(buf));
1655*a1e26a70SApple OSS Distributions }
1656*a1e26a70SApple OSS Distributions
1657*a1e26a70SApple OSS Distributions void*
write_to_fd(void * arg)1658*a1e26a70SApple OSS Distributions write_to_fd(void *arg)
1659*a1e26a70SApple OSS Distributions {
1660*a1e26a70SApple OSS Distributions char buf[50];
1661*a1e26a70SApple OSS Distributions int fd = (int) arg;
1662*a1e26a70SApple OSS Distributions usleep(USLEEP_TIME);
1663*a1e26a70SApple OSS Distributions return (void*) write(fd, buf, sizeof(buf));
1664*a1e26a70SApple OSS Distributions }
1665*a1e26a70SApple OSS Distributions
1666*a1e26a70SApple OSS Distributions /*
1667*a1e26a70SApple OSS Distributions * We don't (in principle) support EVFILT_WRITE for vnodes; thusly, no tests here
1668*a1e26a70SApple OSS Distributions */
1669*a1e26a70SApple OSS Distributions void
run_evfilt_write_tests()1670*a1e26a70SApple OSS Distributions run_evfilt_write_tests()
1671*a1e26a70SApple OSS Distributions {
1672*a1e26a70SApple OSS Distributions test_t test;
1673*a1e26a70SApple OSS Distributions init_test(&test, "9.1.1: how much space in empty fifo?", FILE1, 1, 1, EVFILT_WRITE, FIFO_SPACE);
1674*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1675*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1676*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1677*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1678*a1e26a70SApple OSS Distributions execute_test(&test);
1679*a1e26a70SApple OSS Distributions
1680*a1e26a70SApple OSS Distributions init_test(&test, "9.1.2: how much space in slightly written fifo?", FILE1, 1, 1, EVFILT_WRITE, FIFO_SPACE - strlen(TEST_STRING));
1681*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1682*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1683*a1e26a70SApple OSS Distributions test.t_write_some_data = 1;
1684*a1e26a70SApple OSS Distributions init_action(&(test.t_helpthreadact), NOSLEEP, NOTHING, 0);
1685*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1686*a1e26a70SApple OSS Distributions execute_test(&test);
1687*a1e26a70SApple OSS Distributions
1688*a1e26a70SApple OSS Distributions init_test(&test, "9.2.1: how much space in a full fifo?", FILE1, 1, 1, EVFILT_WRITE, 0);
1689*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1690*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1691*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1692*a1e26a70SApple OSS Distributions test.t_extra_sleep_hack = 1;
1693*a1e26a70SApple OSS Distributions init_action(&(test.t_helpthreadact), NOSLEEP, FILLFD, 1, (void*)FILE1, (void*)NULL);
1694*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1695*a1e26a70SApple OSS Distributions execute_test(&test);
1696*a1e26a70SApple OSS Distributions }
1697*a1e26a70SApple OSS Distributions
1698*a1e26a70SApple OSS Distributions void
run_poll_tests()1699*a1e26a70SApple OSS Distributions run_poll_tests()
1700*a1e26a70SApple OSS Distributions {
1701*a1e26a70SApple OSS Distributions test_t test;
1702*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.1.1: does poll say I can write a regular file?", FILE1, 1, 1, POLLWRNORM, 1);
1703*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1, (void*)NULL);
1704*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1705*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1706*a1e26a70SApple OSS Distributions execute_test(&test);
1707*a1e26a70SApple OSS Distributions
1708*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.1.2: does poll say I can write an empty FIFO?", FILE1, 1, 1, POLLWRNORM, 1);
1709*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1710*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1711*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1712*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1713*a1e26a70SApple OSS Distributions execute_test(&test);
1714*a1e26a70SApple OSS Distributions
1715*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.1.3: does poll say I can read a nonempty FIFO?", FILE1, 1, 1, POLLRDNORM, 1);
1716*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1717*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1718*a1e26a70SApple OSS Distributions test.t_write_some_data = 1;
1719*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1720*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1721*a1e26a70SApple OSS Distributions execute_test(&test);
1722*a1e26a70SApple OSS Distributions
1723*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.1.4: does poll say I can read a nonempty regular file?", FILE1, 2, 1, POLLRDNORM, 1);
1724*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1, (void*)NULL);
1725*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[1]), NOSLEEP, LENGTHEN, 1, (void*)FILE1, (void*)NULL);
1726*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1727*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1728*a1e26a70SApple OSS Distributions execute_test(&test);
1729*a1e26a70SApple OSS Distributions
1730*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.1.5: does poll say I can read an empty file?", FILE1, 1, 1, POLLRDNORM, 1);
1731*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 1, (void*)FILE1, (void*)NULL);
1732*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1733*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1734*a1e26a70SApple OSS Distributions execute_test(&test);
1735*a1e26a70SApple OSS Distributions
1736*a1e26a70SApple OSS Distributions
1737*a1e26a70SApple OSS Distributions
1738*a1e26a70SApple OSS Distributions
1739*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.2.2: does poll say I can read an empty FIFO?", FILE1, 1, 1, POLLRDNORM, 0);
1740*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1741*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1742*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, NOTHING, 0);
1743*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1744*a1e26a70SApple OSS Distributions execute_test(&test);
1745*a1e26a70SApple OSS Distributions
1746*a1e26a70SApple OSS Distributions init_poll_test(&test, "10.2.3: does poll say I can write a full FIFO?", FILE1, 1, 1, POLLWRNORM, 0);
1747*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, MKFIFO, 1, (void*)FILE1, (void*)NULL);
1748*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1749*a1e26a70SApple OSS Distributions test.t_file_is_fifo = 1;
1750*a1e26a70SApple OSS Distributions test.t_extra_sleep_hack = 1;
1751*a1e26a70SApple OSS Distributions init_action(&(test.t_helpthreadact), NOSLEEP, FILLFD, 1, (void*)FILE1, (void*)NULL);
1752*a1e26a70SApple OSS Distributions init_action(&test.t_cleanup_actions[0], NOSLEEP, UNLINK, 2, (void*)FILE1, NULL);
1753*a1e26a70SApple OSS Distributions test.t_known_failure = 1;
1754*a1e26a70SApple OSS Distributions execute_test(&test);
1755*a1e26a70SApple OSS Distributions }
1756*a1e26a70SApple OSS Distributions
1757*a1e26a70SApple OSS Distributions void
run_note_funlock_tests()1758*a1e26a70SApple OSS Distributions run_note_funlock_tests()
1759*a1e26a70SApple OSS Distributions {
1760*a1e26a70SApple OSS Distributions test_t test;
1761*a1e26a70SApple OSS Distributions init_test(&test, "11.1.1: unlock file", FILE1, 1, 1, NOTE_FUNLOCK, YES_EVENT);
1762*a1e26a70SApple OSS Distributions test.t_nondeterministic = 1;
1763*a1e26a70SApple OSS Distributions init_action(&(test.t_prep_actions[0]), NOSLEEP, CREAT, 2, (void*)FILE1, (void *)NULL);
1764*a1e26a70SApple OSS Distributions init_action(&test.t_helpthreadact, SLEEP, FUNLOCK, 2, (void*)FILE1, (void *)NULL);
1765*a1e26a70SApple OSS Distributions init_action(&(test.t_cleanup_actions[0]), NOSLEEP, UNLINK, 2, (void*)FILE1, (void *)NULL);
1766*a1e26a70SApple OSS Distributions execute_test(&test);
1767*a1e26a70SApple OSS Distributions }
1768*a1e26a70SApple OSS Distributions
1769*a1e26a70SApple OSS Distributions void
run_all_tests()1770*a1e26a70SApple OSS Distributions run_all_tests()
1771*a1e26a70SApple OSS Distributions {
1772*a1e26a70SApple OSS Distributions run_note_delete_tests();
1773*a1e26a70SApple OSS Distributions run_note_write_tests();
1774*a1e26a70SApple OSS Distributions run_note_extend_tests();
1775*a1e26a70SApple OSS Distributions run_note_attrib_tests();
1776*a1e26a70SApple OSS Distributions run_note_link_tests();
1777*a1e26a70SApple OSS Distributions run_note_rename_tests();
1778*a1e26a70SApple OSS Distributions #if 0
1779*a1e26a70SApple OSS Distributions run_note_revoke_tests(); /* Can no longer revoke a regular file--need an unmount test */
1780*a1e26a70SApple OSS Distributions #endif /* 0 */
1781*a1e26a70SApple OSS Distributions run_evfilt_read_tests();
1782*a1e26a70SApple OSS Distributions run_evfilt_write_tests();
1783*a1e26a70SApple OSS Distributions run_poll_tests();
1784*a1e26a70SApple OSS Distributions run_note_funlock_tests();
1785*a1e26a70SApple OSS Distributions }
1786*a1e26a70SApple OSS Distributions
1787*a1e26a70SApple OSS Distributions T_DECL(kqueue_file_tests,
1788*a1e26a70SApple OSS Distributions "Tests assorted kqueue operations for file-related events", T_META_TAG_VM_PREFERRED)
1789*a1e26a70SApple OSS Distributions {
1790*a1e26a70SApple OSS Distributions char *which = NULL;
1791*a1e26a70SApple OSS Distributions if (argc > 1) {
1792*a1e26a70SApple OSS Distributions which = argv[1];
1793*a1e26a70SApple OSS Distributions }
1794*a1e26a70SApple OSS Distributions
1795*a1e26a70SApple OSS Distributions T_SETUPBEGIN;
1796*a1e26a70SApple OSS Distributions rmdir(DIR1);
1797*a1e26a70SApple OSS Distributions rmdir(DIR2);
1798*a1e26a70SApple OSS Distributions T_SETUPEND;
1799*a1e26a70SApple OSS Distributions
1800*a1e26a70SApple OSS Distributions if ((!which) || (strcmp(which, "all") == 0)) {
1801*a1e26a70SApple OSS Distributions run_all_tests();
1802*a1e26a70SApple OSS Distributions } else if (strcmp(which, "delete") == 0) {
1803*a1e26a70SApple OSS Distributions run_note_delete_tests();
1804*a1e26a70SApple OSS Distributions } else if (strcmp(which, "write") == 0) {
1805*a1e26a70SApple OSS Distributions run_note_write_tests();
1806*a1e26a70SApple OSS Distributions } else if (strcmp(which, "extend") == 0) {
1807*a1e26a70SApple OSS Distributions run_note_extend_tests();
1808*a1e26a70SApple OSS Distributions } else if (strcmp(which, "attrib") == 0) {
1809*a1e26a70SApple OSS Distributions run_note_attrib_tests();
1810*a1e26a70SApple OSS Distributions } else if (strcmp(which, "link") == 0) {
1811*a1e26a70SApple OSS Distributions run_note_link_tests();
1812*a1e26a70SApple OSS Distributions } else if (strcmp(which, "rename") == 0) {
1813*a1e26a70SApple OSS Distributions run_note_rename_tests();
1814*a1e26a70SApple OSS Distributions } else if (strcmp(which, "revoke") == 0) {
1815*a1e26a70SApple OSS Distributions run_note_revoke_tests();
1816*a1e26a70SApple OSS Distributions } else if (strcmp(which, "evfiltread") == 0) {
1817*a1e26a70SApple OSS Distributions run_evfilt_read_tests();
1818*a1e26a70SApple OSS Distributions } else if (strcmp(which, "evfiltwrite") == 0) {
1819*a1e26a70SApple OSS Distributions run_evfilt_write_tests();
1820*a1e26a70SApple OSS Distributions } else if (strcmp(which, "poll") == 0) {
1821*a1e26a70SApple OSS Distributions run_poll_tests();
1822*a1e26a70SApple OSS Distributions } else if (strcmp(which, "funlock") == 0) {
1823*a1e26a70SApple OSS Distributions run_note_funlock_tests();
1824*a1e26a70SApple OSS Distributions } else {
1825*a1e26a70SApple OSS Distributions fprintf(stderr, "Valid options are:\n\tdelete, write, extend, "
1826*a1e26a70SApple OSS Distributions "attrib, link, rename, revoke, evfiltread, "
1827*a1e26a70SApple OSS Distributions "fifo, all, evfiltwrite, funlock<none>\n");
1828*a1e26a70SApple OSS Distributions exit(1);
1829*a1e26a70SApple OSS Distributions }
1830*a1e26a70SApple OSS Distributions }
1831