[Libguestfs] [PATCH 5/5 v3] fuse: Add tests for guestmount.
Matthew Booth
mbooth at redhat.com
Wed Nov 18 09:44:10 UTC 2009
On 17/11/09 19:22, Richard W.M. Jones wrote:
> +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" ]
You need to explicitly set the umask to 022 at the beginning of the
script for this to be reliable.
> +stage Checking sizes of initial content
> +[ "$(stat -c %s empty)" -eq 0 ]
> +[ "$(stat -c %s hello.txt)" -eq 5 ]
> +[ "$(stat -c %s world.txt)" -eq 11 ]
While you're at it, you could add tests for every other stat field.
> +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 ]
Eurgh. What's the impact of not caching?
Alternatively, inotify can spot an updated link count. What's the
potential for adding asynchronous cache invalidation from the daemon?
> +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 ]
> +chmod a-r new
> +[ ! -r new ]
> +chmod a+r new
> +[ -r new ]
> +rm -f new
> +
> +stage Checking truncate
> +truncate -s 10000 truncated
> +[ "$(stat -c %s truncated)" -eq 10000 ]
> +truncate -c -s 1000 truncated
> +[ "$(stat -c %s truncated)" -eq 1000 ]
> +truncate -c -s 10 truncated
> +[ "$(stat -c %s truncated)" -eq 10 ]
> +truncate -c -s 0 truncated
> +[ "$(stat -c %s truncated)" -eq 0 ]
> +rm -f truncated
> +
> +stage Checking utimens and timestamps
> +for ts in 12345 1234567 987654321; do
> + # NB: It's not possible to set the ctime with touch.
> + touch -a -d @$ts timestamp
> + [ "$(stat -c %X timestamp)" -eq $ts ]
> + touch -m -d @$ts timestamp
> + [ "$(stat -c %Y timestamp)" -eq $ts ]
> + touch -d @$ts timestamp
> + [ "$(stat -c %X timestamp)" -eq $ts ]
> + [ "$(stat -c %Y timestamp)" -eq $ts ]
> +done
> +
> +# These ones are not yet tested by the current script:
> +#stage XXX statfs/statvfs
> +#stage XXX xattr operations
> +
> +# These ones cannot easily be tested by the current script, eg because
> +# this script doesn't run as root:
> +#stage XXX fsync
> +#stage XXX chown
> +#stage XXX mknod
> -- 1.6.5.2
Looks good.
Matt
--
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team
M: +44 (0)7977 267231
GPG ID: D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
More information about the Libguestfs
mailing list