git: 0c0146c30904 - main - tests/sendfile: test operation on unix/stream socket
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 03 May 2024 14:45:23 UTC
The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=0c0146c30904c1766695b141222542ea50608363 commit 0c0146c30904c1766695b141222542ea50608363 Author: Gleb Smirnoff <glebius@FreeBSD.org> AuthorDate: 2024-05-03 14:45:07 +0000 Commit: Gleb Smirnoff <glebius@FreeBSD.org> CommitDate: 2024-05-03 14:45:07 +0000 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 --- tests/sys/kern/sendfile_helper.c | 39 ++++++++++++++++++++++++++++++--------- tests/sys/kern/sendfile_test.sh | 24 ++++++++++++++++++++++++ 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()