]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tmetadata.py
Check stat() after attempted restore of nonexistent owner/group in tests.
[bup.git] / lib / bup / t / tmetadata.py
1 import grp
2 import pwd
3 import subprocess
4 import tempfile
5 from bup import metadata
6 from bup.helpers import detect_fakeroot
7 from wvtest import *
8
9
10 @wvtest
11 def test__normalize_ts():
12     normalize = metadata._normalize_ts
13     bns = 10**9
14     for ts in ((0, 0), (-1, 0), (0, bns - 1), (-1, bns - 1)):
15         WVPASSEQ(normalize(ts), ts)
16     WVPASSEQ(normalize((0, -1)), (-1, bns - 1))
17     WVPASSEQ(normalize((-1, -1)), (-2, bns - 1))
18     WVPASSEQ(normalize((0, bns)), (1, 0))
19     WVPASSEQ(normalize((0, bns + 1)), (1, 1))
20     WVPASSEQ(normalize((0, -bns)), (-1, 0))
21     WVPASSEQ(normalize((0, -(bns + 1))), (-2, bns - 1))
22     WVPASSEQ(normalize((0, 3 * bns)), (3, 0))
23     WVPASSEQ(normalize((0, -3 * bns)), (-3, 0))
24
25
26 @wvtest
27 def test_clean_up_archive_path():
28     cleanup = metadata._clean_up_path_for_archive
29     WVPASSEQ(cleanup('foo'), 'foo')
30     WVPASSEQ(cleanup('/foo'), 'foo')
31     WVPASSEQ(cleanup('///foo'), 'foo')
32     WVPASSEQ(cleanup('/foo/bar'), 'foo/bar')
33     WVPASSEQ(cleanup('foo/./bar'), 'foo/bar')
34     WVPASSEQ(cleanup('/foo/./bar'), 'foo/bar')
35     WVPASSEQ(cleanup('/foo/./bar/././baz'), 'foo/bar/baz')
36     WVPASSEQ(cleanup('/foo/./bar///././baz'), 'foo/bar/baz')
37     WVPASSEQ(cleanup('//./foo/./bar///././baz/.///'), 'foo/bar/baz/')
38     WVPASSEQ(cleanup('./foo/./.bar'), 'foo/.bar')
39     WVPASSEQ(cleanup('./foo/.'), 'foo')
40     WVPASSEQ(cleanup('./foo/..'), '.')
41     WVPASSEQ(cleanup('//./..//.../..//.'), '.')
42     WVPASSEQ(cleanup('//./..//..././/.'), '...')
43     WVPASSEQ(cleanup('/////.'), '.')
44     WVPASSEQ(cleanup('/../'), '.')
45     WVPASSEQ(cleanup(''), '.')
46
47
48 @wvtest
49 def test_risky_path():
50     risky = metadata._risky_path
51     WVPASS(risky('/foo'))
52     WVPASS(risky('///foo'))
53     WVPASS(risky('/../foo'))
54     WVPASS(risky('../foo'))
55     WVPASS(risky('foo/..'))
56     WVPASS(risky('foo/../'))
57     WVPASS(risky('foo/../bar'))
58     WVFAIL(risky('foo'))
59     WVFAIL(risky('foo/'))
60     WVFAIL(risky('foo///'))
61     WVFAIL(risky('./foo'))
62     WVFAIL(risky('foo/.'))
63     WVFAIL(risky('./foo/.'))
64     WVFAIL(risky('foo/bar'))
65     WVFAIL(risky('foo/./bar'))
66
67
68 @wvtest
69 def test_clean_up_extract_path():
70     cleanup = metadata._clean_up_extract_path
71     WVPASSEQ(cleanup('/foo'), 'foo')
72     WVPASSEQ(cleanup('///foo'), 'foo')
73     WVFAIL(cleanup('/../foo'))
74     WVFAIL(cleanup('../foo'))
75     WVFAIL(cleanup('foo/..'))
76     WVFAIL(cleanup('foo/../'))
77     WVFAIL(cleanup('foo/../bar'))
78     WVPASSEQ(cleanup('foo'), 'foo')
79     WVPASSEQ(cleanup('foo/'), 'foo/')
80     WVPASSEQ(cleanup('foo///'), 'foo///')
81     WVPASSEQ(cleanup('./foo'), './foo')
82     WVPASSEQ(cleanup('foo/.'), 'foo/.')
83     WVPASSEQ(cleanup('./foo/.'), './foo/.')
84     WVPASSEQ(cleanup('foo/bar'), 'foo/bar')
85     WVPASSEQ(cleanup('foo/./bar'), 'foo/./bar')
86     WVPASSEQ(cleanup('/'), '.')
87     WVPASSEQ(cleanup('./'), './')
88     WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
89     WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
90
91
92 @wvtest
93 def test_from_path_error():
94     if os.geteuid == 0 or detect_fakeroot():
95         return
96     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
97     try:
98         path = tmpdir + '/foo'
99         subprocess.call(['mkdir', path])
100         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
101         WVPASSEQ(m.path, path)
102         subprocess.call(['chmod', '000', path])
103         WVEXCEPT(metadata.MetadataAcquisitionError,
104                  metadata.from_path,
105                  path,
106                  archive_path=path,
107                  save_symlinks=True)
108     finally:
109         subprocess.call(['rm', '-rf', tmpdir])
110
111
112 @wvtest
113 def test_apply_to_path_error():
114     if os.geteuid == 0 or detect_fakeroot():
115         return
116     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
117     try:
118         path = tmpdir + '/foo'
119         subprocess.call(['mkdir', path])
120         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
121         WVPASSEQ(m.path, path)
122         subprocess.call(['chmod', '000', tmpdir])
123         WVEXCEPT(metadata.MetadataApplicationError,
124                  m.apply_to_path, path)
125         subprocess.call(['chmod', '700', tmpdir])
126     finally:
127         subprocess.call(['rm', '-rf', tmpdir])
128
129
130 @wvtest
131 def test_restore_restricted_user_group():
132     if os.geteuid == 0 or detect_fakeroot():
133         return
134     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
135     try:
136         path = tmpdir + '/foo'
137         subprocess.call(['mkdir', path])
138         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
139         WVPASSEQ(m.path, path)
140         WVPASSEQ(m.apply_to_path(path), None)
141         orig_uid = m.uid
142         m.uid = 0;
143         WVEXCEPT(metadata.MetadataApplicationError,
144                  m.apply_to_path, path, restore_numeric_ids=True)
145         m.uid = orig_uid
146         m.gid = 0;
147         WVEXCEPT(metadata.MetadataApplicationError,
148                  m.apply_to_path, path, restore_numeric_ids=True)
149     finally:
150         subprocess.call(['rm', '-rf', tmpdir])
151
152
153 @wvtest
154 def test_restore_nonexistent_user_group():
155     tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
156     try:
157         path = tmpdir + '/foo'
158         subprocess.call(['mkdir', path])
159         m = metadata.from_path(path, archive_path=path, save_symlinks=True)
160         WVPASSEQ(m.path, path)
161         m.owner = max([x.pw_name for x in pwd.getpwall()], key=len) + 'x'
162         m.group = max([x.gr_name for x in grp.getgrall()], key=len) + 'x'
163         WVPASSEQ(m.apply_to_path(path, restore_numeric_ids=True), None)
164         WVPASSEQ(os.stat(path).st_uid, m.uid)
165         WVPASSEQ(os.stat(path).st_gid, m.gid)
166         WVPASSEQ(m.apply_to_path(path, restore_numeric_ids=False), None)
167         WVPASSEQ(os.stat(path).st_uid, os.geteuid())
168         WVPASSEQ(os.stat(path).st_uid, os.getgid())
169     finally:
170         subprocess.call(['rm', '-rf', tmpdir])