summaryrefslogtreecommitdiffstats
path: root/contrib/netbsd-tests/kernel/kqueue
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2017-02-23 06:28:41 -0300
committerRenato Botelho <renato@netgate.com>2017-02-23 06:28:41 -0300
commit82ceeb2ea625cd9bff60f2863b9a0830f55b7905 (patch)
tree263ca9347bf664a4489743f9302e699ce14de1df /contrib/netbsd-tests/kernel/kqueue
parent4a05f5440acda223e6a0ec5157bc32ecc0f09ff9 (diff)
parentd20dd8b36e7a565be7bfbb22aade51c8ffd753e9 (diff)
downloadFreeBSD-src-82ceeb2ea625cd9bff60f2863b9a0830f55b7905.zip
FreeBSD-src-82ceeb2ea625cd9bff60f2863b9a0830f55b7905.tar.gz
Merge remote-tracking branch 'origin/stable/10' into develdevel
Diffstat (limited to 'contrib/netbsd-tests/kernel/kqueue')
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/read/t_fifo.c4
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/read/t_file.c4
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/read/t_pipe.c4
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/read/t_ttypty.c4
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/t_ioctl.c7
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/t_proc1.c13
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/t_proc2.c10
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/t_proc3.c9
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/t_sig.c17
-rw-r--r--contrib/netbsd-tests/kernel/kqueue/t_vnode.c536
10 files changed, 595 insertions, 13 deletions
diff --git a/contrib/netbsd-tests/kernel/kqueue/read/t_fifo.c b/contrib/netbsd-tests/kernel/kqueue/read/t_fifo.c
index 5908547..19c7b02 100644
--- a/contrib/netbsd-tests/kernel/kqueue/read/t_fifo.c
+++ b/contrib/netbsd-tests/kernel/kqueue/read/t_fifo.c
@@ -78,7 +78,11 @@ ATF_TC_BODY(fifo, tc)
RL(n = kevent(kq, NULL, 0, event, 1, NULL));
(void)printf("kevent num %d filt %d flags: %#x, fflags: %#x, "
+#ifdef __FreeBSD__
+ "data: %" PRIdPTR "\n", n, event[0].filter, event[0].flags,
+#else
"data: %" PRId64 "\n", n, event[0].filter, event[0].flags,
+#endif
event[0].fflags, event[0].data);
ATF_REQUIRE_EQ(event[0].filter, EVFILT_READ);
diff --git a/contrib/netbsd-tests/kernel/kqueue/read/t_file.c b/contrib/netbsd-tests/kernel/kqueue/read/t_file.c
index 2335172..80479af 100644
--- a/contrib/netbsd-tests/kernel/kqueue/read/t_file.c
+++ b/contrib/netbsd-tests/kernel/kqueue/read/t_file.c
@@ -111,7 +111,11 @@ ATF_TC_BODY(file, tc)
num += n;
(void)printf("kevent num %d flags: %#x, fflags: %#x, data: "
+#ifdef __FreeBSD__
+ "%" PRIdPTR "\n", n, event[0].flags, event[0].fflags,
+#else
"%" PRId64 "\n", n, event[0].flags, event[0].fflags,
+#endif
event[0].data);
if (event[0].data < 0)
diff --git a/contrib/netbsd-tests/kernel/kqueue/read/t_pipe.c b/contrib/netbsd-tests/kernel/kqueue/read/t_pipe.c
index d8e05f2..2cdd015 100644
--- a/contrib/netbsd-tests/kernel/kqueue/read/t_pipe.c
+++ b/contrib/netbsd-tests/kernel/kqueue/read/t_pipe.c
@@ -67,7 +67,11 @@ ATF_TC_BODY(pipe, tc)
RL(n = kevent(kq, NULL, 0, event, 1, NULL));
(void)printf("kevent num %d flags: %#x, fflags: %#x, data: "
+#ifdef __FreeBSD__
+ "%" PRIdPTR "\n", n, event[0].flags, event[0].fflags, event[0].data);
+#else
"%" PRId64 "\n", n, event[0].flags, event[0].fflags, event[0].data);
+#endif
RL(n = read(fds[0], buffer, event[0].data));
buffer[n] = '\0';
diff --git a/contrib/netbsd-tests/kernel/kqueue/read/t_ttypty.c b/contrib/netbsd-tests/kernel/kqueue/read/t_ttypty.c
index 3a42fd3..57ccf92 100644
--- a/contrib/netbsd-tests/kernel/kqueue/read/t_ttypty.c
+++ b/contrib/netbsd-tests/kernel/kqueue/read/t_ttypty.c
@@ -103,7 +103,11 @@ h_check(bool check_master)
RL(n = kevent(kq, NULL, 0, event, 1, NULL));
(void)printf("kevent num %d filt %d flags: %#x, fflags: %#x, "
+#ifdef __FreeBSD__
+ "data: %" PRIdPTR "\n", n, event[0].filter, event[0].flags,
+#else
"data: %" PRId64 "\n", n, event[0].filter, event[0].flags,
+#endif
event[0].fflags, event[0].data);
ATF_REQUIRE_EQ(event[0].filter, EVFILT_READ);
diff --git a/contrib/netbsd-tests/kernel/kqueue/t_ioctl.c b/contrib/netbsd-tests/kernel/kqueue/t_ioctl.c
index 8ed5a79..d996fdf 100644
--- a/contrib/netbsd-tests/kernel/kqueue/t_ioctl.c
+++ b/contrib/netbsd-tests/kernel/kqueue/t_ioctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ioctl.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $ */
+/* $NetBSD: t_ioctl.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_ioctl.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $");
+__RCSID("$NetBSD: t_ioctl.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
#include <sys/event.h>
#include <sys/ioctl.h>
@@ -53,7 +53,8 @@ ATF_TC_BODY(kfilter_byfilter, tc)
{
char buf[32];
struct kfilter_mapping km;
- int i, kq;
+ int kq;
+ uint32_t i;
RL(kq = kqueue());
diff --git a/contrib/netbsd-tests/kernel/kqueue/t_proc1.c b/contrib/netbsd-tests/kernel/kqueue/t_proc1.c
index e755309..aa806ba 100644
--- a/contrib/netbsd-tests/kernel/kqueue/t_proc1.c
+++ b/contrib/netbsd-tests/kernel/kqueue/t_proc1.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_proc1.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $ */
+/* $NetBSD: t_proc1.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_proc1.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $");
+__RCSID("$NetBSD: t_proc1.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
/*
* this also used to trigger problem fixed in
@@ -99,7 +99,8 @@ ATF_TC_BODY(proc1, tc)
{
struct kevent event[1];
pid_t pid;
- int kq, want, status;
+ int kq, status;
+ u_int want;
RL(kq = kqueue());
@@ -112,7 +113,7 @@ ATF_TC_BODY(proc1, tc)
(void)sleep(1); /* give child some time to come up */
- event[0].ident = pid;
+ event[0].ident = (uintptr_t)pid;
event[0].filter = EVFILT_PROC;
event[0].flags = EV_ADD | EV_ENABLE;
event[0].fflags = NOTE_EXIT | NOTE_FORK | NOTE_EXEC; /* | NOTE_TRACK;*/
@@ -138,7 +139,11 @@ ATF_TC_BODY(proc1, tc)
printf(" NOTE_FORK");
}
if (event[0].fflags & NOTE_CHILD)
+#ifdef __FreeBSD__
+ printf(" NOTE_CHILD, parent = %" PRIdPTR, event[0].data);
+#else
printf(" NOTE_CHILD, parent = %" PRId64, event[0].data);
+#endif
printf("\n");
}
diff --git a/contrib/netbsd-tests/kernel/kqueue/t_proc2.c b/contrib/netbsd-tests/kernel/kqueue/t_proc2.c
index 54769d6..2d8d7f7 100644
--- a/contrib/netbsd-tests/kernel/kqueue/t_proc2.c
+++ b/contrib/netbsd-tests/kernel/kqueue/t_proc2.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_proc2.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $ */
+/* $NetBSD: t_proc2.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -32,8 +32,11 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_proc2.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $");
+__RCSID("$NetBSD: t_proc2.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#endif
#include <sys/event.h>
#include <sys/time.h>
#include <sys/types.h>
@@ -106,7 +109,8 @@ ATF_TC_BODY(proc2, tc)
/* NOTREACHED */
}
- EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_FORK|NOTE_TRACK, 0, 0);
+ EV_SET(&ke, (uintptr_t)pid, EVFILT_PROC, EV_ADD, NOTE_FORK|NOTE_TRACK,
+ 0, 0);
RL(kevent(kq, &ke, 1, NULL, 0, &timeout));
diff --git a/contrib/netbsd-tests/kernel/kqueue/t_proc3.c b/contrib/netbsd-tests/kernel/kqueue/t_proc3.c
index 3cb9ae5..eac2f9c 100644
--- a/contrib/netbsd-tests/kernel/kqueue/t_proc3.c
+++ b/contrib/netbsd-tests/kernel/kqueue/t_proc3.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_proc3.c,v 1.1 2012/11/17 21:55:24 joerg Exp $ */
+/* $NetBSD: t_proc3.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,8 +30,11 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_proc3.c,v 1.1 2012/11/17 21:55:24 joerg Exp $");
+__RCSID("$NetBSD: t_proc3.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#endif
#include <sys/event.h>
#include <sys/time.h>
#include <sys/types.h>
@@ -63,7 +66,7 @@ ATF_TC_BODY(proc3, tc)
RL(kq = kqueue());
- EV_SET(&ke, getpid(), EVFILT_PROC, EV_ADD, NOTE_TRACK, 0, 0);
+ EV_SET(&ke, (uintptr_t)getpid(), EVFILT_PROC, EV_ADD, NOTE_TRACK, 0, 0);
RL(kevent(kq, &ke, 1, NULL, 0, NULL));
diff --git a/contrib/netbsd-tests/kernel/kqueue/t_sig.c b/contrib/netbsd-tests/kernel/kqueue/t_sig.c
index 4fc0758..ebbd76e 100644
--- a/contrib/netbsd-tests/kernel/kqueue/t_sig.c
+++ b/contrib/netbsd-tests/kernel/kqueue/t_sig.c
@@ -34,6 +34,9 @@ __COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
__RCSID("$NetBSD: t_sig.c,v 1.2 2010/11/03 16:10:20 christos Exp $");
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#endif
#include <sys/event.h>
#include <sys/ioctl.h>
#include <sys/param.h>
@@ -60,9 +63,13 @@ ATF_TC_HEAD(sig, tc)
ATF_TC_BODY(sig, tc)
{
struct timespec timeout;
+#ifdef __NetBSD__
struct kfilter_mapping km;
+#endif
struct kevent event[1];
+#ifdef __NetBSD__
char namebuf[32];
+#endif
pid_t pid, child;
int kq, n, num, status;
@@ -84,16 +91,22 @@ ATF_TC_BODY(sig, tc)
RL(kq = kqueue());
+#ifdef __NetBSD__
(void)strlcpy(namebuf, "EVFILT_SIGNAL", sizeof(namebuf));
km.name = namebuf;
RL(ioctl(kq, KFILTER_BYNAME, &km));
(void)printf("got %d as filter number for `%s'.\n", km.filter, km.name);
+#endif
/* ignore the signal to avoid taking it for real */
REQUIRE_LIBC(signal(SIGUSR1, SIG_IGN), SIG_ERR);
event[0].ident = SIGUSR1;
+#ifdef __NetBSD__
event[0].filter = km.filter;
+#else
+ event[0].filter = EVFILT_SIGNAL;
+#endif
event[0].flags = EV_ADD | EV_ENABLE;
RL(kevent(kq, event, 1, NULL, 0, NULL));
@@ -117,7 +130,11 @@ ATF_TC_BODY(sig, tc)
if (n == 0)
continue;
+#ifdef __FreeBSD__
+ (void)printf("sig: kevent flags: 0x%x, data: %" PRIdPTR " (# "
+#else
(void)printf("sig: kevent flags: 0x%x, data: %" PRId64 " (# "
+#endif
"times signal posted)\n", event[0].flags, event[0].data);
}
diff --git a/contrib/netbsd-tests/kernel/kqueue/t_vnode.c b/contrib/netbsd-tests/kernel/kqueue/t_vnode.c
new file mode 100644
index 0000000..06ef683
--- /dev/null
+++ b/contrib/netbsd-tests/kernel/kqueue/t_vnode.c
@@ -0,0 +1,536 @@
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#endif
+#include <sys/event.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <atf-c.h>
+
+/*
+ * Test cases for events triggered by manipulating a target directory
+ * content. Using EVFILT_VNODE filter on the target directory descriptor.
+ *
+ */
+
+static const char *dir_target = "foo";
+static const char *dir_inside1 = "foo/bar1";
+static const char *dir_inside2 = "foo/bar2";
+static const char *dir_outside = "bar";
+static const char *file_inside1 = "foo/baz1";
+static const char *file_inside2 = "foo/baz2";
+static const char *file_outside = "qux";
+static const struct timespec ts = {0, 0};
+static int kq = -1;
+static int target = -1;
+
+int init_target(void);
+int init_kqueue(void);
+int create_file(const char *);
+void cleanup(void);
+
+int
+init_target(void)
+{
+ if (mkdir(dir_target, S_IRWXU) < 0) {
+ return -1;
+ }
+ target = open(dir_target, O_RDONLY, 0);
+ return target;
+}
+
+int
+init_kqueue(void)
+{
+ struct kevent eventlist[1];
+
+ kq = kqueue();
+ if (kq < 0) {
+ return -1;
+ }
+ EV_SET(&eventlist[0], (uintptr_t)target, EVFILT_VNODE,
+ EV_ADD | EV_ONESHOT, NOTE_DELETE |
+ NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB |
+ NOTE_LINK | NOTE_RENAME | NOTE_REVOKE, 0, 0);
+ return kevent(kq, eventlist, 1, NULL, 0, NULL);
+}
+
+int
+create_file(const char *file)
+{
+ int fd;
+
+ fd = open(file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ return -1;
+ }
+ return close(fd);
+}
+
+void
+cleanup(void)
+{
+ (void)unlink(file_inside1);
+ (void)unlink(file_inside2);
+ (void)unlink(file_outside);
+ (void)rmdir(dir_inside1);
+ (void)rmdir(dir_inside2);
+ (void)rmdir(dir_outside);
+ (void)rmdir(dir_target);
+ (void)close(kq);
+ (void)close(target);
+}
+
+ATF_TC_WITH_CLEANUP(dir_no_note_link_create_file_in);
+ATF_TC_HEAD(dir_no_note_link_create_file_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) does not return NOTE_LINK for the directory "
+ "'foo' if a file 'foo/baz' is created.");
+}
+ATF_TC_BODY(dir_no_note_link_create_file_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
+}
+ATF_TC_CLEANUP(dir_no_note_link_create_file_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_no_note_link_delete_file_in);
+ATF_TC_HEAD(dir_no_note_link_delete_file_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) does not return NOTE_LINK for the directory "
+ "'foo' if a file 'foo/baz' is deleted.");
+}
+ATF_TC_BODY(dir_no_note_link_delete_file_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(unlink(file_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
+}
+ATF_TC_CLEANUP(dir_no_note_link_delete_file_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_no_note_link_mv_dir_within);
+ATF_TC_HEAD(dir_no_note_link_mv_dir_within, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) does not return NOTE_LINK for the directory "
+ "'foo' if a directory 'foo/bar' is renamed to 'foo/baz'.");
+}
+ATF_TC_BODY(dir_no_note_link_mv_dir_within, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(dir_inside1, dir_inside2) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
+}
+ATF_TC_CLEANUP(dir_no_note_link_mv_dir_within, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_no_note_link_mv_file_within);
+ATF_TC_HEAD(dir_no_note_link_mv_file_within, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) does not return NOTE_LINK for the directory "
+ "'foo' if a file 'foo/baz' is renamed to 'foo/qux'.");
+}
+ATF_TC_BODY(dir_no_note_link_mv_file_within, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(file_inside1, file_inside2) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
+}
+ATF_TC_CLEANUP(dir_no_note_link_mv_file_within, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_link_create_dir_in);
+ATF_TC_HEAD(dir_note_link_create_dir_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_LINK for the directory "
+ "'foo' if a directory 'foo/bar' is created.");
+}
+ATF_TC_BODY(dir_note_link_create_dir_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
+}
+ATF_TC_CLEANUP(dir_note_link_create_dir_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_link_delete_dir_in);
+ATF_TC_HEAD(dir_note_link_delete_dir_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_LINK for the directory "
+ "'foo' if a directory 'foo/bar' is deleted.");
+}
+ATF_TC_BODY(dir_note_link_delete_dir_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rmdir(dir_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
+}
+ATF_TC_CLEANUP(dir_note_link_delete_dir_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_link_mv_dir_in);
+ATF_TC_HEAD(dir_note_link_mv_dir_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_LINK for the directory "
+ "'foo' if a directory 'bar' is renamed to 'foo/bar'.");
+}
+ATF_TC_BODY(dir_note_link_mv_dir_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_outside, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(dir_outside, dir_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
+}
+ATF_TC_CLEANUP(dir_note_link_mv_dir_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_link_mv_dir_out);
+ATF_TC_HEAD(dir_note_link_mv_dir_out, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_LINK for the directory "
+ "'foo' if a directory 'foo/bar' is renamed to 'bar'.");
+}
+ATF_TC_BODY(dir_note_link_mv_dir_out, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(dir_inside1, dir_outside) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
+}
+ATF_TC_CLEANUP(dir_note_link_mv_dir_out, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_create_dir_in);
+ATF_TC_HEAD(dir_note_write_create_dir_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a directory 'foo/bar' is created.");
+}
+ATF_TC_BODY(dir_note_write_create_dir_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_create_dir_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_create_file_in);
+ATF_TC_HEAD(dir_note_write_create_file_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a file 'foo/baz' is created.");
+}
+ATF_TC_BODY(dir_note_write_create_file_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_create_file_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_delete_dir_in);
+ATF_TC_HEAD(dir_note_write_delete_dir_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a directory 'foo/bar' is deleted.");
+}
+ATF_TC_BODY(dir_note_write_delete_dir_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rmdir(dir_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_delete_dir_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_delete_file_in);
+ATF_TC_HEAD(dir_note_write_delete_file_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a file 'foo/baz' is deleted.");
+}
+ATF_TC_BODY(dir_note_write_delete_file_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(unlink(file_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_delete_file_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_in);
+ATF_TC_HEAD(dir_note_write_mv_dir_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a directory 'bar' is renamed to 'foo/bar'.");
+}
+ATF_TC_BODY(dir_note_write_mv_dir_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_outside, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(dir_outside, dir_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_mv_dir_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_out);
+ATF_TC_HEAD(dir_note_write_mv_dir_out, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a directory 'foo/bar' is renamed to 'bar'.");
+}
+ATF_TC_BODY(dir_note_write_mv_dir_out, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(dir_inside1, dir_outside) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_mv_dir_out, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_within);
+ATF_TC_HEAD(dir_note_write_mv_dir_within, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a directory 'foo/bar' is renamed to 'foo/baz'.");
+}
+ATF_TC_BODY(dir_note_write_mv_dir_within, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(dir_inside1, dir_inside2) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_mv_dir_within, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_in);
+ATF_TC_HEAD(dir_note_write_mv_file_in, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a file 'qux' is renamed to 'foo/baz'.");
+}
+ATF_TC_BODY(dir_note_write_mv_file_in, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(create_file(file_outside) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(file_outside, file_inside1) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_mv_file_in, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_out);
+ATF_TC_HEAD(dir_note_write_mv_file_out, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a file 'foo/baz' is renamed to 'qux'.");
+}
+ATF_TC_BODY(dir_note_write_mv_file_out, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(file_inside1, file_outside) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_mv_file_out, tc)
+{
+ cleanup();
+}
+
+ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_within);
+ATF_TC_HEAD(dir_note_write_mv_file_within, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "This test case ensures "
+ "that kevent(2) returns NOTE_WRITE for the directory "
+ "'foo' if a file 'foo/baz' is renamed to 'foo/qux'.");
+}
+ATF_TC_BODY(dir_note_write_mv_file_within, tc)
+{
+ struct kevent changelist[1];
+
+ ATF_REQUIRE(init_target() != -1);
+ ATF_REQUIRE(create_file(file_inside1) != -1);
+ ATF_REQUIRE(init_kqueue() != -1);
+
+ ATF_REQUIRE(rename(file_inside1, file_inside2) != -1);
+ ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
+ ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
+}
+ATF_TC_CLEANUP(dir_note_write_mv_file_within, tc)
+{
+ cleanup();
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+ ATF_TP_ADD_TC(tp, dir_no_note_link_create_file_in);
+ ATF_TP_ADD_TC(tp, dir_no_note_link_delete_file_in);
+ ATF_TP_ADD_TC(tp, dir_no_note_link_mv_dir_within);
+ ATF_TP_ADD_TC(tp, dir_no_note_link_mv_file_within);
+ ATF_TP_ADD_TC(tp, dir_note_link_create_dir_in);
+ ATF_TP_ADD_TC(tp, dir_note_link_delete_dir_in);
+ ATF_TP_ADD_TC(tp, dir_note_link_mv_dir_in);
+ ATF_TP_ADD_TC(tp, dir_note_link_mv_dir_out);
+ ATF_TP_ADD_TC(tp, dir_note_write_create_dir_in);
+ ATF_TP_ADD_TC(tp, dir_note_write_create_file_in);
+ ATF_TP_ADD_TC(tp, dir_note_write_delete_dir_in);
+ ATF_TP_ADD_TC(tp, dir_note_write_delete_file_in);
+ ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_in);
+ ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_out);
+ ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_within);
+ ATF_TP_ADD_TC(tp, dir_note_write_mv_file_in);
+ ATF_TP_ADD_TC(tp, dir_note_write_mv_file_out);
+ ATF_TP_ADD_TC(tp, dir_note_write_mv_file_within);
+ return atf_no_error();
+}
OpenPOWER on IntegriCloud