blob: aff426521d9600eee741a0372823297a2ab62b45 [file] [log] [blame]
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +00001"""Tests for distutils.archive_util."""
Tarek Ziadé441efa82009-05-17 15:03:23 +00002__revision__ = "$Id$"
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +00003
4import unittest
5import os
Tarek Ziadé77c8b372009-05-28 13:01:13 +00006import tarfile
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +00007from os.path import splitdrive
Tarek Ziadé77c8b372009-05-28 13:01:13 +00008import warnings
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +00009
10from distutils.archive_util import (check_archive_formats, make_tarball,
Tarek Ziadé53fdb182009-10-24 13:42:10 +000011 make_zipfile, make_archive,
12 ARCHIVE_FORMATS)
Tarek Ziadé77c8b372009-05-28 13:01:13 +000013from distutils.spawn import find_executable, spawn
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000014from distutils.tests import support
Éric Araujob344dd02011-02-02 21:38:37 +000015from test.support import check_warnings, run_unittest
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000016
17try:
18 import zipfile
19 ZIP_SUPPORT = True
20except ImportError:
21 ZIP_SUPPORT = find_executable('zip')
22
23class ArchiveUtilTestCase(support.TempdirManager,
Tarek Ziadée2cedaa2009-05-28 14:02:58 +000024 support.LoggingSilencer,
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000025 unittest.TestCase):
26
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000027 def test_make_tarball(self):
28 # creating something to tar
29 tmpdir = self.mkdtemp()
30 self.write_file([tmpdir, 'file1'], 'xxx')
31 self.write_file([tmpdir, 'file2'], 'xxx')
Tarek Ziadé77c8b372009-05-28 13:01:13 +000032 os.mkdir(os.path.join(tmpdir, 'sub'))
33 self.write_file([tmpdir, 'sub', 'file3'], 'xxx')
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000034
35 tmpdir2 = self.mkdtemp()
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +000036 unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
37 "Source and target should be on same drive")
38
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000039 base_name = os.path.join(tmpdir2, 'archive')
Tarek Ziadé40c00272009-05-18 08:22:38 +000040
41 # working with relative paths to avoid tar warnings
42 old_dir = os.getcwd()
43 os.chdir(tmpdir)
44 try:
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +000045 make_tarball(splitdrive(base_name)[1], '.')
Tarek Ziadé40c00272009-05-18 08:22:38 +000046 finally:
47 os.chdir(old_dir)
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000048
49 # check if the compressed tarball was created
50 tarball = base_name + '.tar.gz'
Georg Brandlab91fde2009-08-13 08:51:18 +000051 self.assertTrue(os.path.exists(tarball))
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000052
53 # trying an uncompressed one
54 base_name = os.path.join(tmpdir2, 'archive')
Tarek Ziadé40c00272009-05-18 08:22:38 +000055 old_dir = os.getcwd()
56 os.chdir(tmpdir)
57 try:
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +000058 make_tarball(splitdrive(base_name)[1], '.', compress=None)
Tarek Ziadé40c00272009-05-18 08:22:38 +000059 finally:
60 os.chdir(old_dir)
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000061 tarball = base_name + '.tar'
Georg Brandlab91fde2009-08-13 08:51:18 +000062 self.assertTrue(os.path.exists(tarball))
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000063
Tarek Ziadé77c8b372009-05-28 13:01:13 +000064 def _tarinfo(self, path):
65 tar = tarfile.open(path)
66 try:
67 names = tar.getnames()
68 names.sort()
69 return tuple(names)
70 finally:
71 tar.close()
72
73 def _create_files(self):
74 # creating something to tar
75 tmpdir = self.mkdtemp()
76 dist = os.path.join(tmpdir, 'dist')
77 os.mkdir(dist)
78 self.write_file([dist, 'file1'], 'xxx')
79 self.write_file([dist, 'file2'], 'xxx')
80 os.mkdir(os.path.join(dist, 'sub'))
81 self.write_file([dist, 'sub', 'file3'], 'xxx')
82 os.mkdir(os.path.join(dist, 'sub2'))
83 tmpdir2 = self.mkdtemp()
84 base_name = os.path.join(tmpdir2, 'archive')
85 return tmpdir, tmpdir2, base_name
86
Tarek Ziadée2cedaa2009-05-28 14:02:58 +000087 @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),
88 'Need the tar command to run')
Tarek Ziadé77c8b372009-05-28 13:01:13 +000089 def test_tarfile_vs_tar(self):
90 tmpdir, tmpdir2, base_name = self._create_files()
91 old_dir = os.getcwd()
92 os.chdir(tmpdir)
93 try:
94 make_tarball(base_name, 'dist')
95 finally:
96 os.chdir(old_dir)
97
98 # check if the compressed tarball was created
99 tarball = base_name + '.tar.gz'
Georg Brandlab91fde2009-08-13 08:51:18 +0000100 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000101
102 # now create another tarball using `tar`
103 tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')
Tarek Ziadée2cedaa2009-05-28 14:02:58 +0000104 tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']
105 gzip_cmd = ['gzip', '-f9', 'archive2.tar']
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000106 old_dir = os.getcwd()
107 os.chdir(tmpdir)
108 try:
Tarek Ziadée2cedaa2009-05-28 14:02:58 +0000109 spawn(tar_cmd)
110 spawn(gzip_cmd)
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000111 finally:
112 os.chdir(old_dir)
113
Georg Brandlab91fde2009-08-13 08:51:18 +0000114 self.assertTrue(os.path.exists(tarball2))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000115 # let's compare both tarballs
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000116 self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000117
118 # trying an uncompressed one
119 base_name = os.path.join(tmpdir2, 'archive')
120 old_dir = os.getcwd()
121 os.chdir(tmpdir)
122 try:
123 make_tarball(base_name, 'dist', compress=None)
124 finally:
125 os.chdir(old_dir)
126 tarball = base_name + '.tar'
Georg Brandlab91fde2009-08-13 08:51:18 +0000127 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000128
129 # now for a dry_run
130 base_name = os.path.join(tmpdir2, 'archive')
131 old_dir = os.getcwd()
132 os.chdir(tmpdir)
133 try:
134 make_tarball(base_name, 'dist', compress=None, dry_run=True)
135 finally:
136 os.chdir(old_dir)
137 tarball = base_name + '.tar'
Georg Brandlab91fde2009-08-13 08:51:18 +0000138 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000139
140 @unittest.skipUnless(find_executable('compress'),
141 'The compress program is required')
142 def test_compress_deprecated(self):
143 tmpdir, tmpdir2, base_name = self._create_files()
144
145 # using compress and testing the PendingDeprecationWarning
146 old_dir = os.getcwd()
147 os.chdir(tmpdir)
148 try:
149 with check_warnings() as w:
150 warnings.simplefilter("always")
151 make_tarball(base_name, 'dist', compress='compress')
152 finally:
153 os.chdir(old_dir)
154 tarball = base_name + '.tar.Z'
Georg Brandlab91fde2009-08-13 08:51:18 +0000155 self.assertTrue(os.path.exists(tarball))
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000156 self.assertEqual(len(w.warnings), 1)
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000157
158 # same test with dry_run
159 os.remove(tarball)
160 old_dir = os.getcwd()
161 os.chdir(tmpdir)
162 try:
163 with check_warnings() as w:
164 warnings.simplefilter("always")
165 make_tarball(base_name, 'dist', compress='compress',
166 dry_run=True)
167 finally:
168 os.chdir(old_dir)
Georg Brandlab91fde2009-08-13 08:51:18 +0000169 self.assertTrue(not os.path.exists(tarball))
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000170 self.assertEqual(len(w.warnings), 1)
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000171
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +0000172 @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
Tarek Ziadé441efa82009-05-17 15:03:23 +0000173 def test_make_zipfile(self):
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +0000174 # creating something to tar
175 tmpdir = self.mkdtemp()
176 self.write_file([tmpdir, 'file1'], 'xxx')
177 self.write_file([tmpdir, 'file2'], 'xxx')
178
179 tmpdir2 = self.mkdtemp()
180 base_name = os.path.join(tmpdir2, 'archive')
181 make_zipfile(base_name, tmpdir)
182
183 # check if the compressed tarball was created
184 tarball = base_name + '.zip'
185
186 def test_check_archive_formats(self):
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000187 self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']),
188 'xxx')
189 self.assertEqual(check_archive_formats(['gztar', 'zip']), None)
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +0000190
191 def test_make_archive(self):
192 tmpdir = self.mkdtemp()
193 base_name = os.path.join(tmpdir, 'archive')
194 self.assertRaises(ValueError, make_archive, base_name, 'xxx')
195
Tarek Ziadé53fdb182009-10-24 13:42:10 +0000196 def test_make_archive_cwd(self):
197 current_dir = os.getcwd()
198 def _breaks(*args, **kw):
199 raise RuntimeError()
200 ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file')
201 try:
202 try:
203 make_archive('xxx', 'xxx', root_dir=self.mkdtemp())
204 except:
205 pass
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000206 self.assertEqual(os.getcwd(), current_dir)
Tarek Ziadé53fdb182009-10-24 13:42:10 +0000207 finally:
208 del ARCHIVE_FORMATS['xxx']
209
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +0000210def test_suite():
211 return unittest.makeSuite(ArchiveUtilTestCase)
212
213if __name__ == "__main__":
Éric Araujob344dd02011-02-02 21:38:37 +0000214 run_unittest(test_suite())