]> wimlib.net Git - wimlib/blobdiff - tests/test-imagex
test-imagex: Use existing image for changing boot index of split WIM
[wimlib] / tests / test-imagex
index 36e02534fcdade96b336bd79be1d6170795d79a1..7d7b144e7697853032f01fd6acc934e7297bce5a 100755 (executable)
@@ -1,31 +1,24 @@
-#!/bin/sh
+#!/usr/bin/env bash
 
 # This script does some sanity testing of the 'imagex' program.  It by no means
 # tests every aspect of wimlib comprehensively.
 
 set -e
 
 # This script does some sanity testing of the 'imagex' program.  It by no means
 # tests every aspect of wimlib comprehensively.
 
 set -e
-srcdir=${srcdir:-.}
-srcdir=`realpath $srcdir`
 cd tests
 cd tests
+srcdir="${srcdir:-.}/.."
+srcdir="$(cd $srcdir; pwd)"
+. "$srcdir/tests/tests-common.sh"
 
 
-imagex() {
-       echo "imagex $@"
-       ../imagex $@ 
-}
+TEST_SUBDIR=tmpdir_test-imagex
 
 
-cleanup() {
-       if [ -d tmp ] && mountpoint tmp > /dev/null; then
-               fusermount -u tmp > /dev/null;
-       fi
-       rm -rf dir* tmp* *.wim *.swm
-}
-trap cleanup exit
-fusermount -u tmp || true
-rm -rf tmp || true
+# Execute the tests in a subdirectory to avoid conflicts with concurrent tests
+default_cleanup
+mkdir $TEST_SUBDIR
+cd $TEST_SUBDIR
 
 # Make test directory
 mkdir dir
 
 # Make test directory
 mkdir dir
