]> arthur.barton.de Git - bup.git/blob - t/test-meta.sh
test-meta.sh: change indentation to 4 spaces and fix if/for formatting.
[bup.git] / t / test-meta.sh
1 #!/usr/bin/env bash
2 . wvtest.sh
3
4 TOP="$(pwd)"
5 export BUP_DIR="$TOP/buptest.tmp"
6
7 bup()
8 {
9     "$TOP/bup" "$@"
10 }
11
12 # Very simple metadata tests -- "make install" to a temp directory,
13 # then check that bup meta can reproduce the metadata correctly
14 # (according to coreutils stat) via create, extract, start-extract,
15 # and finish-extract.  The current tests are crude, and this does not
16 # test devices, varying users/groups, acls, attrs, etc.
17
18 genstat()
19 {
20     (
21         export PATH="$TOP:$PATH" # pick up bup
22         # Skip atime (test elsewhere) to avoid the observer effect.
23         find . | sort | xargs bup xstat --exclude-fields ctime,atime
24     )
25 }
26
27 actually-root()
28 {
29     test "$(whoami)" == root -a -z "$FAKEROOTKEY"
30 }
31
32 force-delete()
33 {
34     if ! actually-root; then
35         rm -rf "$@"
36     else
37         # Go to greater lengths to deal with any test detritus.
38         for f in "$@"; do
39             test -e "$@" || continue
40             chattr -fR = "$@" || true
41             setfacl -Rb "$@"
42             rm -r "$@"
43         done
44     fi
45 }
46
47 test-src-create-extract()
48 {
49     # Test bup meta create/extract for ./src -> ./src-restore.
50     # Also writes to ./src-stat and ./src-restore-stat.
51     (
52         (cd src && WVPASS genstat) > src-stat
53         WVPASS bup meta --create --recurse --file src.meta src
54         # Test extract.
55         force-delete src-restore
56         mkdir src-restore
57         cd src-restore
58         WVPASS bup meta --extract --file ../src.meta
59         WVPASS test -d src
60         (cd src && genstat >../../src-restore-stat) || WVFAIL
61         WVPASS diff -U5 ../src-stat ../src-restore-stat
62         # Test start/finish extract.
63         force-delete src
64         WVPASS bup meta --start-extract --file ../src.meta
65         WVPASS test -d src
66         WVPASS bup meta --finish-extract --file ../src.meta
67         (cd src && genstat >../../src-restore-stat) || WVFAIL
68         WVPASS diff -U5 ../src-stat ../src-restore-stat
69     )
70 }
71
72 if actually-root; then
73     umount "$TOP/bupmeta.tmp/testfs" || true
74 fi
75
76 force-delete "$BUP_DIR"
77 force-delete "$TOP/bupmeta.tmp"
78
79 # Create a test tree.
80 (
81     mkdir -p "$TOP/bupmeta.tmp"
82     make DESTDIR="$TOP/bupmeta.tmp/src" install
83     mkdir "$TOP/bupmeta.tmp/src/misc"
84     cp -a cmd/bup-* "$TOP/bupmeta.tmp/src/misc/"
85 ) || WVFAIL
86
87 # Use the test tree to check bup meta.
88 WVSTART 'meta - general'
89 (
90     cd "$TOP/bupmeta.tmp"
91     test-src-create-extract
92 )
93
94 # Root-only tests: ACLs, Linux attr, Linux xattr, etc.
95 if actually-root; then
96     (
97         cleanup_at_exit()
98         {
99             cd "$TOP"
100             umount "$TOP/bupmeta.tmp/testfs" || true
101         }
102
103         trap cleanup_at_exit EXIT
104
105         WVSTART 'meta - general (as root)'
106         WVPASS cd "$TOP/bupmeta.tmp"
107         umount testfs || true
108         dd if=/dev/zero of=testfs.img bs=1M count=32
109         mke2fs -F -j -m 0 testfs.img
110         mkdir testfs
111         mount -o loop,acl,user_xattr testfs.img testfs
112         # Hide, so that tests can't create risks.
113         chown root:root testfs
114         chmod 0700 testfs
115
116         cp -a src testfs/src
117         (cd testfs && test-src-create-extract)
118
119         WVSTART 'meta - atime (as root)'
120         force-delete testfs/src
121         mkdir testfs/src
122         (
123             mkdir testfs/src/foo
124             touch testfs/src/bar
125             PYTHONPATH="$TOP/lib" \
126                 python -c "from bup.xstat import lutime, FSTime; \
127                 x = FSTime.from_secs(42);\
128                    lutime('testfs/src/foo', (x, x));\
129                    lutime('testfs/src/bar', (x, x));"
130             cd testfs
131             WVPASS bup meta -v --create --recurse --file src.meta src
132             bup meta -tvf src.meta
133             # Test extract.
134             force-delete src-restore
135             mkdir src-restore
136             cd src-restore
137             WVPASS bup meta --extract --file ../src.meta
138             WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
139             WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
140             # Test start/finish extract.
141             force-delete src
142             WVPASS bup meta --start-extract --file ../src.meta
143             WVPASS test -d src
144             WVPASS bup meta --finish-extract --file ../src.meta
145             WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
146             WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
147         )
148
149         WVSTART 'meta - Linux attr (as root)'
150         force-delete testfs/src
151         mkdir testfs/src
152         (
153             touch testfs/src/foo
154             mkdir testfs/src/bar
155             chattr +acdeijstuADST testfs/src/foo
156             chattr +acdeijstuADST testfs/src/bar
157             (cd testfs && test-src-create-extract)
158         )
159
160         WVSTART 'meta - Linux xattr (as root)'
161         force-delete testfs/src
162         mkdir testfs/src
163         (
164             touch testfs/src/foo
165             mkdir testfs/src/bar
166             attr -s foo -V bar testfs/src/foo
167             attr -s foo -V bar testfs/src/bar
168             (cd testfs && test-src-create-extract)
169         )
170
171         WVSTART 'meta - POSIX.1e ACLs (as root)'
172         force-delete testfs/src
173         mkdir testfs/src
174         (
175             touch testfs/src/foo
176             mkdir testfs/src/bar
177             setfacl -m u:root:r testfs/src/foo
178             setfacl -m u:root:r testfs/src/bar
179             (cd testfs && test-src-create-extract)
180         )
181     )
182 fi
183
184 exit 0