From 3ace9636626a6adbc4bb9f94b0a74f3ea7d4c3e9 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 21 Mar 2024 17:50:09 +0100 Subject: [PATCH] virshtest: Adapt 'virsh-read-bufsiz' and 'virsh-read-non-seekable' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test both situations (reading from non-regular file and reading a file larger than (arbitrary) buffer size) via 'virshtest'. To feed the pipe we need to create a thread that does it, but otherwise it's fairly straightforward. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- tests/meson.build | 2 - tests/virsh-read-bufsiz | 49 --------------- tests/virsh-read-non-seekable | 51 --------------- tests/virshtest.c | 90 +++++++++++++++++++++++++++ tests/virshtestdata/read-big-pipe.out | 7 +++ 5 files changed, 97 insertions(+), 102 deletions(-) delete mode 100755 tests/virsh-read-bufsiz delete mode 100755 tests/virsh-read-non-seekable create mode 100644 tests/virshtestdata/read-big-pipe.out diff --git a/tests/meson.build b/tests/meson.build index 46e1679ad7..c760fe68d9 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -691,8 +691,6 @@ if conf.has('WITH_LIBVIRTD') 'libvirtd-fail', 'libvirtd-pool', 'virsh-auth', - 'virsh-read-bufsiz', - 'virsh-read-non-seekable', 'virsh-self-test', 'virsh-uriprecedence', 'virt-admin-self-test', diff --git a/tests/virsh-read-bufsiz b/tests/virsh-read-bufsiz deleted file mode 100755 index a61816c25b..0000000000 --- a/tests/virsh-read-bufsiz +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh -# ensure that reading a file larger than BUFSIZ works - -# Copyright (C) 2008, 2010 Red Hat, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -. "$(dirname $0)/test-lib.sh" - -if test "$VERBOSE" = yes; then - set -x - $abs_top_builddir/tools/virsh --version -fi - -fail=0 - -# Output a valid definition, to be used as input. -$abs_top_builddir/tools/virsh -c test:///default dumpxml 1 > xml.t || fail=1 - -# Change the VM name and UUID -sed -e "s|test|newtest|g" \ - -e "\|.*|d" \ - xml.t > xml - -for i in before after; do - # The largest BUFSIZ I've seen is 128K. This is slightly larger. - printf %132000s ' ' > sp || fail=1 - in=in-$i - # Append or prepend enough spaces to push the size over the limit: - ( test $i = before && cat sp xml || cat xml sp ) > $in || fail=1 - - $abs_top_builddir/tools/virsh --connect test:///default define $in > out || fail=1 - printf "Domain 'newtest' defined from $in\n\n" > exp || fail=1 - compare exp out || fail=1 -done - -(exit $fail); exit $fail diff --git a/tests/virsh-read-non-seekable b/tests/virsh-read-non-seekable deleted file mode 100755 index 0f7504c800..0000000000 --- a/tests/virsh-read-non-seekable +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# ensure that certain file-reading commands can handle non-seekable files - -# Copyright (C) 2008 Red Hat, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -. "$(dirname $0)/test-lib.sh" - -if test "$VERBOSE" = yes; then - set -x - $abs_top_builddir/tools/virsh --version -fi - -fail=0 - -cat <<\EOF > dom - - t2 - 004b96e1-2d78-c30f-5aa5-000000000000 - 8388608 - 2 - - xen - - restart - destroy - restart - -EOF - -$abs_top_builddir/tools/virsh -c test:///default define dom > /dev/null || fail=1 - -mkfifo_or_skip_ fifo -cat dom > fifo & - -$abs_top_builddir/tools/virsh -c test:///default define fifo > /dev/null || fail=1 - -(exit $fail); exit $fail diff --git a/tests/virshtest.c b/tests/virshtest.c index 3c345d5ac1..49e7268595 100644 --- a/tests/virshtest.c +++ b/tests/virshtest.c @@ -1,11 +1,14 @@ #include #include +#include #include "internal.h" #include "testutils.h" #include "vircommand.h" +#include "util/virthread.h" + #define VIR_FROM_THIS VIR_FROM_NONE #ifdef WIN32 @@ -103,6 +106,90 @@ static int testCompare(const void *data) } +static void +testPipeFeeder(void *opaque) +{ + /* feed more than observed buffer size which was historically 128k in the + * test this was adapted from */ + size_t emptyspace = 140 * 1024; + const char *pipepath = opaque; + const char *xml = + "\n" + " t2\n" + " 004b96e1-2d78-c30f-5aa5-000000000000\n" + " 8388608\n" + " 2\n" + " \n" + " xen\n" + " \n" + "\n"; + size_t xmlsize = strlen(xml); + g_autofree char *doc = g_new0(char, emptyspace + xmlsize + 1); + VIR_AUTOCLOSE fd = -1; + + if ((fd = open(pipepath, O_RDWR)) < 0) { + fprintf(stderr, "\nfailed to open pipe '%s': %s\n", pipepath, g_strerror(errno)); + return; + } + + memset(doc, ' ', emptyspace); + virStrcpy(doc + emptyspace, xml, xmlsize); + + if (safewrite(fd, doc, emptyspace + xmlsize + 1) < 0) { + fprintf(stderr, "\nfailed to write to pipe '%s': %s\n", pipepath, g_strerror(errno)); + return; + } +} + + +static int +testVirshPipe(const void *data G_GNUC_UNUSED) +{ + char tmpdir[] = "/tmp/libvirt_virshtest_XXXXXXX"; + g_autofree char *pipepath = NULL; + virThread feeder; + bool join = false; + g_autofree char *cmdstr = NULL; + const char *argv[] = { VIRSH_DEFAULT, NULL, NULL }; + int ret = -1; + + if (!g_mkdtemp(tmpdir)) { + fprintf(stderr, "\nfailed to create temporary directory\n"); + return -1; + } + + pipepath = g_strdup_printf("%s/pipe", tmpdir); + + + cmdstr = g_strdup_printf("define %s ; list --all", pipepath); + argv[3] = cmdstr; + + if (mkfifo(pipepath, 0600) < 0) { + fprintf(stderr, "\nfailed to create pipe '%s': %s\n", pipepath, g_strerror(errno)); + goto cleanup; + } + + if (virThreadCreate(&feeder, true, testPipeFeeder, pipepath) < 0) + goto cleanup; + + join = true; + + if (testCompareOutputLit(abs_srcdir "/virshtestdata/read-big-pipe.out", + "/tmp/libvirt_virshtest", argv) < 0) + goto cleanup; + + ret = 0; + + cleanup: + if (join) + virThreadJoin(&feeder); + unlink(pipepath); + rmdir(tmpdir); + + return ret; +} + + static int mymain(void) { @@ -238,6 +325,9 @@ mymain(void) "checkpoint-create test --redefine checkpoint-c2.xml ;" "checkpoint-info test c2"); + if (virTestRun("read-big-pipe", testVirshPipe, NULL) < 0) + ret = -1; + VIR_FREE(custom_uri); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/virshtestdata/read-big-pipe.out b/tests/virshtestdata/read-big-pipe.out new file mode 100644 index 0000000000..340432210d --- /dev/null +++ b/tests/virshtestdata/read-big-pipe.out @@ -0,0 +1,7 @@ +Domain 't2' defined from + + Id Name State +----------------------- + 1 test running + - t2 shut off +