diff --git a/tests/meson.build b/tests/meson.build
index 35e8bd53bb..687611a50e 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -701,7 +701,6 @@ if conf.has('WITH_LIBVIRTD')
'virsh-start',
'virsh-undefine',
'virsh-uriprecedence',
- 'virsh-vcpupin',
'virt-admin-self-test',
]
diff --git a/tests/virsh-vcpupin b/tests/virsh-vcpupin
deleted file mode 100755
index 306552a8f4..0000000000
--- a/tests/virsh-vcpupin
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/bin/sh
-# ensure that an invalid CPU spec elicits a diagnostic
-
-# 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
-
-# Invalid syntax.
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test a 0,1 > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: Numeric value 'a' for option is malformed or out of range
-
-EOF
-compare exp out || fail=1
-
-# An out-of-range vCPU number deserves a diagnostic, too.
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 0,1 > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: invalid argument: requested vcpu '100' is not present in the domain
-
-EOF
-compare exp out || fail=1
-
-# Negative number
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test -100 0,1 > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: Numeric value '-100' for option is malformed or out of range
-
-EOF
-compare exp out || fail=1
-
-# missing argument
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test --cpulist 0,1 > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: vcpupin: Missing vCPU number in pin mode.
-
-EOF
-compare exp out || fail=1
-
-# An out-of-range vCPU number when get information with live flag
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 --live > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: vcpu 100 is out of range of live cpu count 2
-
-EOF
-compare exp out || fail=1
-
-# An out-of-range vCPU number when get information without flag
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: vcpu 100 is out of range of live cpu count 2
-
-EOF
-compare exp out || fail=1
-
-# An out-of-range vCPU number when get information with config flag
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 --config > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: vcpu 100 is out of range of persistent cpu count 2
-
-EOF
-compare exp out || fail=1
-
-# An out-of-range vCPU number when get information with current flag
-$abs_top_builddir/tools/virsh --connect test:///default vcpupin test 100 --current > out 2>&1
-test $? = 1 || fail=1
-cat <<\EOF > exp || fail=1
-error: vcpu 100 is out of range of live cpu count 2
-
-EOF
-compare exp out || fail=1
-(exit $fail); exit $fail
diff --git a/tests/virshtest.c b/tests/virshtest.c
index 06d8d6f2cc..3d69d0f6eb 100644
--- a/tests/virshtest.c
+++ b/tests/virshtest.c
@@ -213,6 +213,7 @@ mymain(void)
* thus is marked expensive */
DO_TEST_SCRIPT_FULL("numeric-parsing-event", true, NULL, VIRSH_DEFAULT);
DO_TEST_SCRIPT("attach-disk", NULL, VIRSH_DEFAULT);
+ DO_TEST_SCRIPT("vcpupin", NULL, VIRSH_DEFAULT);
VIR_FREE(custom_uri);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
diff --git a/tests/virshtestdata/vcpupin.in b/tests/virshtestdata/vcpupin.in
new file mode 100755
index 0000000000..42e0e7f529
--- /dev/null
+++ b/tests/virshtestdata/vcpupin.in
@@ -0,0 +1,23 @@
+echo Invalid syntax.
+vcpupin test a 0,1
+
+echo An out-of-range vCPU number deserves a diagnostic, too.
+vcpupin test 100 0,1
+
+echo Negative number
+vcpupin test -100 0,1
+
+echo missing argument
+vcpupin test --cpulist 0,1
+
+echo An out-of-range vCPU number when get information with live flag
+vcpupin test 100 --live
+
+echo An out-of-range vCPU number when get information without flag
+vcpupin test 100
+
+echo An out-of-range vCPU number when get information with config flag
+vcpupin test 100 --config
+
+echo An out-of-range vCPU number when get information with current flag
+vcpupin test 100 --current
diff --git a/tests/virshtestdata/vcpupin.out b/tests/virshtestdata/vcpupin.out
new file mode 100644
index 0000000000..92fc14a697
--- /dev/null
+++ b/tests/virshtestdata/vcpupin.out
@@ -0,0 +1,26 @@
+Invalid syntax.
+error: Numeric value 'a' for option is malformed or out of range
+
+An out-of-range vCPU number deserves a diagnostic, too.
+error: invalid argument: requested vcpu '100' is not present in the domain
+
+Negative number
+error: Numeric value '-100' for option is malformed or out of range
+
+missing argument
+error: vcpupin: Missing vCPU number in pin mode.
+
+An out-of-range vCPU number when get information with live flag
+error: vcpu 100 is out of range of live cpu count 2
+
+An out-of-range vCPU number when get information without flag
+error: vcpu 100 is out of range of live cpu count 2
+
+An out-of-range vCPU number when get information with config flag
+error: vcpu 100 is out of range of persistent cpu count 2
+
+An out-of-range vCPU number when get information with current flag
+error: vcpu 100 is out of range of live cpu count 2
+
+
+## Exit code: 1