[Libguestfs] [PATCH 5/5 v2] fuse: Add tests for guestmount.
Richard W.M. Jones
rjones at redhat.com
Tue Nov 17 17:16:41 UTC 2009
Sorry, previous patch didn't actually work when run from 'make check'.
This fixes the issue.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into Xen guests.
http://et.redhat.com/~rjones/virt-p2v
-------------- next part --------------
>From 6c8b0c5c4d129dde3fdcaa3ad21a9f75451913a8 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Tue, 17 Nov 2009 17:03:31 +0000
Subject: [PATCH 5/5] fuse: Add tests for guestmount.
This script contains non-exhaustive tests for the system calls
implemented by guestmount.
---
fuse/Makefile.am | 8 +++
fuse/test-fuse.sh | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 176 insertions(+), 0 deletions(-)
create mode 100755 fuse/test-fuse.sh
diff --git a/fuse/Makefile.am b/fuse/Makefile.am
index c041058..ebf948a 100644
--- a/fuse/Makefile.am
+++ b/fuse/Makefile.am
@@ -39,6 +39,8 @@ guestmount_LDADD = \
$(top_builddir)/src/libguestfs.la \
../gnulib/lib/libgnu.la
+# Documentation.
+
man_MANS = guestmount.1
guestmount.1: guestmount.pod
@@ -60,4 +62,10 @@ $(top_builddir)/html/guestmount.1.html: guestmount.pod
--outfile html/guestmount.1.html \
fuse/guestmount.pod
+# Tests.
+
+TESTS = test-fuse.sh
+TESTS_ENVIRONMENT = \
+ top_builddir=..
+
endif
diff --git a/fuse/test-fuse.sh b/fuse/test-fuse.sh
new file mode 100755
index 0000000..1171eaf
--- /dev/null
+++ b/fuse/test-fuse.sh
@@ -0,0 +1,168 @@
+#!/bin/bash -
+# libguestfs
+# Copyright (C) 2009 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+unset CDPATH
+set -e
+#set -v
+
+if [ -z "$top_builddir" ]; then
+ echo "$0: environment variable \$top_builddir must be set"
+ exit 1
+fi
+
+nr_stages=$(grep "^stage " $0 | wc -l)
+
+# Allow top_builddir to be a relative path, but also make it absolute,
+# and move to that directory for the initial phase of the script.
+top_builddir=$(cd "$top_builddir" > /dev/null; pwd)
+
+# Set libguestfs up for running locally.
+export LIBGUESTFS_PATH="$top_builddir/appliance"
+
+# Paths to the other programs and files. NB: Must be absolute paths.
+guestfish="$top_builddir/fish/guestfish"
+guestmount="$top_builddir/fuse/guestmount"
+image="$top_builddir/fuse/test.img"
+mp="$top_builddir/fuse/test-mp"
+
+# Ensure everything is cleaned up on exit.
+rm -f "$image"
+mkdir -p "$mp"
+fusermount -u "$mp" >/dev/null 2>&1 ||:
+function cleanup ()
+{
+ status=$?
+ set +e
+ [ $status = 0 ] || echo "*** FAILED ***"
+ echo "Unmounting filesystem and cleaning up."
+ cd "$top_builddir"
+ # By the way, if you run this manually from within gnome, then
+ # randomly /usr/libexec/gvfs-gdu-volume-monitor will decide to do
+ # whatever it does in the mountpoint directory, preventing you
+ # from unmounting it!
+ if [ -x /sbin/fuser ]; then /sbin/fuser "$mp"; fi
+ fusermount -u "$mp"
+ rm -f "$image"
+ rm -rf "$mp"
+ exit $status
+}
+trap cleanup INT TERM QUIT EXIT
+
+s=1
+function stage ()
+{
+ echo "test-fuse: $s/$nr_stages:" "$@" "..."
+ ((s++))
+}
+
+stage Create filesystem with some inital content
+$guestfish <<EOF
+ sparse "$image" 10M
+ run
+ part-disk /dev/sda mbr
+ mkfs ext2 /dev/sda1
+ mount /dev/sda1 /
+ write-file /hello.txt hello 0
+ write-file /world.txt "hello world" 0
+ touch /empty
+EOF
+
+stage Mounting the filesystem
+$guestmount -a "$image" -m /dev/sda1 "$mp"
+
+stage Changing into mounted directory
+cd "$mp"
+
+stage Checking initial files exist
+[ -n "$(echo *)" ]
+[ "$(ls empty hello.txt world.txt)" = "empty
+hello.txt
+world.txt" ]
+
+stage Checking initial files contain expected content
+[ "$(cat hello.txt)" = "hello" ]
+[ "$(cat world.txt)" = "hello world" ]
+cat empty ;# should print nothing
+[ -z "$(cat empty)" ]
+
+stage Checking file modes of initial content
+[ "$(stat -c %a empty)" = "644" ]
+[ "$(stat -c %a hello.txt)" = "644" ]
+[ "$(stat -c %a world.txt)" = "644" ]
+
+stage Checking unlink
+touch new
+rm -f new ;# force because file is "owned" by root
+
+stage Checking symbolic link
+ln -s hello.txt symlink
+[ -L symlink ]
+
+stage Checking readlink
+[ "$(readlink symlink)" = "hello.txt" ]
+
+stage Checking hard link
+[ "$(stat -c %h hello.txt)" -eq 1 ]
+ln hello.txt link
+[ "$(stat -c %h link)" -eq 2 ]
+[ "$(stat -c %h hello.txt)" -eq 2 ]
+rm -f link
+[ ! -e link ]
+
+# This fails because of caching. The problem is that the linked file
+# ("hello.txt") is cached with a link count of 2. unlink("link")
+# invalidates the cache for "link", but _not_ for "hello.txt" which
+# still has the now-incorrect cached value. However there's not much
+# we can do about this since searching for all linked inodes of a file
+# is an O(n) operation.
+#[ "$(stat -c %h hello.txt)" -eq 1 ]
+
+stage Checking mkdir
+mkdir newdir
+[ -d newdir ]
+
+stage Checking rmdir
+rmdir newdir
+[ ! -e newdir ]
+
+stage Checking rename
+touch old
+mv old new
+[ -f new ]
+[ ! -e old ]
+rm -f new
+
+stage Checking chmod
+touch new
+chmod a+x new
+[ -x new ]
+chmod a-x new
+[ ! -x new ]
+chmod a-w new
+[ ! -w new ]
+chmod a+w new
+[ -w new ]
+rm -f new
+
+#stage XXX truncate
+#stage XXX utimens
+#stage XXX chown
+#stage XXX statfs/statvfs
+#stage XXX fsync
+#stage XXX xattr operations
+#stage XXX mknod
--
1.6.5.2
More information about the Libguestfs
mailing list