zip-reader: Report corrupted Zip archives.
[pspp] / tests / libpspp / zip.at
index 77ca00e1c68cb38e16388b1ecd7f3f5c9df8d3d8..bcc550457ab718a96f0280427d010a4ec2fd29d0 100644 (file)
@@ -22,41 +22,64 @@ here=`pwd`
 dir1=$here/original
 dir2=$here/recovered
 
-mkdir -p $dir1
+mkdir -p "$dir1"
 
 # Generate files of differing sizes with random data in them
 names=""
 s=1;
 while test $s -le 8192 ; do
-       name=$dir1/$s
-       dd if=/dev/urandom of=$name count=1 bs=$s 2> /dev/null
+       name="$dir1/$s"
+       dd if=/dev/urandom of="$name" count=1 bs=$s 2> /dev/null
        s=$(($s * 2));
-       bn=`basename $name`;
+       bn=`basename "$name"`;
         names="$names $bn";
 done
 
-AT_CHECK([cd $dir1 && zip-test w foo.zip $names])
+AT_CHECK([cd "$dir1" && zip-test w foo.zip $names])
 
 # If zipinfo is installed, make sure it can read the zipfile.
 if (zipinfo -v) >/dev/null 2>&1; then
-    AT_CHECK([zipinfo $dir1/foo.zip], [0], [ignore])
+    AT_CHECK([zipinfo "$dir1/foo.zip"], [0], [ignore])
 fi
 
-mkdir -p $dir2
-cp $dir1/foo.zip $dir2
-cd $dir2
+mkdir -p "$dir2"
+cp "$dir1/foo.zip" "$dir2"
+cd "$dir2"
 
 AT_CHECK([zip-test r foo.zip $names])
 
 AT_CHECK([
     # Compare the files to their originals
     for f in $names; do
-     diff $dir1/$f $dir2/$f;
+     diff "$dir1/$f" "$dir2/$f";
      if test $? -ne 0 ; then exit 1; fi;
     done
 ])
 AT_CLEANUP
 
+AT_SETUP([zip - detect corruption on unzip])
+AT_KEYWORDS([compression])
+mkdir write
+cd write
+AT_DATA([data.txt], [xyzzy
+])
+AT_CHECK([zip-test w ../foo.zip data.txt])
+cd ..
+
+mkdir extract
+cd extract
+AT_CHECK([zip-test r ../foo.zip data.txt])
+AT_CHECK([cat data.txt], [0], [xyzzy
+])
+cd ..
+
+mkdir error
+cd error
+sed 's/xyzzy/XYZZY/' < ../foo.zip > ../corrupted.zip
+AT_CHECK([zip-test r ../corrupted.zip data.txt], [1], [], [dnl
+Unzip failed: ../corrupted.zip: corrupt archive reading member "data.txt": bad CRC 0x2a2bcd20 (expected e1bd2a6e)
+])
+AT_CLEANUP
 
 AT_SETUP([zip to pipe])
 AT_KEYWORDS([compression])
@@ -64,38 +87,38 @@ here=`pwd`
 dir1=$here/original
 dir2=$here/recovered
 
-mkdir -p $dir1
+mkdir -p "$dir1"
 
 # Generate files of differing sizes with random data in them
 names=""
 s=1;
 while test $s -le 8192 ; do
-       name=$dir1/$s
-       dd if=/dev/urandom of=$name count=1 bs=$s 2> /dev/null
+       name="$dir1/$s"
+       dd if=/dev/urandom of="$name" count=1 bs=$s 2> /dev/null
        s=$(($s * 2));
-       bn=`basename $name`;
+       bn=`basename "$name"`;
         names="$names $bn";
 done
 
 # The pipe through "cat" below is essential because it makes the
 # output file un-seekable.
-AT_CHECK([cd $dir1 && zip-test w - $names | cat > foo.zip])
+AT_CHECK([cd "$dir1" && zip-test w - $names | cat > foo.zip])
 
 # If zipinfo is installed, make sure it can read the zipfile.
 if (zipinfo -v) >/dev/null 2>&1; then
-    AT_CHECK([zipinfo $dir1/foo.zip], [0], [ignore])
+    AT_CHECK([zipinfo "$dir1/foo.zip"], [0], [ignore])
 fi
 
-mkdir -p $dir2
-cp $dir1/foo.zip $dir2
-cd $dir2
+mkdir -p "$dir2"
+cp "$dir1/foo.zip" "$dir2"
+cd "$dir2"
 
 AT_CHECK([zip-test r foo.zip $names])
 
 AT_CHECK([
     # Compare the files to their originals
     for f in $names; do
-     diff $dir1/$f $dir2/$f;
+     diff "$dir1/$f" "$dir2/$f";
      if test $? -ne 0 ; then exit 1; fi;
     done
 ])