diff --git a/tests/test_metadata_bundle.py b/tests/test_metadata_bundle.py index 7d12e0cc..be30e6ba 100644 --- a/tests/test_metadata_bundle.py +++ b/tests/test_metadata_bundle.py @@ -14,15 +14,35 @@ class TestMetadataBundle(unittest.TestCase): def test_local_load(self): repo_dir = os.path.join(os.getcwd(), 'repository_data', 'repository', 'metadata') + # test loading all local metadata succesfully bundle = MetadataBundle(repo_dir) bundle.root_update_finished() - self.assertTrue(bundle.load_local_timestamp()) self.assertTrue(bundle.load_local_snapshot()) self.assertTrue(bundle.load_local_targets()) self.assertTrue(bundle.load_local_delegated_targets('role1','targets')) self.assertTrue(bundle.load_local_delegated_targets('role2','role1')) + # Make sure loading metadata without its "dependencies" fails + bundle = MetadataBundle(repo_dir) + + with self.assertRaises(RuntimeError): + bundle.load_local_timestamp() + bundle.root_update_finished() + with self.assertRaises(RuntimeError): + bundle.load_local_snapshot() + self.assertTrue(bundle.load_local_timestamp()) + with self.assertRaises(RuntimeError): + bundle.load_local_targets() + self.assertTrue(bundle.load_local_snapshot()) + with self.assertRaises(RuntimeError): + bundle.load_local_delegated_targets('role1','targets') + self.assertTrue(bundle.load_local_targets()) + with self.assertRaises(RuntimeError): + bundle.load_local_delegated_targets('role2','role1') + self.assertTrue(bundle.load_local_delegated_targets('role1','targets')) + self.assertTrue(bundle.load_local_delegated_targets('role2','role1')) + if __name__ == '__main__': utils.configure_test_logging(sys.argv) diff --git a/tuf/client_rework/metadata_bundle.py b/tuf/client_rework/metadata_bundle.py index 1f7b5d22..3ea73809 100644 --- a/tuf/client_rework/metadata_bundle.py +++ b/tuf/client_rework/metadata_bundle.py @@ -204,7 +204,7 @@ def update_root(self, data: bytes): def root_update_finished(self): """Mark root metadata as final.""" if self.reference_time is not None: - raise ValueError("Root update is already finished") + raise RuntimeError("Root update is already finished") # Store our reference "now", verify root expiry self.reference_time = datetime.utcnow() @@ -306,7 +306,7 @@ def _load_intermediate_root(self, data: bytes): Note that an expired intermediate root is considered valid: expiry is only checked for the final root in root_update_finished().""" if self.reference_time is not None: - raise ValueError("Cannot update root after root update is finished") + raise RuntimeError("Cannot update root after root update is finished") try: new_root = Metadata.from_bytes(data) @@ -341,9 +341,9 @@ def _load_timestamp(self, data: bytes): """Verifies and loads 'data' as new timestamp metadata.""" if self.reference_time is None: # root_update_finished() not called - raise ValueError("Cannot update timestamp before root") + raise RuntimeError("Cannot update timestamp before root") if self.snapshot is not None: - raise ValueError("Cannot update timestamp after snapshot") + raise RuntimeError("Cannot update timestamp after snapshot") try: new_timestamp = Metadata.from_bytes(data) @@ -391,9 +391,9 @@ def _load_snapshot(self, data: bytes): # pylint: disable=too-many-branches """Verifies and loads 'data' as new snapshot metadata.""" if self.timestamp is None: - raise ValueError("Cannot update snapshot before timestamp") + raise RuntimeError("Cannot update snapshot before timestamp") if self.targets is not None: - raise ValueError("Cannot update snapshot after targets") + raise RuntimeError("Cannot update snapshot after targets") meta = self.timestamp.signed.meta["snapshot.json"] @@ -462,11 +462,11 @@ def _load_delegated_targets( Raises if verification fails """ if self.snapshot is None: - raise ValueError("Cannot load targets before snapshot") + raise RuntimeError("Cannot load targets before snapshot") delegator = self.get(delegator_name) if delegator is None: - raise ValueError("Cannot load targets before delegator") + raise RuntimeError("Cannot load targets before delegator") # Verify against the hashes in snapshot, if any meta = self.snapshot.signed.meta.get(f"{role_name}.json")