diff options
Diffstat (limited to 'pkg/verify_archive_test_main.py.tpl')
-rw-r--r-- | pkg/verify_archive_test_main.py.tpl | 106 |
1 files changed, 104 insertions, 2 deletions
diff --git a/pkg/verify_archive_test_main.py.tpl b/pkg/verify_archive_test_main.py.tpl index d9b17cc..f831ecb 100644 --- a/pkg/verify_archive_test_main.py.tpl +++ b/pkg/verify_archive_test_main.py.tpl @@ -13,11 +13,110 @@ # limitations under the License. """Tests for generated content manifest.""" +import re +import tarfile import unittest -from pkg import verify_archive_test_lib +class VerifyArchiveTest(unittest.TestCase): + """Test harness to see if we wrote the content manifest correctly.""" -class ${TEST_NAME}(verify_archive_test_lib.VerifyArchiveTest): + + def setUp(self): + super(VerifyArchiveTest, self).setUp() + + def scan_target(self, target): + parts = target.split('.') + ext = parts[-1] + if ext[0] == 't' or parts[-2] == 'tar': + self.load_tar(target) + elif ext[0] == 'z': + self.fail('Can not process zip yet') + else: + self.fail('Can not figure out the archive type for (%s)' % target) + + def load_tar(self, path): + self.paths = [] + self.links = {} + with tarfile.open(path, 'r:*') as f: + i = 0 + for info in f: + self.paths.append(info.name) + if info.linkname: + self.links[info.name] = info.linkname + + def assertMinSize(self, min_size): + """Check that the archive contains at least min_size entries. + + Args: + min_size: The minimum number of targets we expect. + """ + if min_size <= 0: + return + actual_size = len(self.paths) + self.assertGreaterEqual( + len(self.paths), + min_size, + msg = "Expected at least %d files, but found only %d" % ( + min_size, actual_size)) + + def assertMaxSize(self, max_size): + """Check that the archive contains at most max_size entries. + + Args: + max_size: The maximum number of targets we expect. + """ + if max_size <= 0: + return + actual_size = len(self.paths) + self.assertLessEqual( + len(self.paths), + max_size, + msg = "Expected at most %d files, but found %d" % ( + max_size, actual_size)) + + def check_must_contain(self, must_contain): + plain_patterns = set(must_contain) + for path in self.paths: + if path in plain_patterns: + plain_patterns.remove(path) + if len(plain_patterns) > 0: + self.fail('These required paths were not found: %s' % ','.join(plain_patterns) + ' in [%s]' % ','.join(self.paths)) + + def check_must_not_contain(self, must_not_contain): + plain_patterns = set(must_not_contain) + for path in self.paths: + if path in plain_patterns: + self.fail('Found disallowed path (%s) in the archive' % path) + + def check_must_contain_regex(self, must_contain_regex): + for pattern in must_contain_regex: + r_comp = re.compile(pattern) + matched = False + for path in self.paths: + if r_comp.match(path): + matched = True + break + if not match: + self.fail('Did not find pattern (%s) in the archive' % pattern) + + def check_must_not_contain_regex(self, must_not_contain_regex): + for pattern in must_not_contain_regex: + r_comp = re.compile(pattern) + matched = False + for path in self.paths: + if r_comp.match(path): + self.fail('Found disallowed pattern (%s) in the archive' % pattern) + + def verify_links(self, verify_links): + for link, target in verify_links.items(): + if link not in self.paths: + self.fail('Required link (%s) is not in the archive' % link) + if self.links[link] != target: + self.fail('link (%s) points to the wrong place. Expected (%s) got (%s)' % + (link, target, self.links[link])) + + +class ${TEST_NAME}(VerifyArchiveTest): def setUp(self): super(${TEST_NAME}, self).setUp() @@ -41,6 +140,9 @@ class ${TEST_NAME}(verify_archive_test_lib.VerifyArchiveTest): def test_must_not_contain(self): self.check_must_not_contain_regex(${MUST_NOT_CONTAIN_REGEX}) + def test_verify_links(self): + self.verify_links(${VERIFY_LINKS}) + if __name__ == '__main__': unittest.main() |