PageRenderTime 36ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/python/Lib/distutils/tests/test_archive_util.py

https://gitlab.com/pmuontains/Odoo
Python | 328 lines | 248 code | 45 blank | 35 comment | 41 complexity | 29a6502cf7af08735a7f16d4f0a13f80 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. """Tests for distutils.archive_util."""
  3. __revision__ = "$Id$"
  4. import unittest
  5. import os
  6. import sys
  7. import tarfile
  8. from os.path import splitdrive
  9. import warnings
  10. from distutils.archive_util import (check_archive_formats, make_tarball,
  11. make_zipfile, make_archive,
  12. ARCHIVE_FORMATS)
  13. from distutils.spawn import find_executable, spawn
  14. from distutils.tests import support
  15. from test.test_support import check_warnings, run_unittest
  16. try:
  17. import grp
  18. import pwd
  19. UID_GID_SUPPORT = True
  20. except ImportError:
  21. UID_GID_SUPPORT = False
  22. try:
  23. import zipfile
  24. ZIP_SUPPORT = True
  25. except ImportError:
  26. ZIP_SUPPORT = find_executable('zip')
  27. # some tests will fail if zlib is not available
  28. try:
  29. import zlib
  30. except ImportError:
  31. zlib = None
  32. def can_fs_encode(filename):
  33. """
  34. Return True if the filename can be saved in the file system.
  35. """
  36. if os.path.supports_unicode_filenames:
  37. return True
  38. try:
  39. filename.encode(sys.getfilesystemencoding())
  40. except UnicodeEncodeError:
  41. return False
  42. return True
  43. class ArchiveUtilTestCase(support.TempdirManager,
  44. support.LoggingSilencer,
  45. unittest.TestCase):
  46. @unittest.skipUnless(zlib, "requires zlib")
  47. def test_make_tarball(self):
  48. self._make_tarball('archive')
  49. def _make_tarball(self, target_name):
  50. # creating something to tar
  51. tmpdir = self.mkdtemp()
  52. self.write_file([tmpdir, 'file1'], 'xxx')
  53. self.write_file([tmpdir, 'file2'], 'xxx')
  54. os.mkdir(os.path.join(tmpdir, 'sub'))
  55. self.write_file([tmpdir, 'sub', 'file3'], 'xxx')
  56. tmpdir2 = self.mkdtemp()
  57. unittest.skipUnless(splitdrive(tmpdir)[0] == splitdrive(tmpdir2)[0],
  58. "source and target should be on same drive")
  59. base_name = os.path.join(tmpdir2, target_name)
  60. # working with relative paths to avoid tar warnings
  61. old_dir = os.getcwd()
  62. os.chdir(tmpdir)
  63. try:
  64. make_tarball(splitdrive(base_name)[1], '.')
  65. finally:
  66. os.chdir(old_dir)
  67. # check if the compressed tarball was created
  68. tarball = base_name + '.tar.gz'
  69. self.assertTrue(os.path.exists(tarball))
  70. # trying an uncompressed one
  71. base_name = os.path.join(tmpdir2, target_name)
  72. old_dir = os.getcwd()
  73. os.chdir(tmpdir)
  74. try:
  75. make_tarball(splitdrive(base_name)[1], '.', compress=None)
  76. finally:
  77. os.chdir(old_dir)
  78. tarball = base_name + '.tar'
  79. self.assertTrue(os.path.exists(tarball))
  80. def _tarinfo(self, path):
  81. tar = tarfile.open(path)
  82. try:
  83. names = tar.getnames()
  84. names.sort()
  85. return tuple(names)
  86. finally:
  87. tar.close()
  88. def _create_files(self):
  89. # creating something to tar
  90. tmpdir = self.mkdtemp()
  91. dist = os.path.join(tmpdir, 'dist')
  92. os.mkdir(dist)
  93. self.write_file([dist, 'file1'], 'xxx')
  94. self.write_file([dist, 'file2'], 'xxx')
  95. os.mkdir(os.path.join(dist, 'sub'))
  96. self.write_file([dist, 'sub', 'file3'], 'xxx')
  97. os.mkdir(os.path.join(dist, 'sub2'))
  98. tmpdir2 = self.mkdtemp()
  99. base_name = os.path.join(tmpdir2, 'archive')
  100. return tmpdir, tmpdir2, base_name
  101. @unittest.skipUnless(zlib, "Requires zlib")
  102. @unittest.skipUnless(find_executable('tar') and find_executable('gzip'),
  103. 'Need the tar command to run')
  104. def test_tarfile_vs_tar(self):
  105. tmpdir, tmpdir2, base_name = self._create_files()
  106. old_dir = os.getcwd()
  107. os.chdir(tmpdir)
  108. try:
  109. make_tarball(base_name, 'dist')
  110. finally:
  111. os.chdir(old_dir)
  112. # check if the compressed tarball was created
  113. tarball = base_name + '.tar.gz'
  114. self.assertTrue(os.path.exists(tarball))
  115. # now create another tarball using `tar`
  116. tarball2 = os.path.join(tmpdir, 'archive2.tar.gz')
  117. tar_cmd = ['tar', '-cf', 'archive2.tar', 'dist']
  118. gzip_cmd = ['gzip', '-f9', 'archive2.tar']
  119. old_dir = os.getcwd()
  120. os.chdir(tmpdir)
  121. try:
  122. spawn(tar_cmd)
  123. spawn(gzip_cmd)
  124. finally:
  125. os.chdir(old_dir)
  126. self.assertTrue(os.path.exists(tarball2))
  127. # let's compare both tarballs
  128. self.assertEqual(self._tarinfo(tarball), self._tarinfo(tarball2))
  129. # trying an uncompressed one
  130. base_name = os.path.join(tmpdir2, 'archive')
  131. old_dir = os.getcwd()
  132. os.chdir(tmpdir)
  133. try:
  134. make_tarball(base_name, 'dist', compress=None)
  135. finally:
  136. os.chdir(old_dir)
  137. tarball = base_name + '.tar'
  138. self.assertTrue(os.path.exists(tarball))
  139. # now for a dry_run
  140. base_name = os.path.join(tmpdir2, 'archive')
  141. old_dir = os.getcwd()
  142. os.chdir(tmpdir)
  143. try:
  144. make_tarball(base_name, 'dist', compress=None, dry_run=True)
  145. finally:
  146. os.chdir(old_dir)
  147. tarball = base_name + '.tar'
  148. self.assertTrue(os.path.exists(tarball))
  149. @unittest.skipUnless(find_executable('compress'),
  150. 'The compress program is required')
  151. def test_compress_deprecated(self):
  152. tmpdir, tmpdir2, base_name = self._create_files()
  153. # using compress and testing the PendingDeprecationWarning
  154. old_dir = os.getcwd()
  155. os.chdir(tmpdir)
  156. try:
  157. with check_warnings() as w:
  158. warnings.simplefilter("always")
  159. make_tarball(base_name, 'dist', compress='compress')
  160. finally:
  161. os.chdir(old_dir)
  162. tarball = base_name + '.tar.Z'
  163. self.assertTrue(os.path.exists(tarball))
  164. self.assertEqual(len(w.warnings), 1)
  165. # same test with dry_run
  166. os.remove(tarball)
  167. old_dir = os.getcwd()
  168. os.chdir(tmpdir)
  169. try:
  170. with check_warnings() as w:
  171. warnings.simplefilter("always")
  172. make_tarball(base_name, 'dist', compress='compress',
  173. dry_run=True)
  174. finally:
  175. os.chdir(old_dir)
  176. self.assertFalse(os.path.exists(tarball))
  177. self.assertEqual(len(w.warnings), 1)
  178. @unittest.skipUnless(zlib, "Requires zlib")
  179. @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
  180. def test_make_zipfile(self):
  181. # creating something to tar
  182. tmpdir = self.mkdtemp()
  183. self.write_file([tmpdir, 'file1'], 'xxx')
  184. self.write_file([tmpdir, 'file2'], 'xxx')
  185. tmpdir2 = self.mkdtemp()
  186. base_name = os.path.join(tmpdir2, 'archive')
  187. make_zipfile(base_name, tmpdir)
  188. # check if the compressed tarball was created
  189. tarball = base_name + '.zip'
  190. def test_check_archive_formats(self):
  191. self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']),
  192. 'xxx')
  193. self.assertEqual(check_archive_formats(['gztar', 'zip']), None)
  194. def test_make_archive(self):
  195. tmpdir = self.mkdtemp()
  196. base_name = os.path.join(tmpdir, 'archive')
  197. self.assertRaises(ValueError, make_archive, base_name, 'xxx')
  198. @unittest.skipUnless(zlib, "Requires zlib")
  199. def test_make_archive_owner_group(self):
  200. # testing make_archive with owner and group, with various combinations
  201. # this works even if there's not gid/uid support
  202. if UID_GID_SUPPORT:
  203. group = grp.getgrgid(0)[0]
  204. owner = pwd.getpwuid(0)[0]
  205. else:
  206. group = owner = 'root'
  207. base_dir, root_dir, base_name = self._create_files()
  208. base_name = os.path.join(self.mkdtemp() , 'archive')
  209. res = make_archive(base_name, 'zip', root_dir, base_dir, owner=owner,
  210. group=group)
  211. self.assertTrue(os.path.exists(res))
  212. res = make_archive(base_name, 'zip', root_dir, base_dir)
  213. self.assertTrue(os.path.exists(res))
  214. res = make_archive(base_name, 'tar', root_dir, base_dir,
  215. owner=owner, group=group)
  216. self.assertTrue(os.path.exists(res))
  217. res = make_archive(base_name, 'tar', root_dir, base_dir,
  218. owner='kjhkjhkjg', group='oihohoh')
  219. self.assertTrue(os.path.exists(res))
  220. @unittest.skipUnless(zlib, "Requires zlib")
  221. @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
  222. def test_tarfile_root_owner(self):
  223. tmpdir, tmpdir2, base_name = self._create_files()
  224. old_dir = os.getcwd()
  225. os.chdir(tmpdir)
  226. group = grp.getgrgid(0)[0]
  227. owner = pwd.getpwuid(0)[0]
  228. try:
  229. archive_name = make_tarball(base_name, 'dist', compress=None,
  230. owner=owner, group=group)
  231. finally:
  232. os.chdir(old_dir)
  233. # check if the compressed tarball was created
  234. self.assertTrue(os.path.exists(archive_name))
  235. # now checks the rights
  236. archive = tarfile.open(archive_name)
  237. try:
  238. for member in archive.getmembers():
  239. self.assertEqual(member.uid, 0)
  240. self.assertEqual(member.gid, 0)
  241. finally:
  242. archive.close()
  243. def test_make_archive_cwd(self):
  244. current_dir = os.getcwd()
  245. def _breaks(*args, **kw):
  246. raise RuntimeError()
  247. ARCHIVE_FORMATS['xxx'] = (_breaks, [], 'xxx file')
  248. try:
  249. try:
  250. make_archive('xxx', 'xxx', root_dir=self.mkdtemp())
  251. except:
  252. pass
  253. self.assertEqual(os.getcwd(), current_dir)
  254. finally:
  255. del ARCHIVE_FORMATS['xxx']
  256. @unittest.skipUnless(zlib, "requires zlib")
  257. def test_make_tarball_unicode(self):
  258. """
  259. Mirror test_make_tarball, except filename is unicode.
  260. """
  261. self._make_tarball(u'archive')
  262. @unittest.skipUnless(zlib, "requires zlib")
  263. @unittest.skipUnless(can_fs_encode(u'årchiv'),
  264. 'File system cannot handle this filename')
  265. def test_make_tarball_unicode_latin1(self):
  266. """
  267. Mirror test_make_tarball, except filename is unicode and contains
  268. latin characters.
  269. """
  270. self._make_tarball(u'årchiv') # note this isn't a real word
  271. @unittest.skipUnless(zlib, "requires zlib")
  272. @unittest.skipUnless(can_fs_encode(u'のアーカイブ'),
  273. 'File system cannot handle this filename')
  274. def test_make_tarball_unicode_extended(self):
  275. """
  276. Mirror test_make_tarball, except filename is unicode and contains
  277. characters outside the latin charset.
  278. """
  279. self._make_tarball(u'のアーカイブ') # japanese for archive
  280. def test_suite():
  281. return unittest.makeSuite(ArchiveUtilTestCase)
  282. if __name__ == "__main__":
  283. run_unittest(test_suite())