test_archive_util.py (8511B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\tests\test_archive_util.py 2 __revision__ = '$Id: test_archive_util.py 75659 2009-10-24 13:29:44Z tarek.ziade $' 3 import unittest 4 import os 5 import tarfile 6 from os.path import splitdrive 7 import warnings 8 from distutils.archive_util import check_archive_formats, make_tarball, make_zipfile, make_archive, ARCHIVE_FORMATS 9 from distutils.spawn import find_executable, spawn 10 from distutils.tests import support 11 from test.test_support import check_warnings 12 try: 13 import grp 14 import pwd 15 UID_GID_SUPPORT = True 16 except ImportError: 17 UID_GID_SUPPORT = False 18 19 try: 20 import zipfile 21 ZIP_SUPPORT = True 22 except ImportError: 23 ZIP_SUPPORT = find_executable('zip') 24 25 try: 26 import zlib 27 except ImportError: 28 zlib = None 29 30 class ArchiveUtilTestCase(support.TempdirManager, support.LoggingSilencer, unittest.TestCase): 31 32 @unittest.skipUnless(zlib, 'requires zlib') 33 def test_make_tarball(self): 34 tmpdir = self.mkdtemp() 35 self.write_file([tmpdir, 'file1'], 'xxx') 36 self.write_file([tmpdir, 'file2'], 'xxx') 37 os.mkdir(os.path.join(tmpdir, 'sub')) 38 self.write_file([tmpdir, 'sub', 'file3'], 'xxx') 39 tmpdir2 = self.mkdtemp() 40 unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0], 'source and target should be on same drive') 41 base_name = os.path.join(tmpdir2, 'archive') 42 old_dir = os.getcwd() 43 os.chdir(tmpdir) 44 try: 45 make_tarball(splitdrive(base_name)[1], '.') 46 finally: 47 os.chdir(old_dir) 48 49 tarball = base_name + '.tar.gz' 50 self.assertTrue(os.path.exists(tarball)) 51 base_name = os.path.join(tmpdir2, 'archive') 52 old_dir = os.getcwd() 53 os.chdir(tmpdir) 54 try: 55 make_tarball(splitdrive(base_name)[1], '.', compress=None) 56 finally: 57 os.chdir(old_dir) 58 59 tarball = base_name + '.tar' 60 self.assertTrue(os.path.exists(tarball)) 61 62 def _tarinfo(self, path): 63 tar = tarfile.open(path) 64 try: 65 names = tar.getnames() 66 names.sort() 67 return tuple(names) 68 finally: 69 tar.close() 70 71 def _create_files(self): 72 tmpdir = self.mkdtemp() 73 dist = os.path.join(tmpdir, 'dist') 74 os.mkdir(dist) 75 self.write_file([dist, 'file1'], 'xxx') 76 self.write_file([dist, 'file2'], 'xxx') 77 os.mkdir(os.path.join(dist, 'sub')) 78 self.write_file([dist, 'sub', 'file3'], 'xxx') 79 os.mkdir(os.path.join(dist, 'sub2')) 80 tmpdir2 = self.mkdtemp() 81 base_name = os.path.join(tmpdir2, 'archive') 82 return (tmpdir, tmpdir2, base_name) 83 84 @unittest.skipUnless(zlib, 'Requires zlib') 85 @unittest.skipUnless(find_executable('tar') and find_executable('gzip'), 'Need the tar command to run') 86 def test_tarfile_vs_tar(self): 87 tmpdir, tmpdir2, base_name = self._create_files() 88 old_dir = os.getcwd() 89 os.chdir(tmpdir) 90 try: 91 make_tarball(base_name, 'dist') 92 finally: 93 os.chdir(old_dir) 94 95 tarball = base_name + '.tar.gz' 96 self.assertTrue(os.path.exists(tarball)) 97 tarball2 = os.path.join(tmpdir, 'archive2.tar.gz') 98 tar_cmd = ['tar', 99 '-cf', 100 'archive2.tar', 101 'dist'] 102 gzip_cmd = ['gzip', '-f9', 'archive2.tar'] 103 old_dir = os.getcwd() 104 os.chdir(tmpdir) 105 try: 106 spawn(tar_cmd) 107 spawn(gzip_cmd) 108 finally: 109 os.chdir(old_dir) 110 111 self.assertTrue(os.path.exists(tarball2)) 112 self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2)) 113 base_name = os.path.join(tmpdir2, 'archive') 114 old_dir = os.getcwd() 115 os.chdir(tmpdir) 116 try: 117 make_tarball(base_name, 'dist', compress=None) 118 finally: 119 os.chdir(old_dir) 120 121 tarball = base_name + '.tar' 122 self.assertTrue(os.path.exists(tarball)) 123 base_name = os.path.join(tmpdir2, 'archive') 124 old_dir = os.getcwd() 125 os.chdir(tmpdir) 126 try: 127 make_tarball(base_name, 'dist', compress=None, dry_run=True) 128 finally: 129 os.chdir(old_dir) 130 131 tarball = base_name + '.tar' 132 self.assertTrue(os.path.exists(tarball)) 133 134 @unittest.skipUnless(find_executable('compress'), 'The compress program is required') 135 def test_compress_deprecated(self): 136 tmpdir, tmpdir2, base_name = self._create_files() 137 old_dir = os.getcwd() 138 os.chdir(tmpdir) 139 try: 140 with check_warnings() as w: 141 warnings.simplefilter('always') 142 make_tarball(base_name, 'dist', compress='compress') 143 finally: 144 os.chdir(old_dir) 145 146 tarball = base_name + '.tar.Z' 147 self.assertTrue(os.path.exists(tarball)) 148 self.assertEqual(len(w.warnings), 1) 149 os.remove(tarball) 150 old_dir = os.getcwd() 151 os.chdir(tmpdir) 152 try: 153 with check_warnings() as w: 154 warnings.simplefilter('always') 155 make_tarball(base_name, 'dist', compress='compress', dry_run=True) 156 finally: 157 os.chdir(old_dir) 158 159 self.assertTrue(not os.path.exists(tarball)) 160 self.assertEqual(len(w.warnings), 1) 161 162 @unittest.skipUnless(zlib, 'Requires zlib') 163 @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run') 164 def test_make_zipfile(self): 165 tmpdir = self.mkdtemp() 166 self.write_file([tmpdir, 'file1'], 'xxx') 167 self.write_file([tmpdir, 'file2'], 'xxx') 168 tmpdir2 = self.mkdtemp() 169 base_name = os.path.join(tmpdir2, 'archive') 170 make_zipfile(base_name, tmpdir) 171 tarball = base_name + '.zip' 172 173 def test_check_archive_formats(self): 174 self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']), 'xxx') 175 self.assertEqual(check_archive_formats(['gztar', 'zip']), None) 176 177 def test_make_archive(self): 178 tmpdir = self.mkdtemp() 179 base_name = os.path.join(tmpdir, 'archive') 180 self.assertRaises(ValueError, make_archive, base_name, 'xxx') 181 182 @unittest.skipUnless(zlib, 'Requires zlib') 183 def test_make_archive_owner_group(self): 184 if UID_GID_SUPPORT: 185 group = grp.getgrgid(0)[0] 186 owner = pwd.getpwuid(0)[0] 187 else: 188 group = owner = 'root' 189 base_dir, root_dir, base_name = self._create_files() 190 base_name = os.path.join(self.mkdtemp(), 'archive') 191 res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner, group=group) 192 self.assertTrue(os.path.exists(res)) 193 res = make_archive(base_name, 'zip', root_dir, base_dir) 194 self.assertTrue(os.path.exists(res)) 195 res = make_archive(base_name, 'tar', root_dir, base_dir, owner=owner, group=group) 196 self.assertTrue(os.path.exists(res)) 197 res = make_archive(base_name, 'tar', root_dir, base_dir, owner='kjhkjhkjg', group='oihohoh') 198 self.assertTrue(os.path.exists(res)) 199 200 @unittest.skipUnless(zlib, 'Requires zlib') 201 @unittest.skipUnless(UID_GID_SUPPORT, 'Requires grp and pwd support') 202 def test_tarfile_root_owner(self): 203 tmpdir, tmpdir2, base_name = self._create_files() 204 old_dir = os.getcwd() 205 os.chdir(tmpdir) 206 group = grp.getgrgid(0)[0] 207 owner = pwd.getpwuid(0)[0] 208 try: 209 archive_name = make_tarball(base_name, 'dist', compress=None, owner=owner, group=group) 210 finally: 211 os.chdir(old_dir) 212 213 self.assertTrue(os.path.exists(archive_name)) 214 archive = tarfile.open(archive_name) 215 try: 216 for member in archive.getmembers(): 217 self.assertEqual(member.uid, 0) 218 self.assertEqual(member.gid, 0) 219 220 finally: 221 archive.close() 222 223 def test_make_archive_cwd(self): 224 current_dir = os.getcwd() 225 226 def _breaks(*args, **kw): 227 raise RuntimeError() 228 229 ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file') 230 try: 231 try: 232 make_archive('xxx', 'xxx', root_dir=self.mkdtemp()) 233 except: 234 pass 235 236 self.assertEqual(os.getcwd(), current_dir) 237 finally: 238 del ARCHIVE_FORMATS['xxx'] 239 240 241 def test_suite(): 242 return unittest.makeSuite(ArchiveUtilTestCase) 243 244 245 if __name__ == '__main__': 246 unittest.main(defaultTest='test_suite')