diff options
-rw-r--r-- | gemato/recursiveloader.py | 24 | ||||
-rw-r--r-- | tests/test_recursiveloader.py | 47 |
2 files changed, 65 insertions, 6 deletions
diff --git a/gemato/recursiveloader.py b/gemato/recursiveloader.py index b007121..07b0d0e 100644 --- a/gemato/recursiveloader.py +++ b/gemato/recursiveloader.py @@ -205,12 +205,26 @@ class ManifestRecursiveLoader(object): out[fullpath] = e return out - def assert_directory_verifies(self, path=''): + def _verify_one_file(self, path, e, strict): + try: + gemato.verify.assert_path_verifies(path, e) + except gemato.verify.ManifestMismatch: + if strict: + raise + # skip MISC/OPTIONAL in non-strict mode + # TODO: provide a way to deliver warnings? + if (not isinstance(e, gemato.manifest.ManifestEntryOPTIONAL) + and not isinstance(e, gemato.manifest.ManifestEntryMISC)): + raise + + def assert_directory_verifies(self, path='', strict=True): """ Verify the complete directory tree starting at @path (relative to top Manifest directory). Includes testing for stray files. Raises an exception if any of the files does not pass verification. + + If @strict is False, MISC/OPTIONAL mismatches will be ignored. """ entry_dict = self.get_file_entry_dict(path) @@ -239,8 +253,7 @@ class ManifestRecursiveLoader(object): if isinstance(de, gemato.manifest.ManifestEntryIGNORE): skip_dirs.append(d) else: - gemato.verify.assert_path_verifies( - os.path.join(dirpath, d), de) + self._verify_one_file(os.path.join(dirpath, d), de, strict) # skip scanning ignored directories for d in skip_dirs: @@ -257,10 +270,9 @@ class ManifestRecursiveLoader(object): if fpath == 'Manifest': continue fe = entry_dict.pop(fpath, None) - gemato.verify.assert_path_verifies( - os.path.join(dirpath, f), fe) + self._verify_one_file(os.path.join(dirpath, f), fe, strict) # check for missing files for relpath, e in entry_dict.items(): syspath = os.path.join(self.root_directory, relpath) - gemato.verify.assert_path_verifies(syspath, e) + self._verify_one_file(syspath, e, strict) diff --git a/tests/test_recursiveloader.py b/tests/test_recursiveloader.py index 2483030..8257691 100644 --- a/tests/test_recursiveloader.py +++ b/tests/test_recursiveloader.py @@ -658,3 +658,50 @@ IGNORE bar m = gemato.recursiveloader.ManifestRecursiveLoader( os.path.join(self.dir, 'Manifest')) m.assert_directory_verifies('') + + +class ManifestMiscEntryTest(TempDirTestCase): + """ + Test for a Manifest file with MISC. + """ + + FILES = { + 'Manifest': u''' +MISC foo 0 MD5 d41d8cd98f00b204e9800998ecf8427e +''', + } + + def test_assert_directory_verifies(self): + m = gemato.recursiveloader.ManifestRecursiveLoader( + os.path.join(self.dir, 'Manifest')) + self.assertRaises(gemato.verify.ManifestMismatch, + m.assert_directory_verifies, '') + + def test_assert_directory_verifies_nonstrict(self): + m = gemato.recursiveloader.ManifestRecursiveLoader( + os.path.join(self.dir, 'Manifest')) + m.assert_directory_verifies('', strict=False) + + +class ManifestOptionalEntryTest(TempDirTestCase): + """ + Test for a Manifest file with OPTIONAL. + """ + + FILES = { + 'Manifest': u''' +OPTIONAL foo +''', + 'foo': u'test', + } + + def test_assert_directory_verifies(self): + m = gemato.recursiveloader.ManifestRecursiveLoader( + os.path.join(self.dir, 'Manifest')) + self.assertRaises(gemato.verify.ManifestMismatch, + m.assert_directory_verifies, '') + + def test_assert_directory_verifies_nonstrict(self): + m = gemato.recursiveloader.ManifestRecursiveLoader( + os.path.join(self.dir, 'Manifest')) + m.assert_directory_verifies('', strict=False) |