17db96d56Sopenharmony_ci# -*- coding: utf-8 -*-
27db96d56Sopenharmony_ci"""Tests for distutils.archive_util."""
37db96d56Sopenharmony_ciimport unittest
47db96d56Sopenharmony_ciimport os
57db96d56Sopenharmony_ciimport sys
67db96d56Sopenharmony_ciimport tarfile
77db96d56Sopenharmony_cifrom os.path import splitdrive
87db96d56Sopenharmony_ciimport warnings
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_cifrom distutils import archive_util
117db96d56Sopenharmony_cifrom distutils.archive_util import (check_archive_formats, make_tarball,
127db96d56Sopenharmony_ci                                    make_zipfile, make_archive,
137db96d56Sopenharmony_ci                                    ARCHIVE_FORMATS)
147db96d56Sopenharmony_cifrom distutils.spawn import find_executable, spawn
157db96d56Sopenharmony_cifrom distutils.tests import support
167db96d56Sopenharmony_cifrom test.support import run_unittest, patch
177db96d56Sopenharmony_cifrom test.support.os_helper import change_cwd
187db96d56Sopenharmony_cifrom test.support.warnings_helper import check_warnings
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_citry:
217db96d56Sopenharmony_ci    import grp
227db96d56Sopenharmony_ci    import pwd
237db96d56Sopenharmony_ci    UID_GID_SUPPORT = True
247db96d56Sopenharmony_ciexcept ImportError:
257db96d56Sopenharmony_ci    UID_GID_SUPPORT = False
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_citry:
287db96d56Sopenharmony_ci    import zipfile
297db96d56Sopenharmony_ci    ZIP_SUPPORT = True
307db96d56Sopenharmony_ciexcept ImportError:
317db96d56Sopenharmony_ci    ZIP_SUPPORT = find_executable('zip')
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_citry:
347db96d56Sopenharmony_ci    import zlib
357db96d56Sopenharmony_ci    ZLIB_SUPPORT = True
367db96d56Sopenharmony_ciexcept ImportError:
377db96d56Sopenharmony_ci    ZLIB_SUPPORT = False
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_citry:
407db96d56Sopenharmony_ci    import bz2
417db96d56Sopenharmony_ciexcept ImportError:
427db96d56Sopenharmony_ci    bz2 = None
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_citry:
457db96d56Sopenharmony_ci    import lzma
467db96d56Sopenharmony_ciexcept ImportError:
477db96d56Sopenharmony_ci    lzma = None
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_cidef can_fs_encode(filename):
507db96d56Sopenharmony_ci    """
517db96d56Sopenharmony_ci    Return True if the filename can be saved in the file system.
527db96d56Sopenharmony_ci    """
537db96d56Sopenharmony_ci    if os.path.supports_unicode_filenames:
547db96d56Sopenharmony_ci        return True
557db96d56Sopenharmony_ci    try:
567db96d56Sopenharmony_ci        filename.encode(sys.getfilesystemencoding())
577db96d56Sopenharmony_ci    except UnicodeEncodeError:
587db96d56Sopenharmony_ci        return False
597db96d56Sopenharmony_ci    return True
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ciclass ArchiveUtilTestCase(support.TempdirManager,
637db96d56Sopenharmony_ci                          support.LoggingSilencer,
647db96d56Sopenharmony_ci                          unittest.TestCase):
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
677db96d56Sopenharmony_ci    def test_make_tarball(self, name='archive'):
687db96d56Sopenharmony_ci        # creating something to tar
697db96d56Sopenharmony_ci        tmpdir = self._create_files()
707db96d56Sopenharmony_ci        self._make_tarball(tmpdir, name, '.tar.gz')
717db96d56Sopenharmony_ci        # trying an uncompressed one
727db96d56Sopenharmony_ci        self._make_tarball(tmpdir, name, '.tar', compress=None)
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
757db96d56Sopenharmony_ci    def test_make_tarball_gzip(self):
767db96d56Sopenharmony_ci        tmpdir = self._create_files()
777db96d56Sopenharmony_ci        self._make_tarball(tmpdir, 'archive', '.tar.gz', compress='gzip')
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci    @unittest.skipUnless(bz2, 'Need bz2 support to run')
807db96d56Sopenharmony_ci    def test_make_tarball_bzip2(self):
817db96d56Sopenharmony_ci        tmpdir = self._create_files()
827db96d56Sopenharmony_ci        self._make_tarball(tmpdir, 'archive', '.tar.bz2', compress='bzip2')
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci    @unittest.skipUnless(lzma, 'Need lzma support to run')
857db96d56Sopenharmony_ci    def test_make_tarball_xz(self):
867db96d56Sopenharmony_ci        tmpdir = self._create_files()
877db96d56Sopenharmony_ci        self._make_tarball(tmpdir, 'archive', '.tar.xz', compress='xz')
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    @unittest.skipUnless(can_fs_encode('årchiv'),
907db96d56Sopenharmony_ci        'File system cannot handle this filename')
917db96d56Sopenharmony_ci    def test_make_tarball_latin1(self):
927db96d56Sopenharmony_ci        """
937db96d56Sopenharmony_ci        Mirror test_make_tarball, except filename contains latin characters.
947db96d56Sopenharmony_ci        """
957db96d56Sopenharmony_ci        self.test_make_tarball('årchiv') # note this isn't a real word
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci    @unittest.skipUnless(can_fs_encode('のアーカイブ'),
987db96d56Sopenharmony_ci        'File system cannot handle this filename')
997db96d56Sopenharmony_ci    def test_make_tarball_extended(self):
1007db96d56Sopenharmony_ci        """
1017db96d56Sopenharmony_ci        Mirror test_make_tarball, except filename contains extended
1027db96d56Sopenharmony_ci        characters outside the latin charset.
1037db96d56Sopenharmony_ci        """
1047db96d56Sopenharmony_ci        self.test_make_tarball('のアーカイブ') # japanese for archive
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci    def _make_tarball(self, tmpdir, target_name, suffix, **kwargs):
1077db96d56Sopenharmony_ci        tmpdir2 = self.mkdtemp()
1087db96d56Sopenharmony_ci        unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
1097db96d56Sopenharmony_ci                            "source and target should be on same drive")
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci        base_name = os.path.join(tmpdir2, target_name)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci        # working with relative paths to avoid tar warnings
1147db96d56Sopenharmony_ci        with change_cwd(tmpdir):
1157db96d56Sopenharmony_ci            make_tarball(splitdrive(base_name)[1], 'dist', **kwargs)
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci        # check if the compressed tarball was created
1187db96d56Sopenharmony_ci        tarball = base_name + suffix
1197db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
1207db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(tarball), self._created_files)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    def _tarinfo(self, path):
1237db96d56Sopenharmony_ci        tar = tarfile.open(path)
1247db96d56Sopenharmony_ci        try:
1257db96d56Sopenharmony_ci            names = tar.getnames()
1267db96d56Sopenharmony_ci            names.sort()
1277db96d56Sopenharmony_ci            return names
1287db96d56Sopenharmony_ci        finally:
1297db96d56Sopenharmony_ci            tar.close()
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci    _zip_created_files = ['dist/', 'dist/file1', 'dist/file2',
1327db96d56Sopenharmony_ci                          'dist/sub/', 'dist/sub/file3', 'dist/sub2/']
1337db96d56Sopenharmony_ci    _created_files = [p.rstrip('/') for p in _zip_created_files]
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci    def _create_files(self):
1367db96d56Sopenharmony_ci        # creating something to tar
1377db96d56Sopenharmony_ci        tmpdir = self.mkdtemp()
1387db96d56Sopenharmony_ci        dist = os.path.join(tmpdir, 'dist')
1397db96d56Sopenharmony_ci        os.mkdir(dist)
1407db96d56Sopenharmony_ci        self.write_file([dist, 'file1'], 'xxx')
1417db96d56Sopenharmony_ci        self.write_file([dist, 'file2'], 'xxx')
1427db96d56Sopenharmony_ci        os.mkdir(os.path.join(dist, 'sub'))
1437db96d56Sopenharmony_ci        self.write_file([dist, 'sub', 'file3'], 'xxx')
1447db96d56Sopenharmony_ci        os.mkdir(os.path.join(dist, 'sub2'))
1457db96d56Sopenharmony_ci        return tmpdir
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci    @unittest.skipUnless(find_executable('tar') and find_executable('gzip')
1487db96d56Sopenharmony_ci                         and ZLIB_SUPPORT,
1497db96d56Sopenharmony_ci                         'Need the tar, gzip and zlib command to run')
1507db96d56Sopenharmony_ci    def test_tarfile_vs_tar(self):
1517db96d56Sopenharmony_ci        tmpdir =  self._create_files()
1527db96d56Sopenharmony_ci        tmpdir2 = self.mkdtemp()
1537db96d56Sopenharmony_ci        base_name = os.path.join(tmpdir2, 'archive')
1547db96d56Sopenharmony_ci        old_dir = os.getcwd()
1557db96d56Sopenharmony_ci        os.chdir(tmpdir)
1567db96d56Sopenharmony_ci        try:
1577db96d56Sopenharmony_ci            make_tarball(base_name, 'dist')
1587db96d56Sopenharmony_ci        finally:
1597db96d56Sopenharmony_ci            os.chdir(old_dir)
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci        # check if the compressed tarball was created
1627db96d56Sopenharmony_ci        tarball = base_name + '.tar.gz'
1637db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci        # now create another tarball using `tar`
1667db96d56Sopenharmony_ci        tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')
1677db96d56Sopenharmony_ci        tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']
1687db96d56Sopenharmony_ci        gzip_cmd = ['gzip', '-f', '-9', 'archive2.tar']
1697db96d56Sopenharmony_ci        old_dir = os.getcwd()
1707db96d56Sopenharmony_ci        os.chdir(tmpdir)
1717db96d56Sopenharmony_ci        try:
1727db96d56Sopenharmony_ci            spawn(tar_cmd)
1737db96d56Sopenharmony_ci            spawn(gzip_cmd)
1747db96d56Sopenharmony_ci        finally:
1757db96d56Sopenharmony_ci            os.chdir(old_dir)
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball2))
1787db96d56Sopenharmony_ci        # let's compare both tarballs
1797db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(tarball), self._created_files)
1807db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(tarball2), self._created_files)
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci        # trying an uncompressed one
1837db96d56Sopenharmony_ci        base_name = os.path.join(tmpdir2, 'archive')
1847db96d56Sopenharmony_ci        old_dir = os.getcwd()
1857db96d56Sopenharmony_ci        os.chdir(tmpdir)
1867db96d56Sopenharmony_ci        try:
1877db96d56Sopenharmony_ci            make_tarball(base_name, 'dist', compress=None)
1887db96d56Sopenharmony_ci        finally:
1897db96d56Sopenharmony_ci            os.chdir(old_dir)
1907db96d56Sopenharmony_ci        tarball = base_name + '.tar'
1917db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci        # now for a dry_run
1947db96d56Sopenharmony_ci        base_name = os.path.join(tmpdir2, 'archive')
1957db96d56Sopenharmony_ci        old_dir = os.getcwd()
1967db96d56Sopenharmony_ci        os.chdir(tmpdir)
1977db96d56Sopenharmony_ci        try:
1987db96d56Sopenharmony_ci            make_tarball(base_name, 'dist', compress=None, dry_run=True)
1997db96d56Sopenharmony_ci        finally:
2007db96d56Sopenharmony_ci            os.chdir(old_dir)
2017db96d56Sopenharmony_ci        tarball = base_name + '.tar'
2027db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    @unittest.skipUnless(find_executable('compress'),
2057db96d56Sopenharmony_ci                         'The compress program is required')
2067db96d56Sopenharmony_ci    def test_compress_deprecated(self):
2077db96d56Sopenharmony_ci        tmpdir =  self._create_files()
2087db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp(), 'archive')
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci        # using compress and testing the PendingDeprecationWarning
2117db96d56Sopenharmony_ci        old_dir = os.getcwd()
2127db96d56Sopenharmony_ci        os.chdir(tmpdir)
2137db96d56Sopenharmony_ci        try:
2147db96d56Sopenharmony_ci            with check_warnings() as w:
2157db96d56Sopenharmony_ci                warnings.simplefilter("always")
2167db96d56Sopenharmony_ci                make_tarball(base_name, 'dist', compress='compress')
2177db96d56Sopenharmony_ci        finally:
2187db96d56Sopenharmony_ci            os.chdir(old_dir)
2197db96d56Sopenharmony_ci        tarball = base_name + '.tar.Z'
2207db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
2217db96d56Sopenharmony_ci        self.assertEqual(len(w.warnings), 1)
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci        # same test with dry_run
2247db96d56Sopenharmony_ci        os.remove(tarball)
2257db96d56Sopenharmony_ci        old_dir = os.getcwd()
2267db96d56Sopenharmony_ci        os.chdir(tmpdir)
2277db96d56Sopenharmony_ci        try:
2287db96d56Sopenharmony_ci            with check_warnings() as w:
2297db96d56Sopenharmony_ci                warnings.simplefilter("always")
2307db96d56Sopenharmony_ci                make_tarball(base_name, 'dist', compress='compress',
2317db96d56Sopenharmony_ci                             dry_run=True)
2327db96d56Sopenharmony_ci        finally:
2337db96d56Sopenharmony_ci            os.chdir(old_dir)
2347db96d56Sopenharmony_ci        self.assertFalse(os.path.exists(tarball))
2357db96d56Sopenharmony_ci        self.assertEqual(len(w.warnings), 1)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci    @unittest.skipUnless(ZIP_SUPPORT and ZLIB_SUPPORT,
2387db96d56Sopenharmony_ci                         'Need zip and zlib support to run')
2397db96d56Sopenharmony_ci    def test_make_zipfile(self):
2407db96d56Sopenharmony_ci        # creating something to tar
2417db96d56Sopenharmony_ci        tmpdir = self._create_files()
2427db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp(), 'archive')
2437db96d56Sopenharmony_ci        with change_cwd(tmpdir):
2447db96d56Sopenharmony_ci            make_zipfile(base_name, 'dist')
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci        # check if the compressed tarball was created
2477db96d56Sopenharmony_ci        tarball = base_name + '.zip'
2487db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
2497db96d56Sopenharmony_ci        with zipfile.ZipFile(tarball) as zf:
2507db96d56Sopenharmony_ci            self.assertEqual(sorted(zf.namelist()), self._zip_created_files)
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci    @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
2537db96d56Sopenharmony_ci    def test_make_zipfile_no_zlib(self):
2547db96d56Sopenharmony_ci        patch(self, archive_util.zipfile, 'zlib', None)  # force zlib ImportError
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci        called = []
2577db96d56Sopenharmony_ci        zipfile_class = zipfile.ZipFile
2587db96d56Sopenharmony_ci        def fake_zipfile(*a, **kw):
2597db96d56Sopenharmony_ci            if kw.get('compression', None) == zipfile.ZIP_STORED:
2607db96d56Sopenharmony_ci                called.append((a, kw))
2617db96d56Sopenharmony_ci            return zipfile_class(*a, **kw)
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci        patch(self, archive_util.zipfile, 'ZipFile', fake_zipfile)
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci        # create something to tar and compress
2667db96d56Sopenharmony_ci        tmpdir = self._create_files()
2677db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp(), 'archive')
2687db96d56Sopenharmony_ci        with change_cwd(tmpdir):
2697db96d56Sopenharmony_ci            make_zipfile(base_name, 'dist')
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci        tarball = base_name + '.zip'
2727db96d56Sopenharmony_ci        self.assertEqual(called,
2737db96d56Sopenharmony_ci                         [((tarball, "w"), {'compression': zipfile.ZIP_STORED})])
2747db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(tarball))
2757db96d56Sopenharmony_ci        with zipfile.ZipFile(tarball) as zf:
2767db96d56Sopenharmony_ci            self.assertEqual(sorted(zf.namelist()), self._zip_created_files)
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci    def test_check_archive_formats(self):
2797db96d56Sopenharmony_ci        self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']),
2807db96d56Sopenharmony_ci                         'xxx')
2817db96d56Sopenharmony_ci        self.assertIsNone(check_archive_formats(['gztar', 'bztar', 'xztar',
2827db96d56Sopenharmony_ci                                                 'ztar', 'tar', 'zip']))
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci    def test_make_archive(self):
2857db96d56Sopenharmony_ci        tmpdir = self.mkdtemp()
2867db96d56Sopenharmony_ci        base_name = os.path.join(tmpdir, 'archive')
2877db96d56Sopenharmony_ci        self.assertRaises(ValueError, make_archive, base_name, 'xxx')
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci    def test_make_archive_cwd(self):
2907db96d56Sopenharmony_ci        current_dir = os.getcwd()
2917db96d56Sopenharmony_ci        def _breaks(*args, **kw):
2927db96d56Sopenharmony_ci            raise RuntimeError()
2937db96d56Sopenharmony_ci        ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file')
2947db96d56Sopenharmony_ci        try:
2957db96d56Sopenharmony_ci            try:
2967db96d56Sopenharmony_ci                make_archive('xxx', 'xxx', root_dir=self.mkdtemp())
2977db96d56Sopenharmony_ci            except:
2987db96d56Sopenharmony_ci                pass
2997db96d56Sopenharmony_ci            self.assertEqual(os.getcwd(), current_dir)
3007db96d56Sopenharmony_ci        finally:
3017db96d56Sopenharmony_ci            del ARCHIVE_FORMATS['xxx']
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci    def test_make_archive_tar(self):
3047db96d56Sopenharmony_ci        base_dir =  self._create_files()
3057db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp() , 'archive')
3067db96d56Sopenharmony_ci        res = make_archive(base_name, 'tar', base_dir, 'dist')
3077db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3087db96d56Sopenharmony_ci        self.assertEqual(os.path.basename(res), 'archive.tar')
3097db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(res), self._created_files)
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
3127db96d56Sopenharmony_ci    def test_make_archive_gztar(self):
3137db96d56Sopenharmony_ci        base_dir =  self._create_files()
3147db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp() , 'archive')
3157db96d56Sopenharmony_ci        res = make_archive(base_name, 'gztar', base_dir, 'dist')
3167db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3177db96d56Sopenharmony_ci        self.assertEqual(os.path.basename(res), 'archive.tar.gz')
3187db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(res), self._created_files)
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci    @unittest.skipUnless(bz2, 'Need bz2 support to run')
3217db96d56Sopenharmony_ci    def test_make_archive_bztar(self):
3227db96d56Sopenharmony_ci        base_dir =  self._create_files()
3237db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp() , 'archive')
3247db96d56Sopenharmony_ci        res = make_archive(base_name, 'bztar', base_dir, 'dist')
3257db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3267db96d56Sopenharmony_ci        self.assertEqual(os.path.basename(res), 'archive.tar.bz2')
3277db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(res), self._created_files)
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci    @unittest.skipUnless(lzma, 'Need xz support to run')
3307db96d56Sopenharmony_ci    def test_make_archive_xztar(self):
3317db96d56Sopenharmony_ci        base_dir =  self._create_files()
3327db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp() , 'archive')
3337db96d56Sopenharmony_ci        res = make_archive(base_name, 'xztar', base_dir, 'dist')
3347db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3357db96d56Sopenharmony_ci        self.assertEqual(os.path.basename(res), 'archive.tar.xz')
3367db96d56Sopenharmony_ci        self.assertEqual(self._tarinfo(res), self._created_files)
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci    def test_make_archive_owner_group(self):
3397db96d56Sopenharmony_ci        # testing make_archive with owner and group, with various combinations
3407db96d56Sopenharmony_ci        # this works even if there's not gid/uid support
3417db96d56Sopenharmony_ci        if UID_GID_SUPPORT:
3427db96d56Sopenharmony_ci            group = grp.getgrgid(0)[0]
3437db96d56Sopenharmony_ci            owner = pwd.getpwuid(0)[0]
3447db96d56Sopenharmony_ci        else:
3457db96d56Sopenharmony_ci            group = owner = 'root'
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci        base_dir =  self._create_files()
3487db96d56Sopenharmony_ci        root_dir = self.mkdtemp()
3497db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp() , 'archive')
3507db96d56Sopenharmony_ci        res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner,
3517db96d56Sopenharmony_ci                           group=group)
3527db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci        res = make_archive(base_name, 'zip', root_dir, base_dir)
3557db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci        res = make_archive(base_name, 'tar', root_dir, base_dir,
3587db96d56Sopenharmony_ci                           owner=owner, group=group)
3597db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci        res = make_archive(base_name, 'tar', root_dir, base_dir,
3627db96d56Sopenharmony_ci                           owner='kjhkjhkjg', group='oihohoh')
3637db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(res))
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci    @unittest.skipUnless(ZLIB_SUPPORT, "Requires zlib")
3667db96d56Sopenharmony_ci    @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
3677db96d56Sopenharmony_ci    def test_tarfile_root_owner(self):
3687db96d56Sopenharmony_ci        tmpdir =  self._create_files()
3697db96d56Sopenharmony_ci        base_name = os.path.join(self.mkdtemp(), 'archive')
3707db96d56Sopenharmony_ci        old_dir = os.getcwd()
3717db96d56Sopenharmony_ci        os.chdir(tmpdir)
3727db96d56Sopenharmony_ci        group = grp.getgrgid(0)[0]
3737db96d56Sopenharmony_ci        owner = pwd.getpwuid(0)[0]
3747db96d56Sopenharmony_ci        try:
3757db96d56Sopenharmony_ci            archive_name = make_tarball(base_name, 'dist', compress=None,
3767db96d56Sopenharmony_ci                                        owner=owner, group=group)
3777db96d56Sopenharmony_ci        finally:
3787db96d56Sopenharmony_ci            os.chdir(old_dir)
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci        # check if the compressed tarball was created
3817db96d56Sopenharmony_ci        self.assertTrue(os.path.exists(archive_name))
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci        # now checks the rights
3847db96d56Sopenharmony_ci        archive = tarfile.open(archive_name)
3857db96d56Sopenharmony_ci        try:
3867db96d56Sopenharmony_ci            for member in archive.getmembers():
3877db96d56Sopenharmony_ci                self.assertEqual(member.uid, 0)
3887db96d56Sopenharmony_ci                self.assertEqual(member.gid, 0)
3897db96d56Sopenharmony_ci        finally:
3907db96d56Sopenharmony_ci            archive.close()
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_cidef test_suite():
3937db96d56Sopenharmony_ci    return unittest.TestLoader().loadTestsFromTestCase(ArchiveUtilTestCase)
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ciif __name__ == "__main__":
3967db96d56Sopenharmony_ci    run_unittest(test_suite())
397