]> arthur.barton.de Git - bup.git/blob - test/ext/test-save-symlink-race
test-fuse: improve/broaden applicability checks
[bup.git] / test / ext / test-save-symlink-race
1 #!/usr/bin/env bash
2 . wvtest.sh
3 . wvtest-bup.sh
4 . dev/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 # Inject code to coordinate test
15
16 WVPASS rm -rf "$tmpdir/mod"
17 WVPASS mkdir -p "$tmpdir/mod"
18 cat > "$tmpdir/mod/pause_after_save_stat.py" << EOF
19
20 import os, time
21 import bup.cmd.save
22
23 import sys
24
25 def test_save_symlink_race_pause_save(name):
26     if name == b'$tmpdir/save/link':
27         with open('$tmpdir/waiting-after-save-stat', 'w') as f:
28              pass
29         while os.path.exists('$tmpdir/block-save'):
30            time.sleep(0.01)
31
32 bup.cmd.save.after_nondir_metadata_stat = test_save_symlink_race_pause_save
33
34 EOF
35
36 instrumented-bup()
37 {
38     PYTHONPATH="$tmpdir/mod" bup --import-py-module pause_after_save_stat "$@"
39 }
40
41 WVPASS cd "$tmpdir"
42 WVPASS bup init
43 WVPASS mkdir "$tmpdir/save"
44
45 WVSTART "symlink metadata vs. content race"
46 WVPASS ln -sf a "$tmpdir/save/link"
47 WVPASS bup index "$tmpdir/save"
48 WVPASS touch "$tmpdir/block-save"
49
50 (
51     set -e
52     while ! test -e "$tmpdir/waiting-after-save-stat"; do
53         "$top/dev/python" -c 'import time; time.sleep(0.01)'
54     done
55     ln -sf abc "$tmpdir/save/link"
56     rm "$tmpdir/block-save"
57 ) &
58 truncator=$!
59 trap "kill $truncator" EXIT
60
61 WVPASS instrumented-bup save -n test "$tmpdir/save"
62
63 meta_tgt=$(WVPASS bup ls -ls "test/latest/$tmpdir/save/link" |
64                sed 's/.* -> //')
65 data_tgt=$(git -C "$BUP_DIR" show $(WVPASS bup ls -ls "test/latest/$tmpdir/save/link" |
66                                         sed 's/ .*//'))
67 WVPASSEQ abc $meta_tgt
68 WVPASSEQ abc $data_tgt
69
70 WVPASS rm -rf "$tmpdir"