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
+