]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | """Tests for distutils.archive_util."""\r |
2 | __revision__ = "$Id$"\r | |
3 | \r | |
4 | import unittest\r | |
5 | import os\r | |
6 | import tarfile\r | |
7 | from os.path import splitdrive\r | |
8 | import warnings\r | |
9 | \r | |
10 | from distutils.archive_util import (check_archive_formats, make_tarball,\r | |
11 | make_zipfile, make_archive,\r | |
12 | ARCHIVE_FORMATS)\r | |
13 | from distutils.spawn import find_executable, spawn\r | |
14 | from distutils.tests import support\r | |
15 | from test.test_support import check_warnings, run_unittest\r | |
16 | \r | |
17 | try:\r | |
18 | import grp\r | |
19 | import pwd\r | |
20 | UID_GID_SUPPORT = True\r | |
21 | except ImportError:\r | |
22 | UID_GID_SUPPORT = False\r | |
23 | \r | |
24 | try:\r | |
25 | import zipfile\r | |
26 | ZIP_SUPPORT = True\r | |
27 | except ImportError:\r | |
28 | ZIP_SUPPORT = find_executable('zip')\r | |
29 | \r | |
30 | # some tests will fail if zlib is not available\r | |
31 | try:\r | |
32 | import zlib\r | |
33 | except ImportError:\r | |
34 | zlib = None\r | |
35 | \r | |
36 | \r | |
37 | class ArchiveUtilTestCase(support.TempdirManager,\r | |
38 | support.LoggingSilencer,\r | |
39 | unittest.TestCase):\r | |
40 | \r | |
41 | @unittest.skipUnless(zlib, "requires zlib")\r | |
42 | def test_make_tarball(self):\r | |
43 | # creating something to tar\r | |
44 | tmpdir = self.mkdtemp()\r | |
45 | self.write_file([tmpdir, 'file1'], 'xxx')\r | |
46 | self.write_file([tmpdir, 'file2'], 'xxx')\r | |
47 | os.mkdir(os.path.join(tmpdir, 'sub'))\r | |
48 | self.write_file([tmpdir, 'sub', 'file3'], 'xxx')\r | |
49 | \r | |
50 | tmpdir2 = self.mkdtemp()\r | |
51 | unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],\r | |
52 | "source and target should be on same drive")\r | |
53 | \r | |
54 | base_name = os.path.join(tmpdir2, 'archive')\r | |
55 | \r | |
56 | # working with relative paths to avoid tar warnings\r | |
57 | old_dir = os.getcwd()\r | |
58 | os.chdir(tmpdir)\r | |
59 | try:\r | |
60 | make_tarball(splitdrive(base_name)[1], '.')\r | |
61 | finally:\r | |
62 | os.chdir(old_dir)\r | |
63 | \r | |
64 | # check if the compressed tarball was created\r | |
65 | tarball = base_name + '.tar.gz'\r | |
66 | self.assertTrue(os.path.exists(tarball))\r | |
67 | \r | |
68 | # trying an uncompressed one\r | |
69 | base_name = os.path.join(tmpdir2, 'archive')\r | |
70 | old_dir = os.getcwd()\r | |
71 | os.chdir(tmpdir)\r | |
72 | try:\r | |
73 | make_tarball(splitdrive(base_name)[1], '.', compress=None)\r | |
74 | finally:\r | |
75 | os.chdir(old_dir)\r | |
76 | tarball = base_name + '.tar'\r | |
77 | self.assertTrue(os.path.exists(tarball))\r | |
78 | \r | |
79 | def _tarinfo(self, path):\r | |
80 | tar = tarfile.open(path)\r | |
81 | try:\r | |
82 | names = tar.getnames()\r | |
83 | names.sort()\r | |
84 | return tuple(names)\r | |
85 | finally:\r | |
86 | tar.close()\r | |
87 | \r | |
88 | def _create_files(self):\r | |
89 | # creating something to tar\r | |
90 | tmpdir = self.mkdtemp()\r | |
91 | dist = os.path.join(tmpdir, 'dist')\r | |
92 | os.mkdir(dist)\r | |
93 | self.write_file([dist, 'file1'], 'xxx')\r | |
94 | self.write_file([dist, 'file2'], 'xxx')\r | |
95 | os.mkdir(os.path.join(dist, 'sub'))\r | |
96 | self.write_file([dist, 'sub', 'file3'], 'xxx')\r | |
97 | os.mkdir(os.path.join(dist, 'sub2'))\r | |
98 | tmpdir2 = self.mkdtemp()\r | |
99 | base_name = os.path.join(tmpdir2, 'archive')\r | |
100 | return tmpdir, tmpdir2, base_name\r | |
101 | \r | |
102 | @unittest.skipUnless(zlib, "Requires zlib")\r | |
103 | @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),\r | |
104 | 'Need the tar command to run')\r | |
105 | def test_tarfile_vs_tar(self):\r | |
106 | tmpdir, tmpdir2, base_name = self._create_files()\r | |
107 | old_dir = os.getcwd()\r | |
108 | os.chdir(tmpdir)\r | |
109 | try:\r | |
110 | make_tarball(base_name, 'dist')\r | |
111 | finally:\r | |
112 | os.chdir(old_dir)\r | |
113 | \r | |
114 | # check if the compressed tarball was created\r | |
115 | tarball = base_name + '.tar.gz'\r | |
116 | self.assertTrue(os.path.exists(tarball))\r | |
117 | \r | |
118 | # now create another tarball using `tar`\r | |
119 | tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')\r | |
120 | tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']\r | |
121 | gzip_cmd = ['gzip', '-f9', 'archive2.tar']\r | |
122 | old_dir = os.getcwd()\r | |
123 | os.chdir(tmpdir)\r | |
124 | try:\r | |
125 | spawn(tar_cmd)\r | |
126 | spawn(gzip_cmd)\r | |
127 | finally:\r | |
128 | os.chdir(old_dir)\r | |
129 | \r | |
130 | self.assertTrue(os.path.exists(tarball2))\r | |
131 | # let's compare both tarballs\r | |
132 | self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2))\r | |
133 | \r | |
134 | # trying an uncompressed one\r | |
135 | base_name = os.path.join(tmpdir2, 'archive')\r | |
136 | old_dir = os.getcwd()\r | |
137 | os.chdir(tmpdir)\r | |
138 | try:\r | |
139 | make_tarball(base_name, 'dist', compress=None)\r | |
140 | finally:\r | |
141 | os.chdir(old_dir)\r | |
142 | tarball = base_name + '.tar'\r | |
143 | self.assertTrue(os.path.exists(tarball))\r | |
144 | \r | |
145 | # now for a dry_run\r | |
146 | base_name = os.path.join(tmpdir2, 'archive')\r | |
147 | old_dir = os.getcwd()\r | |
148 | os.chdir(tmpdir)\r | |
149 | try:\r | |
150 | make_tarball(base_name, 'dist', compress=None, dry_run=True)\r | |
151 | finally:\r | |
152 | os.chdir(old_dir)\r | |
153 | tarball = base_name + '.tar'\r | |
154 | self.assertTrue(os.path.exists(tarball))\r | |
155 | \r | |
156 | @unittest.skipUnless(find_executable('compress'),\r | |
157 | 'The compress program is required')\r | |
158 | def test_compress_deprecated(self):\r | |
159 | tmpdir, tmpdir2, base_name = self._create_files()\r | |
160 | \r | |
161 | # using compress and testing the PendingDeprecationWarning\r | |
162 | old_dir = os.getcwd()\r | |
163 | os.chdir(tmpdir)\r | |
164 | try:\r | |
165 | with check_warnings() as w:\r | |
166 | warnings.simplefilter("always")\r | |
167 | make_tarball(base_name, 'dist', compress='compress')\r | |
168 | finally:\r | |
169 | os.chdir(old_dir)\r | |
170 | tarball = base_name + '.tar.Z'\r | |
171 | self.assertTrue(os.path.exists(tarball))\r | |
172 | self.assertEqual(len(w.warnings), 1)\r | |
173 | \r | |
174 | # same test with dry_run\r | |
175 | os.remove(tarball)\r | |
176 | old_dir = os.getcwd()\r | |
177 | os.chdir(tmpdir)\r | |
178 | try:\r | |
179 | with check_warnings() as w:\r | |
180 | warnings.simplefilter("always")\r | |
181 | make_tarball(base_name, 'dist', compress='compress',\r | |
182 | dry_run=True)\r | |
183 | finally:\r | |
184 | os.chdir(old_dir)\r | |
185 | self.assertTrue(not os.path.exists(tarball))\r | |
186 | self.assertEqual(len(w.warnings), 1)\r | |
187 | \r | |
188 | @unittest.skipUnless(zlib, "Requires zlib")\r | |
189 | @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')\r | |
190 | def test_make_zipfile(self):\r | |
191 | # creating something to tar\r | |
192 | tmpdir = self.mkdtemp()\r | |
193 | self.write_file([tmpdir, 'file1'], 'xxx')\r | |
194 | self.write_file([tmpdir, 'file2'], 'xxx')\r | |
195 | \r | |
196 | tmpdir2 = self.mkdtemp()\r | |
197 | base_name = os.path.join(tmpdir2, 'archive')\r | |
198 | make_zipfile(base_name, tmpdir)\r | |
199 | \r | |
200 | # check if the compressed tarball was created\r | |
201 | tarball = base_name + '.zip'\r | |
202 | \r | |
203 | def test_check_archive_formats(self):\r | |
204 | self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']),\r | |
205 | 'xxx')\r | |
206 | self.assertEqual(check_archive_formats(['gztar', 'zip']), None)\r | |
207 | \r | |
208 | def test_make_archive(self):\r | |
209 | tmpdir = self.mkdtemp()\r | |
210 | base_name = os.path.join(tmpdir, 'archive')\r | |
211 | self.assertRaises(ValueError, make_archive, base_name, 'xxx')\r | |
212 | \r | |
213 | @unittest.skipUnless(zlib, "Requires zlib")\r | |
214 | def test_make_archive_owner_group(self):\r | |
215 | # testing make_archive with owner and group, with various combinations\r | |
216 | # this works even if there's not gid/uid support\r | |
217 | if UID_GID_SUPPORT:\r | |
218 | group = grp.getgrgid(0)[0]\r | |
219 | owner = pwd.getpwuid(0)[0]\r | |
220 | else:\r | |
221 | group = owner = 'root'\r | |
222 | \r | |
223 | base_dir, root_dir, base_name = self._create_files()\r | |
224 | base_name = os.path.join(self.mkdtemp() , 'archive')\r | |
225 | res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner,\r | |
226 | group=group)\r | |
227 | self.assertTrue(os.path.exists(res))\r | |
228 | \r | |
229 | res = make_archive(base_name, 'zip', root_dir, base_dir)\r | |
230 | self.assertTrue(os.path.exists(res))\r | |
231 | \r | |
232 | res = make_archive(base_name, 'tar', root_dir, base_dir,\r | |
233 | owner=owner, group=group)\r | |
234 | self.assertTrue(os.path.exists(res))\r | |
235 | \r | |
236 | res = make_archive(base_name, 'tar', root_dir, base_dir,\r | |
237 | owner='kjhkjhkjg', group='oihohoh')\r | |
238 | self.assertTrue(os.path.exists(res))\r | |
239 | \r | |
240 | @unittest.skipUnless(zlib, "Requires zlib")\r | |
241 | @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")\r | |
242 | def test_tarfile_root_owner(self):\r | |
243 | tmpdir, tmpdir2, base_name = self._create_files()\r | |
244 | old_dir = os.getcwd()\r | |
245 | os.chdir(tmpdir)\r | |
246 | group = grp.getgrgid(0)[0]\r | |
247 | owner = pwd.getpwuid(0)[0]\r | |
248 | try:\r | |
249 | archive_name = make_tarball(base_name, 'dist', compress=None,\r | |
250 | owner=owner, group=group)\r | |
251 | finally:\r | |
252 | os.chdir(old_dir)\r | |
253 | \r | |
254 | # check if the compressed tarball was created\r | |
255 | self.assertTrue(os.path.exists(archive_name))\r | |
256 | \r | |
257 | # now checks the rights\r | |
258 | archive = tarfile.open(archive_name)\r | |
259 | try:\r | |
260 | for member in archive.getmembers():\r | |
261 | self.assertEqual(member.uid, 0)\r | |
262 | self.assertEqual(member.gid, 0)\r | |
263 | finally:\r | |
264 | archive.close()\r | |
265 | \r | |
266 | def test_make_archive_cwd(self):\r | |
267 | current_dir = os.getcwd()\r | |
268 | def _breaks(*args, **kw):\r | |
269 | raise RuntimeError()\r | |
270 | ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file')\r | |
271 | try:\r | |
272 | try:\r | |
273 | make_archive('xxx', 'xxx', root_dir=self.mkdtemp())\r | |
274 | except:\r | |
275 | pass\r | |
276 | self.assertEqual(os.getcwd(), current_dir)\r | |
277 | finally:\r | |
278 | del ARCHIVE_FORMATS['xxx']\r | |
279 | \r | |
280 | def test_suite():\r | |
281 | return unittest.makeSuite(ArchiveUtilTestCase)\r | |
282 | \r | |
283 | if __name__ == "__main__":\r | |
284 | run_unittest(test_suite())\r |