summaryrefslogtreecommitdiff
path: root/morphlib/bins_tests.py
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-10-17 20:19:41 +0100
committerLars Wirzenius <liw@liw.fi>2011-10-17 20:19:41 +0100
commite55fece2655675ff4b151134fe5e0f222f4c8d70 (patch)
treedb08e3057188c59db340e2a1600bc0c77c462c52 /morphlib/bins_tests.py
parent6961416a28270d3483d7ffd73539294cdb874403 (diff)
downloadmorph-e55fece2655675ff4b151134fe5e0f222f4c8d70.tar.gz
Add functions for creating and unpacking binary chunks.
Diffstat (limited to 'morphlib/bins_tests.py')
-rw-r--r--morphlib/bins_tests.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/morphlib/bins_tests.py b/morphlib/bins_tests.py
new file mode 100644
index 00000000..b3c13a64
--- /dev/null
+++ b/morphlib/bins_tests.py
@@ -0,0 +1,78 @@
+# Copyright (C) 2011 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+import os
+import shutil
+import tempfile
+import unittest
+
+import morphlib
+
+
+def recursive_lstat(root):
+ '''Return a list of (pathname, stat result) pairs for everything in root.
+
+ Pathnames are relative to root. Directories are recursed into.
+ The stat result is selective, not all fields are used.
+
+ '''
+
+ def remove_root(pathname):
+ assert pathname.startswith(root)
+ if pathname == root:
+ return '.'
+ else:
+ return pathname[len(root):]
+
+ def lstat(filename):
+ st = os.lstat(filename)
+ return (st.st_mode, st.st_size, int(st.st_mtime))
+
+ result = []
+
+ for dirname, subdirs, basenames in os.walk(root):
+ result.append((remove_root(dirname), lstat(dirname)))
+ for basename in sorted(basenames):
+ filename = os.path.join(dirname, basename)
+ result.append((remove_root(filename), lstat(filename)))
+ subdirs.sort()
+
+ return result
+
+
+class ChunkTests(unittest.TestCase):
+
+ def setUp(self):
+ self.tempdir = tempfile.mkdtemp()
+ self.instdir = os.path.join(self.tempdir, 'inst')
+ self.chunk_file = os.path.join(self.tempdir, 'chunk')
+ self.unpacked = os.path.join(self.tempdir, 'unpacked')
+
+ def tearDown(self):
+ shutil.rmtree(self.tempdir)
+
+ def populate_instdir(self):
+ os.mkdir(self.instdir)
+ os.mkdir(os.path.join(self.instdir, 'bin'))
+
+ def test_creates_and_unpacks_chunk_exactly(self):
+ self.populate_instdir()
+ morphlib.bins.create_chunk(self.instdir, self.chunk_file)
+ os.mkdir(self.unpacked)
+ morphlib.bins.unpack_chunk(self.chunk_file, self.unpacked)
+ self.assertEqual(recursive_lstat(self.instdir),
+ recursive_lstat(self.unpacked))
+