diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2012-07-05 13:05:45 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2012-07-05 15:04:55 +0100 |
commit | db8f668ddd9a99385f54bc23fc857dda6dc2c826 (patch) | |
tree | ced1275e7b6a9aa2338b062aebf1658d26901dfe | |
parent | db39f34c4c1b7ca5620f466c34e7fbf8a81709d6 (diff) | |
download | morph-db8f668ddd9a99385f54bc23fc857dda6dc2c826.tar.gz |
unit tests: add tests for tarball extraction
-rw-r--r-- | morphlib/bins.py | 2 | ||||
-rw-r--r-- | morphlib/bins_tests.py | 75 |
2 files changed, 75 insertions, 2 deletions
diff --git a/morphlib/bins.py b/morphlib/bins.py index ce17d0a1..3c6c1bad 100644 --- a/morphlib/bins.py +++ b/morphlib/bins.py @@ -66,7 +66,7 @@ def create_chunk(rootdir, f, regexps, dump_memory_profile=None): yield filename logging.debug('Creating chunk file %s from %s with regexps %s' % - (f.name, rootdir, regexps)) + (getattr(f, 'name', 'UNNAMED'), rootdir, regexps)) dump_memory_profile('at beginning of create_chunk') compiled = [re.compile(x) for x in regexps] diff --git a/morphlib/bins_tests.py b/morphlib/bins_tests.py index 2333bedc..3d9c7fb5 100644 --- a/morphlib/bins_tests.py +++ b/morphlib/bins_tests.py @@ -18,7 +18,9 @@ import os import shutil import stat import tempfile +import tarfile import unittest +import StringIO import morphlib @@ -101,7 +103,7 @@ class ChunkTests(BinsTest): with open(filename, 'w'): pass os.utime(filename, (timestamp, timestamp)) - + self.instdir_orig_files = self.recursive_lstat(self.instdir) def create_chunk(self, regexps): @@ -132,3 +134,74 @@ class ChunkTests(BinsTest): self.assertEqual([x for x,y in self.recursive_lstat(self.instdir)], ['.', 'lib', 'lib/libfoo.so']) +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 ['.'] + linktar = self.create_chunk(make_linkfile) + + def make_file(basedir): + with open(os.path.join(basedir, 'bar'), 'w') as f: pass + return ['.'] + 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 ['.'] + linktar = self.create_chunk(make_usrlink) + + def make_usrdir(basedir): + os.mkdir(os.path.join(basedir, 'usr')) + return ['.'] + 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 ['.'] + 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 ['.'] + 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)) + |