1*640235e2SEnji Cooper #include <sys/event.h>
2*640235e2SEnji Cooper #include <sys/stat.h>
3*640235e2SEnji Cooper #include <sys/time.h>
4*640235e2SEnji Cooper #include <fcntl.h>
5*640235e2SEnji Cooper #include <stdio.h>
6*640235e2SEnji Cooper #include <unistd.h>
7*640235e2SEnji Cooper
8*640235e2SEnji Cooper #include <atf-c.h>
9*640235e2SEnji Cooper
10*640235e2SEnji Cooper /*
11*640235e2SEnji Cooper * Test cases for events triggered by manipulating a target directory
12*640235e2SEnji Cooper * content. Using EVFILT_VNODE filter on the target directory descriptor.
13*640235e2SEnji Cooper *
14*640235e2SEnji Cooper */
15*640235e2SEnji Cooper
16*640235e2SEnji Cooper static const char *dir_target = "foo";
17*640235e2SEnji Cooper static const char *dir_inside1 = "foo/bar1";
18*640235e2SEnji Cooper static const char *dir_inside2 = "foo/bar2";
19*640235e2SEnji Cooper static const char *dir_outside = "bar";
20*640235e2SEnji Cooper static const char *file_inside1 = "foo/baz1";
21*640235e2SEnji Cooper static const char *file_inside2 = "foo/baz2";
22*640235e2SEnji Cooper static const char *file_outside = "qux";
23*640235e2SEnji Cooper static const struct timespec ts = {0, 0};
24*640235e2SEnji Cooper static int kq = -1;
25*640235e2SEnji Cooper static int target = -1;
26*640235e2SEnji Cooper
27*640235e2SEnji Cooper int init_target(void);
28*640235e2SEnji Cooper int init_kqueue(void);
29*640235e2SEnji Cooper int create_file(const char *);
30*640235e2SEnji Cooper void cleanup(void);
31*640235e2SEnji Cooper
32*640235e2SEnji Cooper int
init_target(void)33*640235e2SEnji Cooper init_target(void)
34*640235e2SEnji Cooper {
35*640235e2SEnji Cooper if (mkdir(dir_target, S_IRWXU) < 0) {
36*640235e2SEnji Cooper return -1;
37*640235e2SEnji Cooper }
38*640235e2SEnji Cooper target = open(dir_target, O_RDONLY, 0);
39*640235e2SEnji Cooper return target;
40*640235e2SEnji Cooper }
41*640235e2SEnji Cooper
42*640235e2SEnji Cooper int
init_kqueue(void)43*640235e2SEnji Cooper init_kqueue(void)
44*640235e2SEnji Cooper {
45*640235e2SEnji Cooper struct kevent eventlist[1];
46*640235e2SEnji Cooper
47*640235e2SEnji Cooper kq = kqueue();
48*640235e2SEnji Cooper if (kq < 0) {
49*640235e2SEnji Cooper return -1;
50*640235e2SEnji Cooper }
51*640235e2SEnji Cooper EV_SET(&eventlist[0], (uintptr_t)target, EVFILT_VNODE,
52*640235e2SEnji Cooper EV_ADD | EV_ONESHOT, NOTE_DELETE |
53*640235e2SEnji Cooper NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB |
54*640235e2SEnji Cooper NOTE_LINK | NOTE_RENAME | NOTE_REVOKE, 0, 0);
55*640235e2SEnji Cooper return kevent(kq, eventlist, 1, NULL, 0, NULL);
56*640235e2SEnji Cooper }
57*640235e2SEnji Cooper
58*640235e2SEnji Cooper int
create_file(const char * file)59*640235e2SEnji Cooper create_file(const char *file)
60*640235e2SEnji Cooper {
61*640235e2SEnji Cooper int fd;
62*640235e2SEnji Cooper
63*640235e2SEnji Cooper fd = open(file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
64*640235e2SEnji Cooper if (fd < 0) {
65*640235e2SEnji Cooper return -1;
66*640235e2SEnji Cooper }
67*640235e2SEnji Cooper return close(fd);
68*640235e2SEnji Cooper }
69*640235e2SEnji Cooper
70*640235e2SEnji Cooper void
cleanup(void)71*640235e2SEnji Cooper cleanup(void)
72*640235e2SEnji Cooper {
73*640235e2SEnji Cooper (void)unlink(file_inside1);
74*640235e2SEnji Cooper (void)unlink(file_inside2);
75*640235e2SEnji Cooper (void)unlink(file_outside);
76*640235e2SEnji Cooper (void)rmdir(dir_inside1);
77*640235e2SEnji Cooper (void)rmdir(dir_inside2);
78*640235e2SEnji Cooper (void)rmdir(dir_outside);
79*640235e2SEnji Cooper (void)rmdir(dir_target);
80*640235e2SEnji Cooper (void)close(kq);
81*640235e2SEnji Cooper (void)close(target);
82*640235e2SEnji Cooper }
83*640235e2SEnji Cooper
84*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_no_note_link_create_file_in);
ATF_TC_HEAD(dir_no_note_link_create_file_in,tc)85*640235e2SEnji Cooper ATF_TC_HEAD(dir_no_note_link_create_file_in, tc)
86*640235e2SEnji Cooper {
87*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
88*640235e2SEnji Cooper "that kevent(2) does not return NOTE_LINK for the directory "
89*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is created.");
90*640235e2SEnji Cooper }
ATF_TC_BODY(dir_no_note_link_create_file_in,tc)91*640235e2SEnji Cooper ATF_TC_BODY(dir_no_note_link_create_file_in, tc)
92*640235e2SEnji Cooper {
93*640235e2SEnji Cooper struct kevent changelist[1];
94*640235e2SEnji Cooper
95*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
96*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
97*640235e2SEnji Cooper
98*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
99*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
100*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
101*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_no_note_link_create_file_in,tc)102*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_no_note_link_create_file_in, tc)
103*640235e2SEnji Cooper {
104*640235e2SEnji Cooper cleanup();
105*640235e2SEnji Cooper }
106*640235e2SEnji Cooper
107*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_no_note_link_delete_file_in);
ATF_TC_HEAD(dir_no_note_link_delete_file_in,tc)108*640235e2SEnji Cooper ATF_TC_HEAD(dir_no_note_link_delete_file_in, tc)
109*640235e2SEnji Cooper {
110*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
111*640235e2SEnji Cooper "that kevent(2) does not return NOTE_LINK for the directory "
112*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is deleted.");
113*640235e2SEnji Cooper }
ATF_TC_BODY(dir_no_note_link_delete_file_in,tc)114*640235e2SEnji Cooper ATF_TC_BODY(dir_no_note_link_delete_file_in, tc)
115*640235e2SEnji Cooper {
116*640235e2SEnji Cooper struct kevent changelist[1];
117*640235e2SEnji Cooper
118*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
119*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
120*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
121*640235e2SEnji Cooper
122*640235e2SEnji Cooper ATF_REQUIRE(unlink(file_inside1) != -1);
123*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
124*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
125*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_no_note_link_delete_file_in,tc)126*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_no_note_link_delete_file_in, tc)
127*640235e2SEnji Cooper {
128*640235e2SEnji Cooper cleanup();
129*640235e2SEnji Cooper }
130*640235e2SEnji Cooper
131*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_no_note_link_mv_dir_within);
ATF_TC_HEAD(dir_no_note_link_mv_dir_within,tc)132*640235e2SEnji Cooper ATF_TC_HEAD(dir_no_note_link_mv_dir_within, tc)
133*640235e2SEnji Cooper {
134*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
135*640235e2SEnji Cooper "that kevent(2) does not return NOTE_LINK for the directory "
136*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is renamed to 'foo/baz'.");
137*640235e2SEnji Cooper }
ATF_TC_BODY(dir_no_note_link_mv_dir_within,tc)138*640235e2SEnji Cooper ATF_TC_BODY(dir_no_note_link_mv_dir_within, tc)
139*640235e2SEnji Cooper {
140*640235e2SEnji Cooper struct kevent changelist[1];
141*640235e2SEnji Cooper
142*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
143*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
144*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
145*640235e2SEnji Cooper
146*640235e2SEnji Cooper ATF_REQUIRE(rename(dir_inside1, dir_inside2) != -1);
147*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
148*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
149*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_no_note_link_mv_dir_within,tc)150*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_no_note_link_mv_dir_within, tc)
151*640235e2SEnji Cooper {
152*640235e2SEnji Cooper cleanup();
153*640235e2SEnji Cooper }
154*640235e2SEnji Cooper
155*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_no_note_link_mv_file_within);
ATF_TC_HEAD(dir_no_note_link_mv_file_within,tc)156*640235e2SEnji Cooper ATF_TC_HEAD(dir_no_note_link_mv_file_within, tc)
157*640235e2SEnji Cooper {
158*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
159*640235e2SEnji Cooper "that kevent(2) does not return NOTE_LINK for the directory "
160*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is renamed to 'foo/qux'.");
161*640235e2SEnji Cooper }
ATF_TC_BODY(dir_no_note_link_mv_file_within,tc)162*640235e2SEnji Cooper ATF_TC_BODY(dir_no_note_link_mv_file_within, tc)
163*640235e2SEnji Cooper {
164*640235e2SEnji Cooper struct kevent changelist[1];
165*640235e2SEnji Cooper
166*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
167*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
168*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
169*640235e2SEnji Cooper
170*640235e2SEnji Cooper ATF_REQUIRE(rename(file_inside1, file_inside2) != -1);
171*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
172*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
173*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_no_note_link_mv_file_within,tc)174*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_no_note_link_mv_file_within, tc)
175*640235e2SEnji Cooper {
176*640235e2SEnji Cooper cleanup();
177*640235e2SEnji Cooper }
178*640235e2SEnji Cooper
179*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_link_create_dir_in);
ATF_TC_HEAD(dir_note_link_create_dir_in,tc)180*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_link_create_dir_in, tc)
181*640235e2SEnji Cooper {
182*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
183*640235e2SEnji Cooper "that kevent(2) returns NOTE_LINK for the directory "
184*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is created.");
185*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_link_create_dir_in,tc)186*640235e2SEnji Cooper ATF_TC_BODY(dir_note_link_create_dir_in, tc)
187*640235e2SEnji Cooper {
188*640235e2SEnji Cooper struct kevent changelist[1];
189*640235e2SEnji Cooper
190*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
191*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
192*640235e2SEnji Cooper
193*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
194*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
195*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
196*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_link_create_dir_in,tc)197*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_link_create_dir_in, tc)
198*640235e2SEnji Cooper {
199*640235e2SEnji Cooper cleanup();
200*640235e2SEnji Cooper }
201*640235e2SEnji Cooper
202*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_link_delete_dir_in);
ATF_TC_HEAD(dir_note_link_delete_dir_in,tc)203*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_link_delete_dir_in, tc)
204*640235e2SEnji Cooper {
205*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
206*640235e2SEnji Cooper "that kevent(2) returns NOTE_LINK for the directory "
207*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is deleted.");
208*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_link_delete_dir_in,tc)209*640235e2SEnji Cooper ATF_TC_BODY(dir_note_link_delete_dir_in, tc)
210*640235e2SEnji Cooper {
211*640235e2SEnji Cooper struct kevent changelist[1];
212*640235e2SEnji Cooper
213*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
214*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
215*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
216*640235e2SEnji Cooper
217*640235e2SEnji Cooper ATF_REQUIRE(rmdir(dir_inside1) != -1);
218*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
219*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
220*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_link_delete_dir_in,tc)221*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_link_delete_dir_in, tc)
222*640235e2SEnji Cooper {
223*640235e2SEnji Cooper cleanup();
224*640235e2SEnji Cooper }
225*640235e2SEnji Cooper
226*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_link_mv_dir_in);
ATF_TC_HEAD(dir_note_link_mv_dir_in,tc)227*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_link_mv_dir_in, tc)
228*640235e2SEnji Cooper {
229*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
230*640235e2SEnji Cooper "that kevent(2) returns NOTE_LINK for the directory "
231*640235e2SEnji Cooper "'foo' if a directory 'bar' is renamed to 'foo/bar'.");
232*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_link_mv_dir_in,tc)233*640235e2SEnji Cooper ATF_TC_BODY(dir_note_link_mv_dir_in, tc)
234*640235e2SEnji Cooper {
235*640235e2SEnji Cooper struct kevent changelist[1];
236*640235e2SEnji Cooper
237*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
238*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_outside, S_IRWXU) != -1);
239*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
240*640235e2SEnji Cooper
241*640235e2SEnji Cooper ATF_REQUIRE(rename(dir_outside, dir_inside1) != -1);
242*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
243*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
244*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_link_mv_dir_in,tc)245*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_link_mv_dir_in, tc)
246*640235e2SEnji Cooper {
247*640235e2SEnji Cooper cleanup();
248*640235e2SEnji Cooper }
249*640235e2SEnji Cooper
250*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_link_mv_dir_out);
ATF_TC_HEAD(dir_note_link_mv_dir_out,tc)251*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_link_mv_dir_out, tc)
252*640235e2SEnji Cooper {
253*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
254*640235e2SEnji Cooper "that kevent(2) returns NOTE_LINK for the directory "
255*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is renamed to 'bar'.");
256*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_link_mv_dir_out,tc)257*640235e2SEnji Cooper ATF_TC_BODY(dir_note_link_mv_dir_out, tc)
258*640235e2SEnji Cooper {
259*640235e2SEnji Cooper struct kevent changelist[1];
260*640235e2SEnji Cooper
261*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
262*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
263*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
264*640235e2SEnji Cooper
265*640235e2SEnji Cooper ATF_REQUIRE(rename(dir_inside1, dir_outside) != -1);
266*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
267*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
268*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_link_mv_dir_out,tc)269*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_link_mv_dir_out, tc)
270*640235e2SEnji Cooper {
271*640235e2SEnji Cooper cleanup();
272*640235e2SEnji Cooper }
273*640235e2SEnji Cooper
274*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_create_dir_in);
ATF_TC_HEAD(dir_note_write_create_dir_in,tc)275*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_create_dir_in, tc)
276*640235e2SEnji Cooper {
277*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
278*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
279*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is created.");
280*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_create_dir_in,tc)281*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_create_dir_in, tc)
282*640235e2SEnji Cooper {
283*640235e2SEnji Cooper struct kevent changelist[1];
284*640235e2SEnji Cooper
285*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
286*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
287*640235e2SEnji Cooper
288*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
289*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
290*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
291*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_create_dir_in,tc)292*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_create_dir_in, tc)
293*640235e2SEnji Cooper {
294*640235e2SEnji Cooper cleanup();
295*640235e2SEnji Cooper }
296*640235e2SEnji Cooper
297*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_create_file_in);
ATF_TC_HEAD(dir_note_write_create_file_in,tc)298*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_create_file_in, tc)
299*640235e2SEnji Cooper {
300*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
301*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
302*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is created.");
303*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_create_file_in,tc)304*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_create_file_in, tc)
305*640235e2SEnji Cooper {
306*640235e2SEnji Cooper struct kevent changelist[1];
307*640235e2SEnji Cooper
308*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
309*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
310*640235e2SEnji Cooper
311*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
312*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
313*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
314*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_create_file_in,tc)315*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_create_file_in, tc)
316*640235e2SEnji Cooper {
317*640235e2SEnji Cooper cleanup();
318*640235e2SEnji Cooper }
319*640235e2SEnji Cooper
320*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_delete_dir_in);
ATF_TC_HEAD(dir_note_write_delete_dir_in,tc)321*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_delete_dir_in, tc)
322*640235e2SEnji Cooper {
323*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
324*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
325*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is deleted.");
326*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_delete_dir_in,tc)327*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_delete_dir_in, tc)
328*640235e2SEnji Cooper {
329*640235e2SEnji Cooper struct kevent changelist[1];
330*640235e2SEnji Cooper
331*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
332*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
333*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
334*640235e2SEnji Cooper
335*640235e2SEnji Cooper ATF_REQUIRE(rmdir(dir_inside1) != -1);
336*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
337*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
338*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_delete_dir_in,tc)339*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_delete_dir_in, tc)
340*640235e2SEnji Cooper {
341*640235e2SEnji Cooper cleanup();
342*640235e2SEnji Cooper }
343*640235e2SEnji Cooper
344*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_delete_file_in);
ATF_TC_HEAD(dir_note_write_delete_file_in,tc)345*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_delete_file_in, tc)
346*640235e2SEnji Cooper {
347*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
348*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
349*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is deleted.");
350*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_delete_file_in,tc)351*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_delete_file_in, tc)
352*640235e2SEnji Cooper {
353*640235e2SEnji Cooper struct kevent changelist[1];
354*640235e2SEnji Cooper
355*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
356*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
357*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
358*640235e2SEnji Cooper
359*640235e2SEnji Cooper ATF_REQUIRE(unlink(file_inside1) != -1);
360*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
361*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
362*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_delete_file_in,tc)363*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_delete_file_in, tc)
364*640235e2SEnji Cooper {
365*640235e2SEnji Cooper cleanup();
366*640235e2SEnji Cooper }
367*640235e2SEnji Cooper
368*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_in);
ATF_TC_HEAD(dir_note_write_mv_dir_in,tc)369*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_mv_dir_in, tc)
370*640235e2SEnji Cooper {
371*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
372*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
373*640235e2SEnji Cooper "'foo' if a directory 'bar' is renamed to 'foo/bar'.");
374*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_mv_dir_in,tc)375*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_mv_dir_in, tc)
376*640235e2SEnji Cooper {
377*640235e2SEnji Cooper struct kevent changelist[1];
378*640235e2SEnji Cooper
379*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
380*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_outside, S_IRWXU) != -1);
381*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
382*640235e2SEnji Cooper
383*640235e2SEnji Cooper ATF_REQUIRE(rename(dir_outside, dir_inside1) != -1);
384*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
385*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
386*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_mv_dir_in,tc)387*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_mv_dir_in, tc)
388*640235e2SEnji Cooper {
389*640235e2SEnji Cooper cleanup();
390*640235e2SEnji Cooper }
391*640235e2SEnji Cooper
392*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_out);
ATF_TC_HEAD(dir_note_write_mv_dir_out,tc)393*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_mv_dir_out, tc)
394*640235e2SEnji Cooper {
395*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
396*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
397*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is renamed to 'bar'.");
398*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_mv_dir_out,tc)399*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_mv_dir_out, tc)
400*640235e2SEnji Cooper {
401*640235e2SEnji Cooper struct kevent changelist[1];
402*640235e2SEnji Cooper
403*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
404*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
405*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
406*640235e2SEnji Cooper
407*640235e2SEnji Cooper ATF_REQUIRE(rename(dir_inside1, dir_outside) != -1);
408*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
409*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
410*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_mv_dir_out,tc)411*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_mv_dir_out, tc)
412*640235e2SEnji Cooper {
413*640235e2SEnji Cooper cleanup();
414*640235e2SEnji Cooper }
415*640235e2SEnji Cooper
416*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_within);
ATF_TC_HEAD(dir_note_write_mv_dir_within,tc)417*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_mv_dir_within, tc)
418*640235e2SEnji Cooper {
419*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
420*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
421*640235e2SEnji Cooper "'foo' if a directory 'foo/bar' is renamed to 'foo/baz'.");
422*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_mv_dir_within,tc)423*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_mv_dir_within, tc)
424*640235e2SEnji Cooper {
425*640235e2SEnji Cooper struct kevent changelist[1];
426*640235e2SEnji Cooper
427*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
428*640235e2SEnji Cooper ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
429*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
430*640235e2SEnji Cooper
431*640235e2SEnji Cooper ATF_REQUIRE(rename(dir_inside1, dir_inside2) != -1);
432*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
433*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
434*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_mv_dir_within,tc)435*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_mv_dir_within, tc)
436*640235e2SEnji Cooper {
437*640235e2SEnji Cooper cleanup();
438*640235e2SEnji Cooper }
439*640235e2SEnji Cooper
440*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_in);
ATF_TC_HEAD(dir_note_write_mv_file_in,tc)441*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_mv_file_in, tc)
442*640235e2SEnji Cooper {
443*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
444*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
445*640235e2SEnji Cooper "'foo' if a file 'qux' is renamed to 'foo/baz'.");
446*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_mv_file_in,tc)447*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_mv_file_in, tc)
448*640235e2SEnji Cooper {
449*640235e2SEnji Cooper struct kevent changelist[1];
450*640235e2SEnji Cooper
451*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
452*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_outside) != -1);
453*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
454*640235e2SEnji Cooper
455*640235e2SEnji Cooper ATF_REQUIRE(rename(file_outside, file_inside1) != -1);
456*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
457*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
458*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_mv_file_in,tc)459*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_mv_file_in, tc)
460*640235e2SEnji Cooper {
461*640235e2SEnji Cooper cleanup();
462*640235e2SEnji Cooper }
463*640235e2SEnji Cooper
464*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_out);
ATF_TC_HEAD(dir_note_write_mv_file_out,tc)465*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_mv_file_out, tc)
466*640235e2SEnji Cooper {
467*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
468*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
469*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is renamed to 'qux'.");
470*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_mv_file_out,tc)471*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_mv_file_out, tc)
472*640235e2SEnji Cooper {
473*640235e2SEnji Cooper struct kevent changelist[1];
474*640235e2SEnji Cooper
475*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
476*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
477*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
478*640235e2SEnji Cooper
479*640235e2SEnji Cooper ATF_REQUIRE(rename(file_inside1, file_outside) != -1);
480*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
481*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
482*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_mv_file_out,tc)483*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_mv_file_out, tc)
484*640235e2SEnji Cooper {
485*640235e2SEnji Cooper cleanup();
486*640235e2SEnji Cooper }
487*640235e2SEnji Cooper
488*640235e2SEnji Cooper ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_within);
ATF_TC_HEAD(dir_note_write_mv_file_within,tc)489*640235e2SEnji Cooper ATF_TC_HEAD(dir_note_write_mv_file_within, tc)
490*640235e2SEnji Cooper {
491*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "This test case ensures "
492*640235e2SEnji Cooper "that kevent(2) returns NOTE_WRITE for the directory "
493*640235e2SEnji Cooper "'foo' if a file 'foo/baz' is renamed to 'foo/qux'.");
494*640235e2SEnji Cooper }
ATF_TC_BODY(dir_note_write_mv_file_within,tc)495*640235e2SEnji Cooper ATF_TC_BODY(dir_note_write_mv_file_within, tc)
496*640235e2SEnji Cooper {
497*640235e2SEnji Cooper struct kevent changelist[1];
498*640235e2SEnji Cooper
499*640235e2SEnji Cooper ATF_REQUIRE(init_target() != -1);
500*640235e2SEnji Cooper ATF_REQUIRE(create_file(file_inside1) != -1);
501*640235e2SEnji Cooper ATF_REQUIRE(init_kqueue() != -1);
502*640235e2SEnji Cooper
503*640235e2SEnji Cooper ATF_REQUIRE(rename(file_inside1, file_inside2) != -1);
504*640235e2SEnji Cooper ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
505*640235e2SEnji Cooper ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
506*640235e2SEnji Cooper }
ATF_TC_CLEANUP(dir_note_write_mv_file_within,tc)507*640235e2SEnji Cooper ATF_TC_CLEANUP(dir_note_write_mv_file_within, tc)
508*640235e2SEnji Cooper {
509*640235e2SEnji Cooper cleanup();
510*640235e2SEnji Cooper }
511*640235e2SEnji Cooper
ATF_TP_ADD_TCS(tp)512*640235e2SEnji Cooper ATF_TP_ADD_TCS(tp)
513*640235e2SEnji Cooper {
514*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_no_note_link_create_file_in);
515*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_no_note_link_delete_file_in);
516*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_no_note_link_mv_dir_within);
517*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_no_note_link_mv_file_within);
518*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_link_create_dir_in);
519*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_link_delete_dir_in);
520*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_link_mv_dir_in);
521*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_link_mv_dir_out);
522*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_create_dir_in);
523*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_create_file_in);
524*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_delete_dir_in);
525*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_delete_file_in);
526*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_in);
527*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_out);
528*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_within);
529*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_mv_file_in);
530*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_mv_file_out);
531*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, dir_note_write_mv_file_within);
532*640235e2SEnji Cooper return atf_no_error();
533*640235e2SEnji Cooper }
534