3 from bup import metadata
4 from bup.helpers import detect_fakeroot
9 def test__normalize_ts():
10 normalize = metadata._normalize_ts
12 for ts in ((0, 0), (-1, 0), (0, bns - 1), (-1, bns - 1)):
13 WVPASSEQ(normalize(ts), ts)
14 WVPASSEQ(normalize((0, -1)), (-1, bns - 1))
15 WVPASSEQ(normalize((-1, -1)), (-2, bns - 1))
16 WVPASSEQ(normalize((0, bns)), (1, 0))
17 WVPASSEQ(normalize((0, bns + 1)), (1, 1))
18 WVPASSEQ(normalize((0, -bns)), (-1, 0))
19 WVPASSEQ(normalize((0, -(bns + 1))), (-2, bns - 1))
20 WVPASSEQ(normalize((0, 3 * bns)), (3, 0))
21 WVPASSEQ(normalize((0, -3 * bns)), (-3, 0))
25 def test_clean_up_archive_path():
26 cleanup = metadata._clean_up_path_for_archive
27 WVPASSEQ(cleanup('foo'), 'foo')
28 WVPASSEQ(cleanup('/foo'), 'foo')
29 WVPASSEQ(cleanup('///foo'), 'foo')
30 WVPASSEQ(cleanup('/foo/bar'), 'foo/bar')
31 WVPASSEQ(cleanup('foo/./bar'), 'foo/bar')
32 WVPASSEQ(cleanup('/foo/./bar'), 'foo/bar')
33 WVPASSEQ(cleanup('/foo/./bar/././baz'), 'foo/bar/baz')
34 WVPASSEQ(cleanup('/foo/./bar///././baz'), 'foo/bar/baz')
35 WVPASSEQ(cleanup('//./foo/./bar///././baz/.///'), 'foo/bar/baz/')
36 WVPASSEQ(cleanup('./foo/./.bar'), 'foo/.bar')
37 WVPASSEQ(cleanup('./foo/.'), 'foo')
38 WVPASSEQ(cleanup('./foo/..'), '.')
39 WVPASSEQ(cleanup('//./..//.../..//.'), '.')
40 WVPASSEQ(cleanup('//./..//..././/.'), '...')
41 WVPASSEQ(cleanup('/////.'), '.')
42 WVPASSEQ(cleanup('/../'), '.')
43 WVPASSEQ(cleanup(''), '.')
47 def test_risky_path():
48 risky = metadata._risky_path
50 WVPASS(risky('///foo'))
51 WVPASS(risky('/../foo'))
52 WVPASS(risky('../foo'))
53 WVPASS(risky('foo/..'))
54 WVPASS(risky('foo/../'))
55 WVPASS(risky('foo/../bar'))
58 WVFAIL(risky('foo///'))
59 WVFAIL(risky('./foo'))
60 WVFAIL(risky('foo/.'))
61 WVFAIL(risky('./foo/.'))
62 WVFAIL(risky('foo/bar'))
63 WVFAIL(risky('foo/./bar'))
67 def test_clean_up_extract_path():
68 cleanup = metadata._clean_up_extract_path
69 WVPASSEQ(cleanup('/foo'), 'foo')
70 WVPASSEQ(cleanup('///foo'), 'foo')
71 WVFAIL(cleanup('/../foo'))
72 WVFAIL(cleanup('../foo'))
73 WVFAIL(cleanup('foo/..'))
74 WVFAIL(cleanup('foo/../'))
75 WVFAIL(cleanup('foo/../bar'))
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/.'), './foo/.')
82 WVPASSEQ(cleanup('foo/bar'), 'foo/bar')
83 WVPASSEQ(cleanup('foo/./bar'), 'foo/./bar')
84 WVPASSEQ(cleanup('/'), '.')
85 WVPASSEQ(cleanup('./'), './')
86 WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
87 WVPASSEQ(cleanup('///foo/bar'), 'foo/bar')
91 def test_from_path_error():
92 if os.geteuid == 0 or detect_fakeroot():
94 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
96 path = tmpdir + '/foo'
97 subprocess.call(['mkdir', path])
98 m = metadata.from_path(path, archive_path=path, save_symlinks=True)
99 WVPASSEQ(m.path, path)
100 subprocess.call(['chmod', '000', path])
101 WVEXCEPT(metadata.MetadataAcquisitionError,
107 subprocess.call(['rm', '-rf', tmpdir])
111 def test_apply_to_path_error():
112 if os.geteuid == 0 or detect_fakeroot():
114 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
116 path = tmpdir + '/foo'
117 subprocess.call(['mkdir', path])
118 m = metadata.from_path(path, archive_path=path, save_symlinks=True)
119 WVPASSEQ(m.path, path)
120 subprocess.call(['chmod', '000', tmpdir])
121 WVEXCEPT(metadata.MetadataApplicationError,
122 m.apply_to_path, path)
123 subprocess.call(['chmod', '700', tmpdir])
125 subprocess.call(['rm', '-rf', tmpdir])
129 def test_restore_restricted_user_group():
130 if os.geteuid == 0 or detect_fakeroot():
132 tmpdir = tempfile.mkdtemp(prefix='bup-tmetadata-')
134 path = tmpdir + '/foo'
135 subprocess.call(['mkdir', path])
136 m = metadata.from_path(path, archive_path=path, save_symlinks=True)
137 WVPASSEQ(m.path, path)
138 WVPASSEQ(m.apply_to_path(path), None)
141 WVEXCEPT(metadata.MetadataApplicationError,
142 m.apply_to_path, path, restore_numeric_ids=True)
145 WVEXCEPT(metadata.MetadataApplicationError,
146 m.apply_to_path, path, restore_numeric_ids=True)
148 subprocess.call(['rm', '-rf', tmpdir])