5 from bup import metadata
6 from bup.helpers import detect_fakeroot
11 def test__normalize_ts():
12 normalize = metadata._normalize_ts
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))
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(''), '.')
49 def test_risky_path():
50 risky = metadata._risky_path
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'))
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'))
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')
93 def test_from_path_error():
94 if os.geteuid == 0 or detect_fakeroot():
96 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
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,
109 subprocess.call(['rm', '-rf', tmpdir])
113 def test_apply_to_path_error():
114 if os.geteuid == 0 or detect_fakeroot():
116 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
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])
127 subprocess.call(['rm', '-rf', tmpdir])
131 def test_restore_restricted_user_group():
132 if os.geteuid == 0 or detect_fakeroot():
134 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
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)
143 WVEXCEPT(metadata.MetadataApplicationError,
144 m.apply_to_path, path, restore_numeric_ids=True)
147 WVEXCEPT(metadata.MetadataApplicationError,
148 m.apply_to_path, path, restore_numeric_ids=True)
150 subprocess.call(['rm', '-rf', tmpdir])
154 def test_restore_nonexistent_user_group():
155 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
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())
170 subprocess.call(['rm', '-rf', tmpdir])