summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_tarfile.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_tarfile.py')
-rw-r--r--Lib/test/test_tarfile.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 3c51c04..561d5fc 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -4,6 +4,7 @@ import io
from hashlib import md5
from contextlib import contextmanager
from random import Random
+import pathlib
import unittest
import unittest.mock
@@ -440,6 +441,22 @@ class MiscReadTestBase(CommonReadTest):
self.assertIsInstance(tar.name, bytes)
self.assertEqual(tar.name, os.path.abspath(fobj.name))
+ def test_pathlike_name(self):
+ tarname = pathlib.Path(self.tarname)
+ with tarfile.open(tarname, mode=self.mode) as tar:
+ self.assertIsInstance(tar.name, str)
+ self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname)))
+ with self.taropen(tarname) as tar:
+ self.assertIsInstance(tar.name, str)
+ self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname)))
+ with tarfile.TarFile.open(tarname, mode=self.mode) as tar:
+ self.assertIsInstance(tar.name, str)
+ self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname)))
+ if self.suffix == '':
+ with tarfile.TarFile(tarname, mode='r') as tar:
+ self.assertIsInstance(tar.name, str)
+ self.assertEqual(tar.name, os.path.abspath(os.fspath(tarname)))
+
def test_illegal_mode_arg(self):
with open(tmpname, 'wb'):
pass
@@ -582,6 +599,26 @@ class MiscReadTestBase(CommonReadTest):
finally:
support.rmtree(DIR)
+ def test_extractall_pathlike_name(self):
+ DIR = pathlib.Path(TEMPDIR) / "extractall"
+ with support.temp_dir(DIR), \
+ tarfile.open(tarname, encoding="iso8859-1") as tar:
+ directories = [t for t in tar if t.isdir()]
+ tar.extractall(DIR, directories)
+ for tarinfo in directories:
+ path = DIR / tarinfo.name
+ self.assertEqual(os.path.getmtime(path), tarinfo.mtime)
+
+ def test_extract_pathlike_name(self):
+ dirtype = "ustar/dirtype"
+ DIR = pathlib.Path(TEMPDIR) / "extractall"
+ with support.temp_dir(DIR), \
+ tarfile.open(tarname, encoding="iso8859-1") as tar:
+ tarinfo = tar.getmember(dirtype)
+ tar.extract(tarinfo, path=DIR)
+ extracted = DIR / dirtype
+ self.assertEqual(os.path.getmtime(extracted), tarinfo.mtime)
+
def test_init_close_fobj(self):
# Issue #7341: Close the internal file object in the TarFile
# constructor in case of an error. For the test we rely on
@@ -1092,6 +1129,17 @@ class WriteTest(WriteTestBase, unittest.TestCase):
finally:
support.rmdir(path)
+ def test_gettarinfo_pathlike_name(self):
+ with tarfile.open(tmpname, self.mode) as tar:
+ path = pathlib.Path(TEMPDIR) / "file"
+ with open(path, "wb") as fobj:
+ fobj.write(b"aaa")
+ tarinfo = tar.gettarinfo(path)
+ tarinfo2 = tar.gettarinfo(os.fspath(path))
+ self.assertIsInstance(tarinfo.name, str)
+ self.assertEqual(tarinfo.name, tarinfo2.name)
+ self.assertEqual(tarinfo.size, 3)
+
@unittest.skipUnless(hasattr(os, "link"),
"Missing hardlink implementation")
def test_link_size(self):
@@ -1501,6 +1549,34 @@ class CreateTest(WriteTestBase, unittest.TestCase):
self.assertEqual(len(names), 1)
self.assertIn("spameggs42", names[0])
+ def test_create_pathlike_name(self):
+ with tarfile.open(pathlib.Path(tmpname), self.mode) as tobj:
+ self.assertIsInstance(tobj.name, str)
+ self.assertEqual(tobj.name, os.path.abspath(tmpname))
+ tobj.add(pathlib.Path(self.file_path))
+ names = tobj.getnames()
+ self.assertEqual(len(names), 1)
+ self.assertIn('spameggs42', names[0])
+
+ with self.taropen(tmpname) as tobj:
+ names = tobj.getnames()
+ self.assertEqual(len(names), 1)
+ self.assertIn('spameggs42', names[0])
+
+ def test_create_taropen_pathlike_name(self):
+ with self.taropen(pathlib.Path(tmpname), "x") as tobj:
+ self.assertIsInstance(tobj.name, str)
+ self.assertEqual(tobj.name, os.path.abspath(tmpname))
+ tobj.add(pathlib.Path(self.file_path))
+ names = tobj.getnames()
+ self.assertEqual(len(names), 1)
+ self.assertIn('spameggs42', names[0])
+
+ with self.taropen(tmpname) as tobj:
+ names = tobj.getnames()
+ self.assertEqual(len(names), 1)
+ self.assertIn('spameggs42', names[0])
+
class GzipCreateTest(GzipTest, CreateTest):
pass