#!/bin/bash # This script does some sanity testing of the 'imagex' program, specifically # checking the NTFS capture and apply features. # # This test will fail if wimlib was compiled with --without-ntfs-3g. # Assume an in-tree build. set -e cd tests imagex() { #echo "imagex $@" ../imagex $@ > /dev/null } __do_unmount() { if ! fusermount -u $1; then error "Failed to unmount \"$1\"" fi } do_unmount() { if mountpoint $1 &> /dev/null; then __do_unmount $1 fi } __do_mount() { options="$3" if ! ntfs-3g ${options:+-o $options} $1 $2; then error "Could not mount NTFS volume \"$1\" on \"$2\". Make sure ntfs-3g is installed." fi } do_mount() { do_unmount $2 __do_mount $1 $2 $3 } do_mkntfs() { if ! mkntfs --force --fast $1 &> /dev/null; then error "Could not create NTFS volume on \"$1\". Make sure ntfs-3g / ntfsprogs are installed" fi } init() { echo "Creating NTFS volumes and empty directories to use as mountpoints" dd if=/dev/zero of=in.ntfs bs=4096 count=260 &> /dev/null dd if=/dev/zero of=out.ntfs bs=4096 count=260 &> /dev/null mkdir in.mnt out.mnt do_mkntfs in.ntfs do_mkntfs out.ntfs do_mount in.ntfs in.mnt } cleanup() { do_unmount in.mnt do_unmount out.mnt rm -rf in.ntfs out.ntfs in.mnt out.mnt in.xattr out.xattr } #trap cleanup exit error() { echo "****************************************************************" echo " Test failure " echo $* echo "****************************************************************" exit 1 } do_test() { cd in.mnt eval "$1" cd .. __do_unmount in.mnt if ! imagex capture in.ntfs ntfs.wim; then error "Failed to capture NTFS volume into a WIM" fi if ! imagex apply ntfs.wim 1 out.ntfs; then error "Failed to apply WIM to NTFS volume" fi __do_mount in.ntfs in.mnt __do_mount out.ntfs out.mnt ./ntfs-cmp in.mnt out.mnt rm -rf out.mnt/* in.mnt/* __do_unmount out.mnt } msg() { echo "Testing image capture and application of $1" } cleanup init msg "Empty NTFS volume" do_test "" msg "NTFS volume containing a single file" do_test "echo 1 > file" msg "NTFS volume containing a single directory" do_test "mkdir dir" msg "NTFS volume containing subdirectory with file" do_test "mkdir dir; echo 1 > dir/file" msg "NTFS volume containing empty file" do_test "echo -n > empty_file" msg "NTFS volume containing two empty files" do_test "echo -n > empty_file_1; echo -n > empty_file_2" msg "NTFS volume containing hard link in same directory" do_test "echo 1 > file; ln file link" msg "NTFS volume containing hard link between empty files" do_test "echo -n > empty_file; ln empty_file link" msg "NTFS volume containing relative symbolic link" do_test "echo 1 > file; ln -s file symlink" msg "NTFS volume containing absolute symbolic link" do_test "echo 1 > file; ln -s /some/absolute/target symlink" msg "NTFS volume containing large file" do_test "dd if=/dev/zero of=file bs=4096 count=10 &> /dev/null" msg "NTFS volume containing file with DOS name" do_test "echo 1 > file; setfattr -v file -n system.ntfs_dos_name file" msg "NTFS volume containing file with DOS name with alphabetically smaller hardlink in same directory" do_test "echo 1 > file; setfattr -v file -n system.ntfs_dos_name file; ln file aaa_link" msg "NTFS volume containing file with DOS name with alphabetically larger hardlink in same directory" do_test "echo 1 > file; setfattr -v file -n system.ntfs_dos_name file; ln file zzz_link" msg "NTFS volume containing file with long name and with DOS name with alphabetically smaller hardlink in same directory" do_test 'echo 1 > file_with_a_long_name; setfattr -v "file~1" -n system.ntfs_dos_name file_with_a_long_name; ln file_with_a_long_name aaa_link' msg "NTFS volume containing many nested directories" do_test 'mkdir dir; mkdir dir/subdir; mkdir dir/subdir/subdir2; mkdir dir/subdir/subdir3' msg "NTFS volume containing identical files and symlinks in subdirectory" do_test 'mkdir dir; echo 888 > dir/file; echo 888 > dir/idfile2; ln -s dir dir/circle; ln -s file dir/filelink' msg "NTFS volume containing hard link group and identical files not hard linked" do_test 'echo 888 > file; echo 888 > file2; ln file link; ln file link2; echo 888 > file3' msg "NTFS volume containing file with named data stream" do_test 'echo 1 > file; setfattr -n user.ads -v 2 file'