#!/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 mountpoint $1 &> /dev/null; then if ! fusermount -u $1; then error "Failed to unmount \"$1\"" fi fi } do_mkntfs() { if ! mkntfs --force $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=1000 &> /dev/null dd if=/dev/zero of=out.ntfs bs=4096 count=1000 &> /dev/null mkdir in.mnt out.mnt do_mkntfs in.ntfs do_mkntfs out.ntfs } 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_capture() { if ! imagex capture in.ntfs ntfs.wim; then error "Failed to capture NTFS volume into a WIM" fi } do_apply() { do_unmount out.ntfs do_mkntfs out.ntfs if ! imagex apply ntfs.wim 1 out.ntfs; then error "Failed to apply WIM to NTFS volume" fi echo "do_apply" } cmp_xattrs() { infile=$1 outfile=$2 xattr=$3 #echo "Comparing xattr $xattr of $infile and $outfile" if test "$xattr" = "system.ntfs_times"; then headnum=24 else headnum=1000000000 fi if eval getfattr --only-values -d -n $xattr $infile 2>/dev/null\ | head -c $headnum > in.xattr; then if eval getfattr --only-values -d -n $xattr $outfile 2>/dev/null\ | head -c $headnum > out.xattr; then if ! cmp in.xattr out.xattr; then error "Extended attribute $xattr of $infile and $outfile differs" fi else error "$infile has extended attribute $xattr, but $outfile doesn't" fi else if eval getfattr --only-values -d -n $xattr $outfile 2>/dev/null\ | head -c $headnum > out.xattr; then error "$outfile has extended attribute $xattr, but $infile doesn't" fi fi } do_capture_and_apply() { do_unmount in.mnt do_unmount out.mnt do_capture if ! ntfs-3g -o ro in.ntfs in.mnt || ! ntfs-3g -o ro out.ntfs out.mnt; then error "Could not mount NTFS volume. Make sure ntfs-3g is installed" fi if ! diff -r in.mnt out.mnt; then error "Recursive diff of original NTFS volume with applied NTFS volume failed" fi for infile in `find in.mnt`; do outfile=out.mnt${infile##in.mnt} echo "Comparing xattrs of $infile and $outfile" cmp_xattrs $infile $outfile system.ntfs_attrib cmp_xattrs $infile $outfile system.ntfs_reparse_data cmp_xattrs $infile $outfile system.ntfs_acl cmp_xattrs $infile $outfile system.ntfs_dos_name cmp_xattrs $infile $outfile system.ntfs_times done } cleanup init echo "Testing capture and apply of empty NTFS volume" do_capture_and_apply