2024-05-29 16:12:46 +02:00
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
import tempfile
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
from osc.util.ar import Ar
|
|
|
|
from osc.util.ar import ArError
|
|
|
|
|
|
|
|
|
|
|
|
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), "fixtures")
|
|
|
|
|
|
|
|
|
|
|
|
class TestAr(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
|
|
self.tmpdir = tempfile.mkdtemp(prefix="osc_test_")
|
|
|
|
try:
|
|
|
|
self.old_cwd = os.getcwd()
|
|
|
|
except FileNotFoundError:
|
|
|
|
self.old_cwd = os.path.expanduser("~")
|
|
|
|
os.chdir(self.tmpdir)
|
|
|
|
self.archive = os.path.join(FIXTURES_DIR, "archive.ar")
|
|
|
|
self.ar = Ar(self.archive)
|
|
|
|
self.ar.read()
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
os.chdir(self.old_cwd)
|
|
|
|
shutil.rmtree(self.tmpdir)
|
|
|
|
|
|
|
|
def test_file_list(self):
|
|
|
|
actual = [i.name for i in self.ar]
|
|
|
|
expected = [
|
|
|
|
# absolute path
|
|
|
|
b"/tmp/foo",
|
|
|
|
# this is a filename, not a long filename reference
|
|
|
|
b"/123",
|
|
|
|
b"very-long-long-long-long-name",
|
|
|
|
b"very-long-long-long-long-name2",
|
|
|
|
# long file name with a newline
|
|
|
|
b"very-long-name\n-with-newline",
|
|
|
|
# short file name with a newline
|
|
|
|
b"a\nb",
|
|
|
|
b"dir/file",
|
|
|
|
]
|
|
|
|
self.assertEqual(actual, expected)
|
|
|
|
|
|
|
|
def test_get_file(self):
|
|
|
|
f = self.ar.get_file(b"/tmp/foo")
|
|
|
|
self.assertIsNotNone(f)
|
|
|
|
|
|
|
|
f = self.ar.get_file("/tmp/foo")
|
|
|
|
self.assertIsNotNone(f)
|
|
|
|
|
|
|
|
f = self.ar.get_file("does-not-exist")
|
|
|
|
self.assertIsNone(f)
|
|
|
|
|
|
|
|
def test_saveTo(self):
|
|
|
|
f = self.ar.get_file("a\nb")
|
|
|
|
path = f.saveTo(self.tmpdir)
|
|
|
|
|
|
|
|
# check that we've got the expected path
|
|
|
|
self.assertEqual(path, os.path.join(self.tmpdir, "a\nb"))
|
|
|
|
|
|
|
|
# ... and that the contents also match
|
|
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
|
|
self.assertEqual(f.read(), "newline\n")
|
|
|
|
|
|
|
|
def test_saveTo_subdir(self):
|
|
|
|
f = self.ar.get_file("dir/file")
|
|
|
|
path = f.saveTo(self.tmpdir)
|
|
|
|
|
|
|
|
# check that we've got the expected path
|
|
|
|
self.assertEqual(path, os.path.join(self.tmpdir, "dir/file"))
|
|
|
|
|
|
|
|
# ... and that the contents also match
|
|
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
|
|
self.assertEqual(f.read(), "file-in-a-dir\n")
|
|
|
|
|
|
|
|
def test_saveTo_abspath(self):
|
|
|
|
f = self.ar.get_file("/tmp/foo")
|
|
|
|
assert f is not None
|
|
|
|
# this is supposed to throw an error, extracting files with absolute paths might overwrite system files
|
|
|
|
self.assertRaises(ArError, f.saveTo, self.tmpdir)
|
|
|
|
|
2024-08-20 10:38:54 +02:00
|
|
|
def test_no_exthdr(self):
|
|
|
|
self.archive = os.path.join(FIXTURES_DIR, "archive-no-ext_fnhdr.ar")
|
|
|
|
self.ar = Ar(self.archive)
|
|
|
|
self.ar.read()
|
|
|
|
self.test_saveTo_subdir()
|
|
|
|
|
2024-05-29 16:12:46 +02:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
unittest.main()
|