]> arthur.barton.de Git - bup.git/blob - test/ext/test-save-data-race
test-fuse: improve/broaden applicability checks
[bup.git] / test / ext / test-save-data-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_file_save.py" << EOF
19
20 import os, time
21 import bup.cmd.save
22
23 def test_save_data_race_pause_save(name):
24     if name == b'$tmpdir/save/data':
25         with open('$tmpdir/waiting-to-save', 'w') as f:
26              pass
27         while os.path.exists('$tmpdir/block-save'):
28            time.sleep(0.01)
29
30 bup.cmd.save.before_saving_regular_file = test_save_data_race_pause_save
31
32 EOF
33
34 instrumented-bup()
35 {
36     PYTHONPATH="$tmpdir/mod" bup --import-py-module pause_file_save "$@"
37 }
38
39 WVPASS cd "$tmpdir"
40 WVPASS bup init
41 WVPASS mkdir "$tmpdir/save"
42 WVPASS echo "some random file content" > "$tmpdir/save/data"
43 WVPASS bup index "$tmpdir/save"
44 WVPASS touch "$tmpdir/block-save"
45
46 (
47     set -e
48     while ! test -e "$tmpdir/waiting-to-save"; do
49         "$top/dev/python" -c 'import time; time.sleep(0.01)'
50     done
51     echo 'truncated' > "$tmpdir/save/data"
52     rm "$tmpdir/block-save"
53 ) &
54 truncator=$!
55 trap "kill $truncator" EXIT
56
57 WVPASS instrumented-bup save -n test "$tmpdir/save"
58
59 meta_size=$(WVPASS bup ls -nl "test/latest/$tmpdir/save/data" |
60                 sed 's/[^ ]* [^ ]* *\([^ ]*\).*/\1/')
61 data_size=$(git -C "$BUP_DIR" show $(WVPASS bup ls -ls "test/latest/$tmpdir/save/data" |
62                                          sed 's/ .*//') | wc -c)
63 WVPASSEQ 10 $meta_size
64 WVPASSEQ 10 $data_size
65
66 WVPASS rm -rf "$tmpdir"