diff options
Diffstat (limited to 'morphlib/bins_tests.py')
-rw-r--r-- | morphlib/bins_tests.py | 98 |
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)) |