aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2024-05-03 14:45:07 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2024-05-03 14:45:07 +0000
commit0c0146c30904c1766695b141222542ea50608363 (patch)
tree2c1bd3db4adc914d62b54be8cf43637e9dbe9221 /tests
parentc368d3f20fc015941a82d112600c3cac740d9c3e (diff)
downloadsrc-0c0146c30904c1766695b141222542ea50608363.tar.gz
src-0c0146c30904c1766695b141222542ea50608363.zip
tests/sendfile: test operation on unix/stream socket
Although there are already multiple tests in the tests collection that utilize sendfile(2) support over unix/stream socket, they all don't exercise the asynchronous part of the operation. This test framework, however, uses a trick to toggle true async operation and guarantee that pr_ready method of unix/stream is also tested. Reviewed by: chs Differential Revision: https://reviews.freebsd.org/D45055
Diffstat (limited to 'tests')
-rw-r--r--tests/sys/kern/sendfile_helper.c39
-rwxr-xr-xtests/sys/kern/sendfile_test.sh24
2 files changed, 54 insertions, 9 deletions
diff --git a/tests/sys/kern/sendfile_helper.c b/tests/sys/kern/sendfile_helper.c
index 6a3b4a1ac880..703b04fdea6c 100644
--- a/tests/sys/kern/sendfile_helper.c
+++ b/tests/sys/kern/sendfile_helper.c
@@ -121,26 +121,47 @@ receiver(void *arg)
return NULL;
}
+static void
+usage(void)
+{
+ errx(1, "usage: %s [-u] <file> <start> <len> <flags>", getprogname());
+}
+
int
main(int argc, char **argv)
{
pthread_t pt;
off_t start;
- int fd, ss[2], flags, error;
+ int ch, fd, ss[2], flags, error;
+ bool pf_unix = false;
+
+ while ((ch = getopt(argc, argv, "u")) != -1)
+ switch (ch) {
+ case 'u':
+ pf_unix = true;
+ break;
+ default:
+ usage();
+ }
+ argc -= optind;
+ argv += optind;
- if (argc != 5)
- errx(1, "usage: %s <file> <start> <len> <flags>",
- getprogname());
+ if (argc != 4)
+ usage();
- start = strtoull(argv[2], NULL, 0);
- readlen = strtoull(argv[3], NULL, 0);
- flags = strtoul(argv[4], NULL, 0);
+ start = strtoull(argv[1], NULL, 0);
+ readlen = strtoull(argv[2], NULL, 0);
+ flags = strtoul(argv[3], NULL, 0);
- fd = open(argv[1], O_RDONLY);
+ fd = open(argv[0], O_RDONLY);
if (fd < 0)
err(1, "open");
- tcp_socketpair(ss);
+ if (pf_unix) {
+ if (socketpair(PF_LOCAL, SOCK_STREAM, 0, ss) != 0)
+ err(1, "socketpair");
+ } else
+ tcp_socketpair(ss);
error = pthread_create(&pt, NULL, receiver, &ss[1]);
if (error)
diff --git a/tests/sys/kern/sendfile_test.sh b/tests/sys/kern/sendfile_test.sh
index 03d87292f3a3..7e549eec610a 100755
--- a/tests/sys/kern/sendfile_test.sh
+++ b/tests/sys/kern/sendfile_test.sh
@@ -112,12 +112,36 @@ io_fail_async_cleanup()
common_cleanup
}
+atf_test_case unix_success cleanup
+unix_success_head()
+{
+ atf_set "descr" "sendfile via unix(4) where all disk I/O succeeds"
+ atf_set "require.user" "root"
+ atf_set "timeout" 15
+}
+unix_success_body()
+{
+ if [ "$(atf_config_get qemu false)" = "true" ]; then
+ atf_skip "Sendfile(4) unimplemented. https://github.com/qemu-bsd-user/qemu-bsd-user/issues/25"
+ fi
+
+ alloc_md md
+ common_body_setup $md
+
+ atf_check $HELPER -u $FILE 0 0x10000 0x10000
+}
+unix_success_cleanup()
+{
+ common_cleanup
+}
+
atf_init_test_cases()
{
atf_add_test_case io_success
atf_add_test_case io_fail_sync
atf_add_test_case io_fail_async
+ atf_add_test_case unix_success
}
alloc_md()