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