summaryrefslogtreecommitdiff
path: root/morphlib/bins_tests.py
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2012-07-05 13:05:45 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2012-07-05 15:04:55 +0100
commitdb8f668ddd9a99385f54bc23fc857dda6dc2c826 (patch)
treeced1275e7b6a9aa2338b062aebf1658d26901dfe /morphlib/bins_tests.py
parentdb39f34c4c1b7ca5620f466c34e7fbf8a81709d6 (diff)
downloadmorph-db8f668ddd9a99385f54bc23fc857dda6dc2c826.tar.gz
unit tests: add tests for tarball extraction
Diffstat (limited to 'morphlib/bins_tests.py')
-rw-r--r--morphlib/bins_tests.py75
1 files changed, 74 insertions, 1 deletions
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))
+