NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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')