diff --git a/tests/meson.build b/tests/meson.build
index efbe99f55e..46e1679ad7 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -691,7 +691,6 @@ if conf.has('WITH_LIBVIRTD')
'libvirtd-fail',
'libvirtd-pool',
'virsh-auth',
- 'virsh-checkpoint',
'virsh-read-bufsiz',
'virsh-read-non-seekable',
'virsh-self-test',
diff --git a/tests/virsh-checkpoint b/tests/virsh-checkpoint
deleted file mode 100755
index 2492d29f53..0000000000
--- a/tests/virsh-checkpoint
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/bin/sh
-# simple testing of checkpoint APIs on test driver
-
-# Copyright (C) 2019 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"
-
-test_expensive
-
-if test "$VERBOSE" = yes; then
- set -x
- $abs_top_builddir/tools/virsh --version
-fi
-
-fail=0
-
-mock_xdg_ || framework_failure
-
-# The test driver loses states between restarts, so we perform a script
-# with some convenient markers for later post-processing of output.
-$abs_top_builddir/tools/virsh --connect test:///default >out 2>err '
- # Create a series of checkpoints, with names that intentionally sort
- # differently by topology than by name. For now, it is not possible
- # to create fanout without hacking through redefines.
- checkpoint-create-as test c1
- checkpoint-create-as test c1
- checkpoint-create-as test c3
- checkpoint-create-as test c2
- # snapshots cannot be created while checkpoints exist
- echo --err marker
- snapshot-create-as test s1
- echo --err marker
- # Checking tree view (siblings sorted alphabetically)
- checkpoint-list test --tree
- # Demonstrate list filtering
- checkpoint-list test --roots
- checkpoint-list test --leaves
- checkpoint-list test --parent --no-leaves
- checkpoint-list test --from c3
- checkpoint-list test --from c1 --descendants --name
- # Now the tree is linear, so we have an unambiguous topological order
- checkpoint-list test --name
- checkpoint-list test --name --topological
- # Capture some XML for later redefine
- checkpoint-delete test c1
- echo ""
- checkpoint-dumpxml test c3
- echo ""
- checkpoint-dumpxml test c2
- echo ""
- # Deleting current checkpoint moves current up to remaining parent
- checkpoint-delete test --children-only c3
- checkpoint-list test --leaves --name
- checkpoint-delete test --children c3
- checkpoint-list test --leaves --name
- # All done
-' || fail=1
-
-# First part is expected output, --tree results in trailing spaces,
-# and checkpoint-list produces timestamps
-sed 's/ *$//; s/[0-9-]\{10\} [0-9:.]* .[0-9]\{4\}/TIMESTAMP/;
- /MarkerA/,/MarkerC/d' < out > out.cooked || fail=1
-# Second part holds domain checkpoint XMLs
-sed -n '/MarkerA/,/MarkerB/p' < out > c3.xml || fail=1
-sed -n '/MarkerB/,/MarkerC/p' < out > c2.xml || fail=1
-
-cat <<\EOF > exp || fail=1
-Domain checkpoint c1 created
-
-Domain checkpoint c3 created
-Domain checkpoint c2 created
-
-
-
-c1
- |
- +- c3
- |
- +- c2
-
-
- Name Creation Time
------------------------------------
- c1 TIMESTAMP
-
- Name Creation Time
------------------------------------
- c2 TIMESTAMP
-
- Name Creation Time Parent
---------------------------------------------
- c1 TIMESTAMP
- c3 TIMESTAMP c1
-
- Name Creation Time
------------------------------------
- c2 TIMESTAMP
-
-c2
-c3
-
-c1
-c2
-c3
-
-c1
-c3
-c2
-
-Domain checkpoint c1 deleted
-
-Domain checkpoint c3 children deleted
-
-c3
-
-Domain checkpoint c3 deleted
-
-
-EOF
-compare exp out.cooked || fail=1
-
-cat < exp || fail=1
-error: operation failed: domain moment c1 already exists
-error: marker
-error: Operation not supported: cannot create snapshot while checkpoint exists
-error: marker
-EOF
-compare exp err || fail=1
-
-# Restore state with redefine
-$abs_top_builddir/tools/virsh -c test:///default >out 2>err '
- # Redefine must be in topological order; this will fail
- checkpoint-create test --redefine c2.xml
- echo --err marker
- # This is the right order
- checkpoint-create test --redefine c3.xml
- checkpoint-create test --redefine c2.xml
- checkpoint-list test --leaves --name
- checkpoint-info test c2
-' || fail=1
-
-cat <<\EOF > exp || fail=1
-
-
-Domain checkpoint c3 created from 'c3.xml'
-Domain checkpoint c2 created from 'c2.xml'
-c2
-
-Name: c2
-Domain: test
-Parent: c3
-Children: 0
-Descendants: 0
-
-EOF
-compare exp out || fail=1
-
-cat < exp || fail=1
-error: invalid argument: parent c3 for moment c2 not found
-error: marker
-EOF
-compare exp err || fail=1
-
-(exit $fail); exit $fail
diff --git a/tests/virshtest.c b/tests/virshtest.c
index 0250535119..3c345d5ac1 100644
--- a/tests/virshtest.c
+++ b/tests/virshtest.c
@@ -228,6 +228,16 @@ mymain(void)
"snapshot-create test --redefine snapshot-s2.xml --current --validate ;"
"snapshot-info test --current");
+ DO_TEST_SCRIPT("checkpoint", "
+ c2
+
+ c3
+
+ 1234
+
+
+
+
+ test
+ 6695eb01-f6a4-8304-79aa-97f2502e193f
+ 8388608
+ 2097152
+ 2
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/virshtestdata/checkpoint-c3.xml b/tests/virshtestdata/checkpoint-c3.xml
new file mode 100644
index 0000000000..c960a8553b
--- /dev/null
+++ b/tests/virshtestdata/checkpoint-c3.xml
@@ -0,0 +1,38 @@
+
+ c3
+ 5678
+
+
+
+
+ test
+ 6695eb01-f6a4-8304-79aa-97f2502e193f
+ 8388608
+ 2097152
+ 2
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/virshtestdata/checkpoint-redefine.out b/tests/virshtestdata/checkpoint-redefine.out
new file mode 100644
index 0000000000..83fccbc799
--- /dev/null
+++ b/tests/virshtestdata/checkpoint-redefine.out
@@ -0,0 +1,13 @@
+
+Redefine must be in topological order; this will fail
+error: invalid argument: parent c3 for moment c2 not found
+
+correct order
+Domain checkpoint c3 created from 'checkpoint-c3.xml'
+Domain checkpoint c2 created from 'checkpoint-c2.xml'
+Name: c2
+Domain: test
+Parent: c3
+Children: 0
+Descendants: 0
+
diff --git a/tests/virshtestdata/checkpoint.in b/tests/virshtestdata/checkpoint.in
new file mode 100755
index 0000000000..760f1fb648
--- /dev/null
+++ b/tests/virshtestdata/checkpoint.in
@@ -0,0 +1,35 @@
+echo Create a series of checkpoints, with names that intentionally sort
+echo differently by topology than by name. For now, it is not possible
+echo to create fanout without hacking through redefines.
+checkpoint-create-as test c1
+checkpoint-create-as test c1
+checkpoint-create-as test c3
+checkpoint-create-as test c2
+
+echo snapshots cannot be created while checkpoints exist
+snapshot-create-as test s1
+
+echo Checking tree view (siblings sorted alphabetically)
+checkpoint-list test --tree
+
+echo Demonstrate list filtering
+checkpoint-list test --roots --name
+checkpoint-list test --leaves --name
+checkpoint-list test --parent --no-leaves --name
+checkpoint-list test --from c3 --name
+checkpoint-list test --from c1 --descendants --name
+
+echo Now the tree is linear, so we have an unambiguous topological order
+checkpoint-list test --name
+checkpoint-list test --name --topological
+
+echo validate XML
+checkpoint-delete test c1
+checkpoint-dumpxml test c3
+checkpoint-dumpxml test c2
+
+echo Deleting current checkpoint moves current up to remaining parent
+checkpoint-delete test --children-only c3
+checkpoint-list test --leaves --name
+checkpoint-delete test --children c3
+checkpoint-list test --leaves --name
diff --git a/tests/virshtestdata/checkpoint.out b/tests/virshtestdata/checkpoint.out
new file mode 100644
index 0000000000..285bb0648f
--- /dev/null
+++ b/tests/virshtestdata/checkpoint.out
@@ -0,0 +1,133 @@
+Create a series of checkpoints, with names that intentionally sort
+differently by topology than by name. For now, it is not possible
+to create fanout without hacking through redefines.
+Domain checkpoint c1 created
+error: operation failed: domain moment c1 already exists
+
+Domain checkpoint c3 created
+Domain checkpoint c2 created
+snapshots cannot be created while checkpoints exist
+error: Operation not supported: cannot create snapshot while checkpoint exists
+
+Checking tree view (siblings sorted alphabetically)
+c1
+ |
+ +- c3
+ |
+ +- c2
+
+
+Demonstrate list filtering
+c1
+
+c2
+
+c1
+c3 c1
+
+c2
+
+c2
+c3
+
+Now the tree is linear, so we have an unambiguous topological order
+c1
+c2
+c3
+
+c1
+c3
+c2
+
+validate XML
+Domain checkpoint c1 deleted
+
+
+ c3
+
+
+
+
+
+ test
+ 6695eb01-f6a4-8304-79aa-97f2502e193f
+ 8388608
+ 2097152
+ 2
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ c2
+
+ c3
+
+
+
+
+
+
+ test
+ 6695eb01-f6a4-8304-79aa-97f2502e193f
+ 8388608
+ 2097152
+ 2
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Deleting current checkpoint moves current up to remaining parent
+Domain checkpoint c3 children deleted
+
+c3
+
+Domain checkpoint c3 deleted
+
+