-cp $srcdir/src/*.c $srcdir/src/*.h dir
+cp $srcdir/src/*.c dir
 mkdir dir/subdir
 echo 'hello' > dir/subdir/hello
 echo 'hello' > dir/subdir/hello2
 mkdir dir/subdir
 echo 'hello' > dir/subdir/hello
 echo 'hello' > dir/subdir/hello2
@@ -37,14 +30,6 @@ mkdir dir2
 echo 'testing' > dir2/file
 dd if=/dev/zero of=dir2/zeroes bs=4096 count=5
 
 echo 'testing' > dir2/file
 dd if=/dev/zero of=dir2/zeroes bs=4096 count=5
 
-error() {
-       echo "**********************************************"
-       echo "                  Test failure                "
-       echo $*
-       echo "**********************************************"
-       exit 1
-}
-
 # Capturing and applying WIM with None, LZX, and XPRESS compression
 
 for comp_type in None LZX XPRESS; do
 # Capturing and applying WIM with None, LZX, and XPRESS compression
 
 for comp_type in None LZX XPRESS; do
@@ -55,19 +40,19 @@ for comp_type in None LZX XPRESS; do
        if ! imagex apply dir.wim tmp; then
                error "'imagex apply' failed"
        fi
        if ! imagex apply dir.wim tmp; then
                error "'imagex apply' failed"
        fi
-       if ! test "`imagex info dir.wim | grep Compression | awk '{print $2}'`" = "$comp_type"; then
+       if ! test `wim_ctype dir.wim` = "$comp_type"; then
                error "'imagex info' didn't report the compression type correctly"
        fi
        if ! diff -q -r dir tmp; then
                error "Recursive diff of extracted directory with original failed"
        fi
                error "'imagex info' didn't report the compression type correctly"
        fi
        if ! diff -q -r dir tmp; then
                error "Recursive diff of extracted directory with original failed"
        fi
-       if ! test `stat -c %h tmp/subdir/hello` = 2; then
+       if ! test `get_link_count tmp/subdir/hello` = 2; then
                error "Incorrect number of hard links in extracted file"
        fi
                error "Incorrect number of hard links in extracted file"
        fi
-       if ! test `stat -c %i tmp/subdir/hello` != `stat -c %i tmp/subdir/hello2`; then
+       if ! test `get_inode_number tmp/subdir/hello` != `get_inode_number tmp/subdir/hello2`; then
                error "Expected different inode numbers in files not hard-linked"
        fi
                error "Expected different inode numbers in files not hard-linked"
        fi
-       if ! test "`stat -c %i tmp/subdir/hello`" = "`stat -c %i tmp/subdir/hellolink`"; then
+       if ! test "`get_inode_number tmp/subdir/hello`" = "`get_inode_number tmp/subdir/hellolink`"; then
                error "Expected same inode numbers in hard-linked files"
        fi
        if ! test -L tmp/subdir/rel_symlink; then
                error "Expected same inode numbers in hard-linked files"
        fi
        if ! test -L tmp/subdir/rel_symlink; then
@@ -76,7 +61,7 @@ for comp_type in None LZX XPRESS; do
        if ! test "`readlink tmp/subdir/rel_symlink`" = "hello"; then
                error "Symlink target not correct"
        fi
        if ! test "`readlink tmp/subdir/rel_symlink`" = "hello"; then
                error "Symlink target not correct"
        fi
-       
+
        rm -rf dir.wim tmp
 done
 
        rm -rf dir.wim tmp
 done
 
@@ -190,7 +175,7 @@ if ! test "`imagex info dir.wim | grep 'Image Count' | awk '{print $3}'`" = 2; t
 fi
 
 echo "Testing appending WIM image with existing name (this should generate errors)"
 fi
 
 echo "Testing appending WIM image with existing name (this should generate errors)"
-if imagex append dir2 dir.wim; then
+if imagex append dir2 dir.wim "dir"; then
        error "Adding duplicate image name didn't fail"
 fi
 echo "Testing appending WIM image with new name"
        error "Adding duplicate image name didn't fail"
 fi
 echo "Testing appending WIM image with new name"
@@ -287,13 +272,13 @@ fi
 if ! diff -q -r tmp/dir tmp/myname || ! diff -q -r dir tmp/dir; then
        error "Recursive diff of applied WIM with original directory failed"
 fi
 if ! diff -q -r tmp/dir tmp/myname || ! diff -q -r dir tmp/dir; then
        error "Recursive diff of applied WIM with original directory failed"
 fi
-if test "`stat -c %h tmp/dir/lz.c`" != 1; then
+if test "`get_link_count tmp/dir/lz77.c`" != 1; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %h tmp/myname/lz.c`" != 1; then
+if test "`get_link_count tmp/myname/lz77.c`" != 1; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %i tmp/myname/lz.c`" = "`stat -c %i tmp/dir/lz.c`"; then
+if test "`get_inode_number tmp/myname/lz77.c`" = "`get_inode_number tmp/dir/lz77.c`"; then
        error "Incorrect inode number"
 fi
 rm -rf tmp
        error "Incorrect inode number"
 fi
 rm -rf tmp
@@ -304,13 +289,13 @@ fi
 if ! diff -q -r tmp/dir tmp/myname || ! diff -q -r dir tmp/dir; then
        error "Recursive diff of applied WIM with original directory failed"
 fi
 if ! diff -q -r tmp/dir tmp/myname || ! diff -q -r dir tmp/dir; then
        error "Recursive diff of applied WIM with original directory failed"
 fi
-if test "`stat -c %h tmp/dir/lz.c`" != 2; then
+if test "`get_link_count tmp/dir/lz77.c`" != 2; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %h tmp/myname/lz.c`" != 2; then
+if test "`get_link_count tmp/myname/lz77.c`" != 2; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %i tmp/myname/lz.c`" != "`stat -c %i tmp/dir/lz.c`"; then
+if test "`get_inode_number tmp/myname/lz77.c`" != "`get_inode_number tmp/dir/lz77.c`"; then
        error "Incorrect inode number"
 fi
 rm -rf tmp
        error "Incorrect inode number"
 fi
 rm -rf tmp
@@ -319,16 +304,16 @@ echo "Testing application of single image containing identical files"
 if ! imagex apply dir.wim 1 tmp; then
        error "Failed to apply WIM"
 fi
 if ! imagex apply dir.wim 1 tmp; then
        error "Failed to apply WIM"
 fi
-if test "`stat -c %h tmp/subdir/hello`" != 2; then
+if test "`get_link_count tmp/subdir/hello`" != 2; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %h tmp/subdir/hello2`" != 1; then
+if test "`get_link_count tmp/subdir/hello2`" != 1; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %i tmp/subdir/hello`" = "`stat -c %i tmp/subdir/hello2`"; then
+if test "`get_inode_number tmp/subdir/hello`" = "`get_inode_number tmp/subdir/hello2`"; then
        error "Inode numbers on non-hard-linked files are the same"
 fi
        error "Inode numbers on non-hard-linked files are the same"
 fi
-if test "`stat -c %i tmp/subdir/hello`" != "`stat -c %i tmp/subdir/hellolink`"; then
+if test "`get_inode_number tmp/subdir/hello`" != "`get_inode_number tmp/subdir/hellolink`"; then
        error "Inode numbers on hard-linked files are different"
 fi
 rm -rf tmp
        error "Inode numbers on hard-linked files are different"
 fi
 rm -rf tmp
@@ -337,16 +322,16 @@ echo "Testing application of single image containing identical files with hardli
 if ! imagex apply dir.wim 1 tmp --hardlink; then
        error "Failed to apply WIM"
 fi
 if ! imagex apply dir.wim 1 tmp --hardlink; then
        error "Failed to apply WIM"
 fi
-if test "`stat -c %h tmp/subdir/hello`" != 3; then
+if test "`get_link_count tmp/subdir/hello`" != 3; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %h tmp/subdir/hello2`" != 3; then
+if test "`get_link_count tmp/subdir/hello2`" != 3; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %i tmp/subdir/hello`" != "`stat -c %i tmp/subdir/hello2`"; then
+if test "`get_inode_number tmp/subdir/hello`" != "`get_inode_number tmp/subdir/hello2`"; then
        error "Hard link set does not share inode number"
 fi
        error "Hard link set does not share inode number"
 fi
-if test "`stat -c %i tmp/subdir/hello`" != "`stat -c %i tmp/subdir/hellolink`"; then
+if test "`get_inode_number tmp/subdir/hello`" != "`get_inode_number tmp/subdir/hellolink`"; then
        error "Hard link set does not share inode number"
 fi
 rm -rf tmp
        error "Hard link set does not share inode number"
 fi
 rm -rf tmp
@@ -355,13 +340,13 @@ echo "Testing application of single image containing identical files with symlin
 if ! imagex apply dir.wim 1 tmp --symlink; then
        error "Failed to apply WIM"
 fi
 if ! imagex apply dir.wim 1 tmp --symlink; then
        error "Failed to apply WIM"
 fi
-if test "`stat -c %h tmp/subdir/hello`" != 1; then
+if test "`get_link_count tmp/subdir/hello`" != 1; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %h tmp/subdir/hello2`" != 1; then
+if test "`get_link_count tmp/subdir/hello2`" != 1; then
        error "Incorrect link count on extracted file"
 fi
        error "Incorrect link count on extracted file"
 fi
-if test "`stat -c %i tmp/subdir/hello`" = "`stat -c %i tmp/subdir/hello2`"; then
+if test "`get_inode_number tmp/subdir/hello`" = "`get_inode_number tmp/subdir/hello2`"; then
        error "Incorrect inode number"
 fi
 if ! test -L tmp/subdir/hello -o -L tmp/subdir/hello2 -o -L tmp/subdir/hellolink; then
        error "Incorrect inode number"
 fi
 if ! test -L tmp/subdir/hello -o -L tmp/subdir/hello2 -o -L tmp/subdir/hellolink; then
@@ -369,141 +354,12 @@ if ! test -L tmp/subdir/hello -o -L tmp/subdir/hello2 -o -L tmp/subdir/hellolink
 fi
 rm -rf dir.wim tmp
 
 fi
 rm -rf dir.wim tmp
 
-# imagex mount
-
-for flag in "--compress=none" "--compress=maximum" "--compress=fast"; do
-       echo "Using flag $flag"
-       echo "Testing mounting WIM read-only"
-       if ! imagex capture dir dir.wim $flag; then
-               error "Failed to capture WIM"
-       fi
-       mkdir tmp
-       if ! imagex mount dir.wim dir tmp; then
-               error "Failde to mount test WIM read-only"
-       fi
-       echo "Testing extracting file from mounted read-only WIM"
-       if ! cp tmp/lz.c lz.c; then
-               error "Failed to extract file from read-only mounted WIM"
-       fi
-       if ! diff -q dir/lz.c lz.c; then
-               error "Extracted file does not match copy in mounted WIM"
-       fi
-       if ! diff -q tmp/lz.c dir/lz.c; then
-               error "Extractef file does not match original"
-       fi
-       rm -f lz.c
-       echo "Testing modifying mounted read-only WIM (should fail)"
-       if rm tmp/lz.c; then
-               error "Removing file from read-only mounted WIM didn't fail"
-       fi
-       if touch tmp/newfile; then
-               error "Creating file on read-only mounted WIM didn't fail"
-       fi
-       if echo 3 > tmp/lz.c; then
-               error "Writing to file on read-only mounted WIM didn't fail"
-       fi
-       echo "Testing diff of mounted read-only WIM with original directory"
-       if ! diff -q -r tmp dir; then
-               error "Recursive diff of read-only mounted WIM with original directory failed"
-       fi
-       echo "Testing unmount of read-only filesystem"
-       if ! imagex unmount tmp; then
-               error "Unmounting read-only WIM failed"
-       fi
-       echo "Testing unmount of read-only filesystem with --commit given"
-       if ! imagex mount dir.wim dir tmp; then
-               error "Failed to re-mount WIM read-only"
-       fi
-       if ! imagex unmount tmp --commit; then
-               error "Failed to unmount read-only WIM with --commit flag (should be ignored)"
-       fi
-       rm -rf tmp dir.wim
-done
-
-# imagex mountrw
-echo "Testing mounting WIM read-write"
-if ! imagex capture dir dir.wim; then
-       error "Failed to capture WIM"
-fi
-mkdir tmp
-if ! imagex mountrw dir.wim dir tmp; then
-       error "Failed to mount test WIM read-write"
-fi
-echo "Testing unmounting WIM unmodified"
-if ! imagex unmount tmp; then
-       error "Failed to unmount test WIM unmodified"
-fi
-echo "Testing unmounting WIM unmodified with --commit and --check"
-if ! imagex mountrw dir.wim dir tmp; then
-       error "Failed to re-mount test WIM read-write"
-fi
-if ! imagex unmount tmp --commit --check; then
-       error "Failed to unmount read-write mounted WIM with changes commited (no changes made)"
-fi
-echo "Testing removing file from mounted WIM"
-if ! imagex mountrw dir.wim dir tmp; then
-       error "Failed to re-mount test WIM read-write"
-fi
-if ! rm tmp/lz.c; then
-       error "Failed to remove file from read-write mounted WIM"
-fi
-if test -f tmp/lz.c; then
-       error "Removing file from read-write mounted WIM failed"
-fi
-echo "Testing making directory in mounted WIM"
-if ! mkdir tmp/newdir; then
-       error "Failed to make directory in read-write mounted WIM"
-fi
-if ! test -d tmp/newdir; then
-       error "Making directory in read-write mounted WIM failed"
-fi
-echo "Testing making new empty file in mounted WIM"
-if ! touch tmp/newdir/empty_file; then
-       error "Could not create new empty file in read-write mounted WIM"
-fi
-if ! test -f tmp/newdir/empty_file; then
-       error "New empty file not created correctly in read-write mounted WIM"
-fi
-if ! test "`stat -c %s tmp/newdir/empty_file`" = 0; then
-       error "New empty file in read-write mounted WIM is not empty"
-fi
-echo "Testing making new non-empty file in mounted WIM"
-if ! dd if=/dev/zero of=tmp/newdir/zeroes1 bs=1 count=4096; then
-       error "Failed to make new non-empty file in mounted WIM"
-fi
-if ! dd if=/dev/zero of=tmp/newdir/zeroes2 bs=4096 count=1; then
-       error "Failed to make new non-empty file in mounted WIM"
-fi
-if ! diff -q tmp/newdir/zeroes1 tmp/newdir/zeroes2; then
-       error "New files in mounted WIM not made correctly"
-fi
-echo "Unmounting WIM with changes committed and --check"
-if ! imagex unmount tmp --commit --check; then
-       error "Failed to unmount read-write mounted WIM"
-fi
-if test "`imagex info dir.wim | grep Integrity | awk '{print $3}'`" != "yes"; then
-       error "Integrity information was not included"
-fi
-rm -rf tmp
-if ! imagex apply dir.wim tmp; then
-       error "Failed to apply WIM we had previously mounted read-write"
-fi
-if ! diff -q tmp/newdir/zeroes1 tmp/newdir/zeroes2; then
-       error "The new non-empty files we made in the read-write mounted WIM were not extracted correctly"
-fi
-if test `stat -c %s tmp/newdir/empty_file` != 0; then
-       error "The new empty file we made in the read-write mounted WIM was not extracted correctly"
-fi
-if test `stat -c %s tmp/newdir/zeroes1` != 4096; then
-       error "The new non-empty files we made in the read-write mounted WIM were not extracted correctly"
-fi
-rm -rf tmp dir.wim
 
 # imagex split, imagex join
 
 echo "Creating random files to test WIM splitting on"
 mkdir tmp
 
 # imagex split, imagex join
 
 echo "Creating random files to test WIM splitting on"
 mkdir tmp
-for i in `seq 1 100`; do
+for ((i = 0; i < 100; i++)); do
        dd if=/dev/urandom of=tmp/file$i bs=4096 count=10 &> /dev/null
 done
 for flag in "--compress=none" "--compress=maximum" "--compress=fast"; do
        dd if=/dev/urandom of=tmp/file$i bs=4096 count=10 &> /dev/null
 done
 for flag in "--compress=none" "--compress=maximum" "--compress=fast"; do
@@ -530,7 +386,7 @@ for flag in "--compress=none" "--compress=maximum" "--compress=fast"; do
        fi
 
        # Unsupported, should fail
        fi
 
        # Unsupported, should fail
-       if imagex info tmp.swm --boot 0; then
+       if imagex info tmp.swm --boot 1; then
                error "Should not have been able to change boot index of split WIM"
        fi
        echo "Joining the split WIMs and applying the result"
                error "Should not have been able to change boot index of split WIM"
        fi
        echo "Joining the split WIMs and applying the result"
@@ -615,8 +471,8 @@ fi
 # Test exporting an image to another WIM, then applying it.
 # We try with 5 different combinations of compression types to make sure we go
 # through all paths in the resource-handling code.
 # Test exporting an image to another WIM, then applying it.
 # We try with 5 different combinations of compression types to make sure we go
 # through all paths in the resource-handling code.
-for i in `seq 1 3`; do
-       case $i in 
+for i in 1 2 3 4 5; do
+       case $i in
        1)
                cflag1="--compress=none";
                cflag2="--compress=none";
        1)
                cflag1="--compress=none";
                cflag2="--compress=none";
@@ -655,3 +511,7 @@ done
 echo "**********************************************************"
 echo "                 Basic imagex tests passed                "
 echo "**********************************************************"
 echo "**********************************************************"
 echo "                 Basic imagex tests passed                "
 echo "**********************************************************"
+
+# Leave test subdirectory and cleanup
+cd ..
+default_cleanup