+++ /dev/null
-"""Tests for distutils.archive_util."""\r
-__revision__ = "$Id$"\r
-\r
-import unittest\r
-import os\r
-import tarfile\r
-from os.path import splitdrive\r
-import warnings\r
-\r
-from distutils.archive_util import (check_archive_formats, make_tarball,\r
- make_zipfile, make_archive,\r
- ARCHIVE_FORMATS)\r
-from distutils.spawn import find_executable, spawn\r
-from distutils.tests import support\r
-from test.test_support import check_warnings, run_unittest\r
-\r
-try:\r
- import grp\r
- import pwd\r
- UID_GID_SUPPORT = True\r
-except ImportError:\r
- UID_GID_SUPPORT = False\r
-\r
-try:\r
- import zipfile\r
- ZIP_SUPPORT = True\r
-except ImportError:\r
- ZIP_SUPPORT = find_executable('zip')\r
-\r
-# some tests will fail if zlib is not available\r
-try:\r
- import zlib\r
-except ImportError:\r
- zlib = None\r
-\r
-\r
-class ArchiveUtilTestCase(support.TempdirManager,\r
- support.LoggingSilencer,\r
- unittest.TestCase):\r
-\r
- @unittest.skipUnless(zlib, "requires zlib")\r
- def test_make_tarball(self):\r
- # creating something to tar\r
- tmpdir = self.mkdtemp()\r
- self.write_file([tmpdir, 'file1'], 'xxx')\r
- self.write_file([tmpdir, 'file2'], 'xxx')\r
- os.mkdir(os.path.join(tmpdir, 'sub'))\r
- self.write_file([tmpdir, 'sub', 'file3'], 'xxx')\r
-\r
- tmpdir2 = self.mkdtemp()\r
- unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],\r
- "source and target should be on same drive")\r
-\r
- base_name = os.path.join(tmpdir2, 'archive')\r
-\r
- # working with relative paths to avoid tar warnings\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- make_tarball(splitdrive(base_name)[1], '.')\r
- finally:\r
- os.chdir(old_dir)\r
-\r
- # check if the compressed tarball was created\r
- tarball = base_name + '.tar.gz'\r
- self.assertTrue(os.path.exists(tarball))\r
-\r
- # trying an uncompressed one\r
- base_name = os.path.join(tmpdir2, 'archive')\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- make_tarball(splitdrive(base_name)[1], '.', compress=None)\r
- finally:\r
- os.chdir(old_dir)\r
- tarball = base_name + '.tar'\r
- self.assertTrue(os.path.exists(tarball))\r
-\r
- def _tarinfo(self, path):\r
- tar = tarfile.open(path)\r
- try:\r
- names = tar.getnames()\r
- names.sort()\r
- return tuple(names)\r
- finally:\r
- tar.close()\r
-\r
- def _create_files(self):\r
- # creating something to tar\r
- tmpdir = self.mkdtemp()\r
- dist = os.path.join(tmpdir, 'dist')\r
- os.mkdir(dist)\r
- self.write_file([dist, 'file1'], 'xxx')\r
- self.write_file([dist, 'file2'], 'xxx')\r
- os.mkdir(os.path.join(dist, 'sub'))\r
- self.write_file([dist, 'sub', 'file3'], 'xxx')\r
- os.mkdir(os.path.join(dist, 'sub2'))\r
- tmpdir2 = self.mkdtemp()\r
- base_name = os.path.join(tmpdir2, 'archive')\r
- return tmpdir, tmpdir2, base_name\r
-\r
- @unittest.skipUnless(zlib, "Requires zlib")\r
- @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),\r
- 'Need the tar command to run')\r
- def test_tarfile_vs_tar(self):\r
- tmpdir, tmpdir2, base_name = self._create_files()\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- make_tarball(base_name, 'dist')\r
- finally:\r
- os.chdir(old_dir)\r
-\r
- # check if the compressed tarball was created\r
- tarball = base_name + '.tar.gz'\r
- self.assertTrue(os.path.exists(tarball))\r
-\r
- # now create another tarball using `tar`\r
- tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')\r
- tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']\r
- gzip_cmd = ['gzip', '-f9', 'archive2.tar']\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- spawn(tar_cmd)\r
- spawn(gzip_cmd)\r
- finally:\r
- os.chdir(old_dir)\r
-\r
- self.assertTrue(os.path.exists(tarball2))\r
- # let's compare both tarballs\r
- self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2))\r
-\r
- # trying an uncompressed one\r
- base_name = os.path.join(tmpdir2, 'archive')\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- make_tarball(base_name, 'dist', compress=None)\r
- finally:\r
- os.chdir(old_dir)\r
- tarball = base_name + '.tar'\r
- self.assertTrue(os.path.exists(tarball))\r
-\r
- # now for a dry_run\r
- base_name = os.path.join(tmpdir2, 'archive')\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- make_tarball(base_name, 'dist', compress=None, dry_run=True)\r
- finally:\r
- os.chdir(old_dir)\r
- tarball = base_name + '.tar'\r
- self.assertTrue(os.path.exists(tarball))\r
-\r
- @unittest.skipUnless(find_executable('compress'),\r
- 'The compress program is required')\r
- def test_compress_deprecated(self):\r
- tmpdir, tmpdir2, base_name = self._create_files()\r
-\r
- # using compress and testing the PendingDeprecationWarning\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- with check_warnings() as w:\r
- warnings.simplefilter("always")\r
- make_tarball(base_name, 'dist', compress='compress')\r
- finally:\r
- os.chdir(old_dir)\r
- tarball = base_name + '.tar.Z'\r
- self.assertTrue(os.path.exists(tarball))\r
- self.assertEqual(len(w.warnings), 1)\r
-\r
- # same test with dry_run\r
- os.remove(tarball)\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- try:\r
- with check_warnings() as w:\r
- warnings.simplefilter("always")\r
- make_tarball(base_name, 'dist', compress='compress',\r
- dry_run=True)\r
- finally:\r
- os.chdir(old_dir)\r
- self.assertTrue(not os.path.exists(tarball))\r
- self.assertEqual(len(w.warnings), 1)\r
-\r
- @unittest.skipUnless(zlib, "Requires zlib")\r
- @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')\r
- def test_make_zipfile(self):\r
- # creating something to tar\r
- tmpdir = self.mkdtemp()\r
- self.write_file([tmpdir, 'file1'], 'xxx')\r
- self.write_file([tmpdir, 'file2'], 'xxx')\r
-\r
- tmpdir2 = self.mkdtemp()\r
- base_name = os.path.join(tmpdir2, 'archive')\r
- make_zipfile(base_name, tmpdir)\r
-\r
- # check if the compressed tarball was created\r
- tarball = base_name + '.zip'\r
-\r
- def test_check_archive_formats(self):\r
- self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']),\r
- 'xxx')\r
- self.assertEqual(check_archive_formats(['gztar', 'zip']), None)\r
-\r
- def test_make_archive(self):\r
- tmpdir = self.mkdtemp()\r
- base_name = os.path.join(tmpdir, 'archive')\r
- self.assertRaises(ValueError, make_archive, base_name, 'xxx')\r
-\r
- @unittest.skipUnless(zlib, "Requires zlib")\r
- def test_make_archive_owner_group(self):\r
- # testing make_archive with owner and group, with various combinations\r
- # this works even if there's not gid/uid support\r
- if UID_GID_SUPPORT:\r
- group = grp.getgrgid(0)[0]\r
- owner = pwd.getpwuid(0)[0]\r
- else:\r
- group = owner = 'root'\r
-\r
- base_dir, root_dir, base_name = self._create_files()\r
- base_name = os.path.join(self.mkdtemp() , 'archive')\r
- res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner,\r
- group=group)\r
- self.assertTrue(os.path.exists(res))\r
-\r
- res = make_archive(base_name, 'zip', root_dir, base_dir)\r
- self.assertTrue(os.path.exists(res))\r
-\r
- res = make_archive(base_name, 'tar', root_dir, base_dir,\r
- owner=owner, group=group)\r
- self.assertTrue(os.path.exists(res))\r
-\r
- res = make_archive(base_name, 'tar', root_dir, base_dir,\r
- owner='kjhkjhkjg', group='oihohoh')\r
- self.assertTrue(os.path.exists(res))\r
-\r
- @unittest.skipUnless(zlib, "Requires zlib")\r
- @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")\r
- def test_tarfile_root_owner(self):\r
- tmpdir, tmpdir2, base_name = self._create_files()\r
- old_dir = os.getcwd()\r
- os.chdir(tmpdir)\r
- group = grp.getgrgid(0)[0]\r
- owner = pwd.getpwuid(0)[0]\r
- try:\r
- archive_name = make_tarball(base_name, 'dist', compress=None,\r
- owner=owner, group=group)\r
- finally:\r
- os.chdir(old_dir)\r
-\r
- # check if the compressed tarball was created\r
- self.assertTrue(os.path.exists(archive_name))\r
-\r
- # now checks the rights\r
- archive = tarfile.open(archive_name)\r
- try:\r
- for member in archive.getmembers():\r
- self.assertEqual(member.uid, 0)\r
- self.assertEqual(member.gid, 0)\r
- finally:\r
- archive.close()\r
-\r
- def test_make_archive_cwd(self):\r
- current_dir = os.getcwd()\r
- def _breaks(*args, **kw):\r
- raise RuntimeError()\r
- ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file')\r
- try:\r
- try:\r
- make_archive('xxx', 'xxx', root_dir=self.mkdtemp())\r
- except:\r
- pass\r
- self.assertEqual(os.getcwd(), current_dir)\r
- finally:\r
- del ARCHIVE_FORMATS['xxx']\r
-\r
-def test_suite():\r
- return unittest.makeSuite(ArchiveUtilTestCase)\r
-\r
-if __name__ == "__main__":\r
- run_unittest(test_suite())\r