]> arthur.barton.de Git - bup.git/blobdiff - t/test-save-errors
test-save-errors: add tests for inaccessible metadata
[bup.git] / t / test-save-errors
diff --git a/t/test-save-errors b/t/test-save-errors
new file mode 100755 (executable)
index 0000000..1525261
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. t/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# necessary for 0 == 1970-01-01 00:00
+export TZ=UTC
+
+WVSTART "init"
+WVPASS bup init
+
+mkdir "$tmpdir/save"
+for f in $(seq 9) ; do
+    touch -t 200${f}01010000 "$tmpdir/save/$f"
+done
+mkdir "$tmpdir/save/a"
+touch -t 199901010000 "$tmpdir/save/a/1"
+
+WVSTART "metadata read error for a file"
+WVPASS bup index "$tmpdir/save"
+
+# now do a hack to inject save errors while reading metadata
+# essentially, we create a bup-save command for ourselves
+# that gets an error for the .../5 file in metadata.from_path()
+cat > "$tmpdir/bup-save" << EOF
+#!$top/cmd/bup-python
+from bup import metadata
+orig_from_path = metadata.from_path
+def from_path(path, *args, **kw):
+    if path.endswith(b'/5'):
+        raise IOError('intentionally failing metadata read for .../5')
+    return orig_from_path(path, *args, **kw)
+metadata.from_path = from_path
+
+exec(open("$top/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work anyway
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+# also check the *right* data was returned
+lsout="$(bup ls -l "test/latest/$tmpdir/save")"
+for f in 1 2 3 4   6 7 8 9 ; do
+    if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
+        WVFAIL echo incorrect date for $f
+    fi
+done
+# and ensure we actually failed, and the above script/hack didn't break
+if ! echo "$lsout" | grep "1970-01-01 00:00 5" ; then
+    WVFAIL echo unexpected date for file 5
+fi
+
+
+WVSTART "metadata read error for a folder"
+WVPASS bup index --clear
+WVPASS bup index "$tmpdir/save"
+
+cat > "$tmpdir/bup-save" << EOF
+#!$top/cmd/bup-python
+from bup import metadata
+orig_from_path = metadata.from_path
+def from_path(path, *args, **kw):
+    if path.endswith(b'/a'):
+        raise IOError('intentionally failing metadata read for .../a')
+    return orig_from_path(path, *args, **kw)
+metadata.from_path = from_path
+
+exec(open("$top/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work anyway
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+if ! bup ls -l "test/latest/$tmpdir/save/a" | grep '1999-01-01 00:00 1' ; then
+    WVFAIL unexpected date for file a/1
+fi
+# and ensure we actually failed, and the above script/hack didn't break
+if ! bup ls -l "test/latest/$tmpdir/save" | grep "1970-01-01 00:00 a" ; then
+    WVFAIL unexpected date for directory a
+fi
+
+WVPASS rm -rf "$tmpdir"