]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tmetadata.py
Defer metadata aquisition and application errors during create/extract.
[bup.git] / lib / bup / t / tmetadata.py
1 import tempfile
2 import subprocess
3 from bup import metadata
4 from wvtest import *
5
6
7 @wvtest
8 def test__normalize_ts():
9     normalize = metadata._normalize_ts
10     bns = 10**9
11     for ts in ((0, 0), (-1, 0), (0, bns - 1), (-1, bns - 1)):
12         WVPASSEQ(normalize(ts), ts)
13     WVPASSEQ(normalize((0, -1)), (-1, bns - 1))
14     WVPASSEQ(normalize((-1, -1)), (-2, bns - 1))
15     WVPASSEQ(normalize((0, bns)), (1, 0))
16     WVPASSEQ(normalize((0, bns + 1)), (1, 1))
17     WVPASSEQ(normalize((0, -bns)), (-1, 0))
18     WVPASSEQ(normalize((0, -(bns + 1))), (-2, bns - 1))
19     WVPASSEQ(normalize((0, 3 * bns)), (3, 0))
20     WVPASSEQ(normalize((0, -3 * bns)), (-3, 0))
21
22
23 @wvtest
24 def test_clean_up_archive_path():
25     cleanup = metadata._clean_up_path_for_archive
26     WVPASSEQ(cleanup('foo'), 'foo')
27     WVPASSEQ(cleanup('/foo'), 'foo')
28     WVPASSEQ(cleanup('///foo'), 'foo')
29     WVPASSEQ(cleanup('/foo/bar'), 'foo/bar')
30     WVPASSEQ(cleanup('foo/./bar'), 'foo/bar')
31     WVPASSEQ(cleanup('/foo/./bar'), 'foo/bar')
32     WVPASSEQ(cleanup('/foo/./bar/././baz'), 'foo/bar/baz')
33     WVPASSEQ(cleanup('/foo/./bar///././baz'), 'foo/bar/baz')
34     WVPASSEQ(cleanup('//./foo/./bar///././baz/.///'), 'foo/bar/baz/')
35     WVPASSEQ(cleanup('./foo/./.bar'), 'foo/.bar')
36     WVPASSEQ(cleanup('./foo/.'), 'foo')
37     WVPASSEQ(cleanup('./foo/..'), '.')
38     WVPASSEQ(cleanup('//./..//.../..//.'), '.')
39     WVPASSEQ(cleanup('//./..//..././/.'), '...')
40     WVPASSEQ(cleanup('/////.'), '.')
41     WVPASSEQ(cleanup('/../'), '.')
42     WVPASSEQ(cleanup(''), '.')
43
44
45 @wvtest
46 def test_risky_path():
47     risky = metadata._risky_path
48     WVPASS(risky('/foo'))
49     WVPASS(risky('///foo'))
50     WVPASS(risky('/../foo'))
51     WVPASS(risky('../foo'))
52     WVPASS(risky('foo/..'))
53     WVPASS(risky('foo/../'))
54     WVPASS(risky('foo/../bar'))
55     WVFAIL(risky('foo'))
56     WVFAIL(risky('foo/'))
57     WVFAIL(risky('foo///'))
58     WVFAIL(risky('./foo'))
59     WVFAIL(risky('foo/.'))
60     WVFAIL(risky('./foo/.'))
61     WVFAIL(risky('foo/bar'))
62     WVFAIL(risky('foo/./bar'))
63
64
65 @wvtest
66 def test_clean_up_extract_path():
67     cleanup = metadata._clean_up_extract_path
68     WVPASSEQ(cleanup('/foo'), 'foo')
69     WVPASSEQ(cleanup('///foo'), 'foo')
70     WVFAIL(cleanup('/../foo'))
71     WVFAIL(cleanup('../foo'))
72     WVFAIL(cleanup('foo/..'))
73     WVFAIL(cleanup('foo/../'))
74     WVFAIL(cleanup('foo/../bar'))
75     WVPASSEQ(cleanup('foo'), 'foo')
76     WVPASSEQ(cleanup('foo/'), 'foo/')
77     WVPASSEQ(cleanup('foo///'), 'foo///')
78     WVPASSEQ(cleanup('./foo'), './foo')
79     WVPASSEQ(cleanup('foo/.'), 'foo/.')
80     WVPASSEQ(cleanup('./foo/.'), './foo/.')
81     WVPASSEQ(cleanup('foo/bar'), 'foo/bar')
82     WVPASSEQ(cleanup('foo/./bar'), 'foo/./bar')
83     WVPASSEQ(cleanup('/'), '.')
84     WVPASSEQ(cleanup('./'), './')
85     WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
86     WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
87
88
89 @wvtest
90 def test_from_path_error():
91     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
92     try:
93         path = tmpdir + '/foo'
94         subprocess.call(['mkdir', path])
95         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
96         WVPASSEQ(m.path, path)
97         subprocess.call(['chmod', '000', path])
98         WVEXCEPT(metadata.MetadataAcquisitionError,
99                  metadata.from_path,
100                  path,
101                  archive_path=path,
102                  save_symlinks=True)
103     finally:
104         subprocess.call(['rm', '-rf', tmpdir])
105
106
107 @wvtest
108 def test_apply_to_path_error():
109     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
110     try:
111         path = tmpdir + '/foo'
112         subprocess.call(['mkdir', path])
113         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
114         WVPASSEQ(m.path, path)
115         subprocess.call(['chmod', '000', tmpdir])
116         WVEXCEPT(metadata.MetadataApplicationError,
117                  m.apply_to_path, path)
118         subprocess.call(['chmod', '700', tmpdir])
119     finally:
120         subprocess.call(['rm', '-rf', tmpdir])