]> arthur.barton.de Git - bup.git/blob - t/test-save-restore
test-restore-map-owner: accommodate python 3 and test there
[bup.git] / t / test-save-restore
1 #!/usr/bin/env bash
2 . wvtest.sh
3 . wvtest-bup.sh
4 . t/lib.sh
5
6 set -o pipefail
7
8 top="$(WVPASS pwd)" || exit $?
9 tmpdir="$(WVPASS wvmktempdir)" || exit $?
10 export BUP_DIR="$tmpdir/bup"
11
12 bup() { "$top/bup" "$@"; }
13
14 validate-local-and-remote-restore()
15 {
16     local src="$1" dest="$2" cmp_src="$3" cmp_dest="$4"
17     force-delete "$dest"
18     WVPASS bup restore -C "$dest" "$src"
19     WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest"
20     force-delete "$dest"
21     WVPASS bup restore -r ":$BUP_DIR" -C "$dest" "$src"
22     WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest"
23 }
24
25
26 WVPASS cd "$tmpdir"
27
28 WVSTART "init"
29 WVPASS bup init
30 D=bupdata.tmp
31 WVPASS force-delete $D
32 WVPASS mkdir $D
33 WVPASS touch $D/a
34 WVPASS bup random 128k >$D/b
35 WVPASS mkdir $D/d $D/d/e
36 WVPASS bup random 512 >$D/f
37 WVPASS touch $D/d/z
38 WVPASS touch $D/d/z
39 WVPASS bup index $D
40 WVPASS bup save -t $D
41
42
43 WVSTART "restore"
44 WVPASS force-delete buprestore.tmp
45 WVFAIL bup restore boink
46 WVPASS touch "$tmpdir/$D/$D"
47 WVPASS bup index -u "$tmpdir/$D"
48 WVPASS bup save -n master /
49 WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D"
50 WVPASSEQ "$(ls buprestore.tmp)" "bupdata.tmp"
51 WVPASS force-delete buprestore.tmp
52 WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D/"
53 WVPASS touch $D/non-existent-file buprestore.tmp/non-existent-file # else diff fails
54 WVPASS diff -ur $D/ buprestore.tmp/
55 WVPASS force-delete buprestore.tmp
56 WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
57 WVPASS bup restore -C buprestore.tmp split_empty_string.tmp/latest/
58 WVPASSEQ "$(cat buprestore.tmp/data)" ""
59
60
61 (
62     tmp=testrestore.tmp
63     WVPASS force-delete $tmp
64     WVPASS mkdir $tmp
65     export BUP_DIR="$(pwd)/$tmp/bup"
66     WVPASS WVPASS bup init
67     WVPASS mkdir -p $tmp/src/x/y/z
68     WVPASS bup random 8k > $tmp/src/x/y/random-1
69     WVPASS bup random 8k > $tmp/src/x/y/z/random-2
70     WVPASS bup index -u $tmp/src
71     WVPASS bup save --strip -n foo $tmp/src
72
73     WVSTART "restore /foo/latest"
74     validate-local-and-remote-restore \
75         /foo/latest  "$tmp/restore" \
76         "$tmp/src/" "$tmp/restore/latest/"
77
78     WVSTART "restore /foo/latest/."
79     WVPASS force-delete "$tmp/restore"
80     validate-local-and-remote-restore \
81         /foo/latest/.  "$tmp"/restore \
82         "$tmp"/src/ "$tmp"/restore
83
84     WVSTART "restore /foo/latest/x"
85     WVPASS force-delete "$tmp/restore"
86     validate-local-and-remote-restore \
87         /foo/latest/x  "$tmp"/restore \
88         "$tmp"/src/x/ "$tmp"/restore/x/
89
90     WVSTART "restore /foo/latest/x/"
91     WVPASS force-delete "$tmp/restore"  
92     WVPASS bup restore -C "$tmp"/restore /foo/latest/x/
93     for x in "$tmp"/src/x/*; do
94         WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
95     done
96     WVPASS force-delete "$tmp/restore"  
97     WVPASS bup restore -r ":$BUP_DIR" -C "$tmp"/restore /foo/latest/x/
98     for x in "$tmp"/src/x/*; do
99         WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
100     done
101
102     WVSTART "restore /foo/latest/x/."
103     WVPASS force-delete "$tmp/restore"
104     validate-local-and-remote-restore \
105         /foo/latest/x/.  "$tmp"/restore \
106         "$tmp"/src/x/ "$tmp"/restore/
107 ) || exit $?
108
109
110 WVSTART "save (no index)"
111 (
112     tmp=save-no-index.tmp
113     WVPASS force-delete $tmp
114     WVPASS mkdir $tmp
115     export BUP_DIR="$(WVPASS pwd)/$tmp/bup" || exit $?
116     WVPASS bup init
117     WVFAIL bup save -n nothing /
118     WVPASS rm -r "$tmp"
119 ) || exit $?
120
121
122 WVSTART "save disjoint top-level directories"
123 (
124     # Resolve any symlinks involving the top top-level dirs.
125     real_pwd="$(WVPASS resolve-parent .)" || exit $?
126     real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $?
127     pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $?
128     tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $?
129
130     if [ "$pwd_top" = "$tmp_top" ]; then
131         echo "(running from within /$tmp_top; skipping test)" 1>&2
132         exit 0
133     fi
134     D=bupdata.tmp
135     WVPASS force-delete $D
136     WVPASS mkdir -p $D/x
137     WVPASS date > $D/x/1
138     tmpdir2="$(WVPASS mktemp -d $real_tmp/bup-test-XXXXXXX)" || exit $?
139     cleanup() { WVPASS rm -r "$tmpdir2"; }
140     WVPASS trap cleanup EXIT
141     WVPASS date > "$tmpdir2/2"
142
143     export BUP_DIR="$tmpdir/bup"
144     WVPASS test -d "$BUP_DIR" && WVPASS rm -r "$BUP_DIR"
145
146     WVPASS bup init
147     WVPASS bup index -vu $(pwd)/$D/x "$tmpdir2"
148     WVPASS bup save -t -n src $(pwd)/$D/x "$tmpdir2"
149
150     # For now, assume that "ls -a" and "sort" use the same order.
151     actual="$(WVPASS bup ls -AF src/latest)" || exit $?
152     expected="$(echo -e "$pwd_top/\n$tmp_top/" | WVPASS sort)" || exit $?
153     WVPASSEQ "$actual" "$expected"
154 ) || exit $?
155
156
157 WVPASS cd "$top"
158 WVPASS rm -rf "$tmpdir"