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 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 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 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 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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); 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 } 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 } 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 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