summaryrefslogtreecommitdiff
path: root/morphlib/bins_tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'morphlib/bins_tests.py')
-rw-r--r--morphlib/bins_tests.py98
1 files changed, 94 insertions, 4 deletions
diff --git a/morphlib/bins_tests.py b/morphlib/bins_tests.py
index 879aada4..3895680f 100644
--- a/morphlib/bins_tests.py
+++ b/morphlib/bins_tests.py
@@ -78,9 +78,11 @@ class ChunkTests(BinsTest):
self.tempdir = tempfile.mkdtemp()
self.instdir = os.path.join(self.tempdir, 'inst')
self.chunk_file = os.path.join(self.tempdir, 'chunk')
+ self.chunk_f = open(self.chunk_file, 'wb')
self.unpacked = os.path.join(self.tempdir, 'unpacked')
def tearDown(self):
+ self.chunk_f.close()
shutil.rmtree(self.tempdir)
def populate_instdir(self):
@@ -106,21 +108,109 @@ class ChunkTests(BinsTest):
def create_chunk(self, includes):
self.populate_instdir()
- morphlib.bins.create_chunk(self.instdir, self.chunk_file, includes)
+ morphlib.bins.create_chunk(self.instdir, self.chunk_f, includes)
+ self.chunk_f.flush()
+
+ def unpack_chunk(self):
+ os.mkdir(self.unpacked)
+ morphlib.bins.unpack_binary(self.chunk_file, self.unpacked)
def test_empties_files(self):
self.create_chunk(['bin/foo', 'lib/libfoo.so'])
self.assertEqual([x for x, y in self.recursive_lstat(self.instdir)],
['.', 'bin', 'lib'])
- def test_creates_chunk_exactly(self):
+ def test_creates_and_unpacks_chunk_exactly(self):
self.create_chunk(['bin', 'bin/foo', 'lib', 'lib/libfoo.so'])
+ self.unpack_chunk()
self.assertEqual(self.instdir_orig_files,
- self.recursive_lstat(self.chunk_file))
+ self.recursive_lstat(self.unpacked))
def test_uses_only_matching_names(self):
self.create_chunk(['bin/foo'])
- self.assertEqual([x for x, y in self.recursive_lstat(self.chunk_file)],
+ self.unpack_chunk()
+ self.assertEqual([x for x, y in self.recursive_lstat(self.unpacked)],
['.', 'bin', 'bin/foo'])
self.assertEqual([x for x, y in self.recursive_lstat(self.instdir)],
['.', 'bin', 'lib', 'lib/libfoo.so'])
+
+ def test_does_not_compress_artifact(self):
+ self.create_chunk(['bin'])
+ f = gzip.open(self.chunk_file)
+ self.assertRaises(IOError, f.read)
+ f.close()
+
+
+class ExtractTests(unittest.TestCase):
+
+ def setUp(self):
+ self.tempdir = tempfile.mkdtemp()
+ self.instdir = os.path.join(self.tempdir, 'inst')
+ self.unpacked = os.path.join(self.tempdir, 'unpacked')
+
+ def tearDown(self):
+ shutil.rmtree(self.tempdir)
+
+ def create_chunk(self, callback):
+ fh = StringIO.StringIO()
+ os.mkdir(self.instdir)
+ patterns = callback(self.instdir)
+ morphlib.bins.create_chunk(self.instdir, fh, patterns)
+ shutil.rmtree(self.instdir)
+ fh.flush()
+ fh.seek(0)
+ return fh
+
+ def test_extracted_files_replace_links(self):
+ def make_linkfile(basedir):
+ with open(os.path.join(basedir, 'babar'), 'w') as f:
+ pass
+ os.symlink('babar', os.path.join(basedir, 'bar'))
+ return ['babar']
+ linktar = self.create_chunk(make_linkfile)
+
+ def make_file(basedir):
+ with open(os.path.join(basedir, 'bar'), 'w') as f:
+ pass
+ return ['bar']
+ filetar = self.create_chunk(make_file)
+
+ os.mkdir(self.unpacked)
+ morphlib.bins.unpack_binary_from_file(linktar, self.unpacked)
+ morphlib.bins.unpack_binary_from_file(filetar, self.unpacked)
+ mode = os.lstat(os.path.join(self.unpacked, 'bar')).st_mode
+ self.assertTrue(stat.S_ISREG(mode))
+
+ def test_extracted_dirs_keep_links(self):
+ def make_usrlink(basedir):
+ os.symlink('.', os.path.join(basedir, 'usr'))
+ return ['usr']
+ linktar = self.create_chunk(make_usrlink)
+
+ def make_usrdir(basedir):
+ os.mkdir(os.path.join(basedir, 'usr'))
+ return ['usr']
+ dirtar = self.create_chunk(make_usrdir)
+
+ morphlib.bins.unpack_binary_from_file(linktar, self.unpacked)
+ morphlib.bins.unpack_binary_from_file(dirtar, self.unpacked)
+ mode = os.lstat(os.path.join(self.unpacked, 'usr')).st_mode
+ self.assertTrue(stat.S_ISLNK(mode))
+
+ def test_extracted_files_follow_links(self):
+ def make_usrlink(basedir):
+ os.symlink('.', os.path.join(basedir, 'usr'))
+ return ['usr']
+ linktar = self.create_chunk(make_usrlink)
+
+ def make_usrdir(basedir):
+ os.mkdir(os.path.join(basedir, 'usr'))
+ with open(os.path.join(basedir, 'usr', 'foo'), 'w') as f:
+ pass
+ return ['usr', 'usr/foo']
+ dirtar = self.create_chunk(make_usrdir)
+
+ morphlib.bins.unpack_binary_from_file(linktar, self.unpacked)
+ morphlib.bins.unpack_binary_from_file(dirtar, self.unpacked)
+ mode = os.lstat(os.path.join(self.unpacked, 'foo')).st_mode
+ self.assertTrue(stat.S_ISREG(mode))