blob: d88e0b350d89fe00c492ad6713aeed237f7dcd1b [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,
11 make_zipfile, make_archive)
Tarek Ziadé77c8b372009-05-28 13:01:13 +000012from distutils.spawn import find_executable, spawn
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000013from distutils.tests import support
Tarek Ziadé77c8b372009-05-28 13:01:13 +000014from test.support import check_warnings
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000015
16try:
17 import zipfile
18 ZIP_SUPPORT = True
19except ImportError:
20 ZIP_SUPPORT = find_executable('zip')
21
22class ArchiveUtilTestCase(support.TempdirManager,
Tarek Ziadée2cedaa2009-05-28 14:02:58 +000023 support.LoggingSilencer,
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000024 unittest.TestCase):
25
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000026 def test_make_tarball(self):
27 # creating something to tar
28 tmpdir = self.mkdtemp()
29 self.write_file([tmpdir, 'file1'], 'xxx')
30 self.write_file([tmpdir, 'file2'], 'xxx')
Tarek Ziadé77c8b372009-05-28 13:01:13 +000031 os.mkdir(os.path.join(tmpdir, 'sub'))
32 self.write_file([tmpdir, 'sub', 'file3'], 'xxx')
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000033
34 tmpdir2 = self.mkdtemp()
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +000035 unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
36 "Source and target should be on same drive")
37
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000038 base_name = os.path.join(tmpdir2, 'archive')
Tarek Ziadé40c00272009-05-18 08:22:38 +000039
40 # working with relative paths to avoid tar warnings
41 old_dir = os.getcwd()
42 os.chdir(tmpdir)
43 try:
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +000044 make_tarball(splitdrive(base_name)[1], '.')
Tarek Ziadé40c00272009-05-18 08:22:38 +000045 finally:
46 os.chdir(old_dir)
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000047
48 # check if the compressed tarball was created
49 tarball = base_name + '.tar.gz'
Georg Brandlab91fde2009-08-13 08:51:18 +000050 self.assertTrue(os.path.exists(tarball))
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000051
52 # trying an uncompressed one
53 base_name = os.path.join(tmpdir2, 'archive')
Tarek Ziadé40c00272009-05-18 08:22:38 +000054 old_dir = os.getcwd()
55 os.chdir(tmpdir)
56 try:
Tarek Ziadé93fb3aa2009-05-18 12:29:06 +000057 make_tarball(splitdrive(base_name)[1], '.', compress=None)
Tarek Ziadé40c00272009-05-18 08:22:38 +000058 finally:
59 os.chdir(old_dir)
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000060 tarball = base_name + '.tar'
Georg Brandlab91fde2009-08-13 08:51:18 +000061 self.assertTrue(os.path.exists(tarball))
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +000062
Tarek Ziadé77c8b372009-05-28 13:01:13 +000063 def _tarinfo(self, path):
64 tar = tarfile.open(path)
65 try:
66 names = tar.getnames()
67 names.sort()
68 return tuple(names)
69 finally:
70 tar.close()
71
72 def _create_files(self):
73 # creating something to tar
74 tmpdir = self.mkdtemp()
75 dist = os.path.join(tmpdir, 'dist')
76 os.mkdir(dist)
77 self.write_file([dist, 'file1'], 'xxx')
78 self.write_file([dist, 'file2'], 'xxx')
79 os.mkdir(os.path.join(dist, 'sub'))
80 self.write_file([dist, 'sub', 'file3'], 'xxx')
81 os.mkdir(os.path.join(dist, 'sub2'))
82 tmpdir2 = self.mkdtemp()
83 base_name = os.path.join(tmpdir2, 'archive')
84 return tmpdir, tmpdir2, base_name
85
Tarek Ziadée2cedaa2009-05-28 14:02:58 +000086 @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),
87 'Need the tar command to run')
Tarek Ziadé77c8b372009-05-28 13:01:13 +000088 def test_tarfile_vs_tar(self):
89 tmpdir, tmpdir2, base_name = self._create_files()
90 old_dir = os.getcwd()
91 os.chdir(tmpdir)
92 try:
93 make_tarball(base_name, 'dist')
94 finally:
95 os.chdir(old_dir)
96
97 # check if the compressed tarball was created
98 tarball = base_name + '.tar.gz'
Georg Brandlab91fde2009-08-13 08:51:18 +000099 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000100
101 # now create another tarball using `tar`
102 tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')
Tarek Ziadée2cedaa2009-05-28 14:02:58 +0000103 tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']
104 gzip_cmd = ['gzip', '-f9', 'archive2.tar']
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000105 old_dir = os.getcwd()
106 os.chdir(tmpdir)
107 try:
Tarek Ziadée2cedaa2009-05-28 14:02:58 +0000108 spawn(tar_cmd)
109 spawn(gzip_cmd)
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000110 finally:
111 os.chdir(old_dir)
112
Georg Brandlab91fde2009-08-13 08:51:18 +0000113 self.assertTrue(os.path.exists(tarball2))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000114 # let's compare both tarballs
115 self.assertEquals(self._tarinfo(tarball), self._tarinfo(tarball2))
116
117 # trying an uncompressed one
118 base_name = os.path.join(tmpdir2, 'archive')
119 old_dir = os.getcwd()
120 os.chdir(tmpdir)
121 try:
122 make_tarball(base_name, 'dist', compress=None)
123 finally:
124 os.chdir(old_dir)
125 tarball = base_name + '.tar'
Georg Brandlab91fde2009-08-13 08:51:18 +0000126 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000127
128 # now for a dry_run
129 base_name = os.path.join(tmpdir2, 'archive')
130 old_dir = os.getcwd()
131 os.chdir(tmpdir)
132 try:
133 make_tarball(base_name, 'dist', compress=None, dry_run=True)
134 finally:
135 os.chdir(old_dir)
136 tarball = base_name + '.tar'
Georg Brandlab91fde2009-08-13 08:51:18 +0000137 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000138
139 @unittest.skipUnless(find_executable('compress'),
140 'The compress program is required')
141 def test_compress_deprecated(self):
142 tmpdir, tmpdir2, base_name = self._create_files()
143
144 # using compress and testing the PendingDeprecationWarning
145 old_dir = os.getcwd()
146 os.chdir(tmpdir)
147 try:
148 with check_warnings() as w:
149 warnings.simplefilter("always")
150 make_tarball(base_name, 'dist', compress='compress')
151 finally:
152 os.chdir(old_dir)
153 tarball = base_name + '.tar.Z'
Georg Brandlab91fde2009-08-13 08:51:18 +0000154 self.assertTrue(os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000155 self.assertEquals(len(w.warnings), 1)
156
157 # same test with dry_run
158 os.remove(tarball)
159 old_dir = os.getcwd()
160 os.chdir(tmpdir)
161 try:
162 with check_warnings() as w:
163 warnings.simplefilter("always")
164 make_tarball(base_name, 'dist', compress='compress',
165 dry_run=True)
166 finally:
167 os.chdir(old_dir)
Georg Brandlab91fde2009-08-13 08:51:18 +0000168 self.assertTrue(not os.path.exists(tarball))
Tarek Ziadé77c8b372009-05-28 13:01:13 +0000169 self.assertEquals(len(w.warnings), 1)
170
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +0000171 @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
Tarek Ziadé441efa82009-05-17 15:03:23 +0000172 def test_make_zipfile(self):
Tarek Ziadéeb5f27e2009-05-17 12:12:02 +0000173 # creating something to tar
174 tmpdir = self.mkdtemp()
175 self.write_file([tmpdir, 'file1'], 'xxx')
176 self.write_file([tmpdir, 'file2'], 'xxx')
177
178 tmpdir2 = self.mkdtemp()
179 base_name = os.path.join(tmpdir2, 'archive')
180 make_zipfile(base_name, tmpdir)
181
182 # check if the compressed tarball was created
183 tarball = base_name + '.zip'
184
185 def test_check_archive_formats(self):
186 self.assertEquals(check_archive_formats(['gztar', 'xxx', 'zip']),
187 'xxx')
188 self.assertEquals(check_archive_formats(['gztar', 'zip']), None)
189
190 def test_make_archive(self):
191 tmpdir = self.mkdtemp()
192 base_name = os.path.join(tmpdir, 'archive')
193 self.assertRaises(ValueError, make_archive, base_name, 'xxx')
194
195def test_suite():
196 return unittest.makeSuite(ArchiveUtilTestCase)
197
198if __name__ == "__main__":
199 unittest.main(defaultTest="test_suite")