From efb56530161d064923b89c38408a8f07f7f9722d Mon Sep 17 00:00:00 2001 From: Jussi Kukkonen Date: Tue, 17 Aug 2021 13:54:18 +0300 Subject: [PATCH 1/4] tests: Improve TrustedSet coverage * test for succesful root update * fix test for snapshot version rollback in timestamp update Signed-off-by: Jussi Kukkonen --- tests/test_trusted_metadata_set.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/tests/test_trusted_metadata_set.py b/tests/test_trusted_metadata_set.py index aa2d39e4..29e9896b 100644 --- a/tests/test_trusted_metadata_set.py +++ b/tests/test_trusted_metadata_set.py @@ -214,6 +214,13 @@ def test_update_with_invalid_json(self): update_func(metadata) + def test_update_root_new_root(self): + # test that root can be updated with a new valid version + def root_new_version_modifier(root: Root) -> None: + root.version += 1 + + root = self.modify_metadata("root", root_new_version_modifier) + self.trusted_set.update_root(root) def test_update_root_new_root_cannot_be_verified_with_threshold(self): # new_root data with threshold which cannot be verified. @@ -227,7 +234,6 @@ def test_update_root_new_root_ver_same_as_trusted_root_ver(self): with self.assertRaises(exceptions.ReplayedMetadataError): self.trusted_set.update_root(self.metadata["root"]) - def test_root_update_finished_expired(self): def root_expired_modifier(root: Root) -> None: root.expires = datetime(1970, 1, 1) @@ -249,13 +255,15 @@ def version_modifier(timestamp: Timestamp) -> None: with self.assertRaises(exceptions.ReplayedMetadataError): self.trusted_set.update_timestamp(self.metadata["timestamp"]) - def test_update_timestamp_snapshot_ver_below_trusted_snapshot_ver(self): - def version_modifier(timestamp: Timestamp) -> None: - timestamp.version = 3 + def test_update_timestamp_snapshot_ver_below_current(self): + def bump_snapshot_version(timestamp: Timestamp) -> None: + timestamp.meta["snapshot.json"].version = 2 - modified_timestamp = self.modify_metadata("timestamp", version_modifier) - self._root_updated_and_update_timestamp(modified_timestamp) - # new_timestamp.snapshot.version < trusted_timestamp.snapshot.version + # set current known snapshot.json version to 2 + timestamp = self.modify_metadata("timestamp", bump_snapshot_version) + self._root_updated_and_update_timestamp(timestamp) + + # newtimestamp.meta["snapshot.json"].version < trusted_timestamp.meta["snapshot.json"].version with self.assertRaises(exceptions.ReplayedMetadataError): self.trusted_set.update_timestamp(self.metadata["timestamp"]) @@ -323,7 +331,6 @@ def snapshot_expired_modifier(snapshot: Snapshot) -> None: with self.assertRaises(exceptions.ExpiredMetadataError): self.trusted_set.update_snapshot(snapshot) - def test_update_targets_no_meta_in_snapshot(self): def no_meta_modifier(snapshot: Snapshot) -> None: snapshot.meta = {} From 85656a56eb37492a8709bcab07294002cd9679ba Mon Sep 17 00:00:00 2001 From: Jussi Kukkonen Date: Tue, 17 Aug 2021 15:40:13 +0300 Subject: [PATCH 2/4] tests: Add missing test to TrustedMetadataSet Test failing length/hash test for snapshot Signed-off-by: Jussi Kukkonen --- tests/test_trusted_metadata_set.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_trusted_metadata_set.py b/tests/test_trusted_metadata_set.py index 29e9896b..c794bf5a 100644 --- a/tests/test_trusted_metadata_set.py +++ b/tests/test_trusted_metadata_set.py @@ -277,6 +277,16 @@ def timestamp_expired_modifier(timestamp: Timestamp) -> None: with self.assertRaises(exceptions.ExpiredMetadataError): self.trusted_set.update_timestamp(timestamp) + def test_update_snapshot_length_or_hash_mismatch(self): + def modify_snapshot_length(timestamp: Timestamp) -> None: + timestamp.meta["snapshot.json"].length = 1 + + # set known snapshot.json length to 1 + timestamp = self.modify_metadata("timestamp", modify_snapshot_length) + self._root_updated_and_update_timestamp(timestamp) + + with self.assertRaises(exceptions.RepositoryError): + self.trusted_set.update_snapshot(self.metadata["snapshot"]) def test_update_snapshot_cannot_verify_snapshot_with_threshold(self): self._root_updated_and_update_timestamp(self.metadata["timestamp"]) From caf61369ab8e1d56ef8d28dafdf9ed310e343412 Mon Sep 17 00:00:00 2001 From: Jussi Kukkonen Date: Tue, 17 Aug 2021 15:48:43 +0300 Subject: [PATCH 3/4] ngclient: Fix trusted set iterator We're unlikely to use the iterator but it's required to implement Mapping. Signed-off-by: Jussi Kukkonen --- tuf/ngclient/_internal/trusted_metadata_set.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tuf/ngclient/_internal/trusted_metadata_set.py b/tuf/ngclient/_internal/trusted_metadata_set.py index 25c46cb1..369b5255 100644 --- a/tuf/ngclient/_internal/trusted_metadata_set.py +++ b/tuf/ngclient/_internal/trusted_metadata_set.py @@ -116,7 +116,7 @@ def __len__(self) -> int: def __iter__(self) -> Iterator[Metadata]: """Returns iterator over all Metadata objects in TrustedMetadataSet""" - return iter(self._trusted_set) + return iter(self._trusted_set.values()) # Helper properties for top level metadata @property From f02fed250278b0f8ffa509826806a16e03cb4404 Mon Sep 17 00:00:00 2001 From: Jussi Kukkonen Date: Tue, 17 Aug 2021 15:50:01 +0300 Subject: [PATCH 4/4] tests: Test TrustedMetadataSet iteration Signed-off-by: Jussi Kukkonen --- tests/test_trusted_metadata_set.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_trusted_metadata_set.py b/tests/test_trusted_metadata_set.py index c794bf5a..64b2bd77 100644 --- a/tests/test_trusted_metadata_set.py +++ b/tests/test_trusted_metadata_set.py @@ -131,6 +131,13 @@ def test_update(self): # the 4 top level metadata objects + 2 additional delegated targets self.assertTrue(len(self.trusted_set), 6) + count = 0 + for md in self.trusted_set: + self.assertIsInstance(md, Metadata) + count += 1 + + self.assertTrue(count, 6) + def test_out_of_order_ops(self): # Update timestamp before root is finished with self.assertRaises(RuntimeError):