|
21 | 21 | DelegatedRole,
|
22 | 22 | Targets,
|
23 | 23 | )
|
| 24 | +from tuf.exceptions import UnsignedMetadataError |
24 | 25 | from tuf.ngclient import Updater
|
25 | 26 |
|
26 | 27 |
|
@@ -281,6 +282,45 @@ def test_graph_traversal(self, test_data: DelegationsTestCase) -> None:
|
281 | 282 | finally:
|
282 | 283 | self.teardown_subtest()
|
283 | 284 |
|
| 285 | + invalid_metadata: utils.DataSet = { |
| 286 | + "unsigned delegated role": DelegationsTestCase( |
| 287 | + delegations=[ |
| 288 | + TestDelegation("targets", "A"), |
| 289 | + TestDelegation("targets", "B"), |
| 290 | + TestDelegation("A", "C"), |
| 291 | + ], |
| 292 | + # The traversal stops after visiting an invalid role |
| 293 | + visited_order=["A"], |
| 294 | + ) |
| 295 | + } |
| 296 | + |
| 297 | + @utils.run_sub_tests_with_dataset(invalid_metadata) |
| 298 | + def test_invalid_metadata(self, test_data: DelegationsTestCase) -> None: |
| 299 | + try: |
| 300 | + self._init_repo(test_data) |
| 301 | + # The invalid role is the last visited |
| 302 | + invalid_role = test_data.visited_order[-1] |
| 303 | + self.sim.signers[invalid_role].clear() |
| 304 | + |
| 305 | + self.setup_subtest() |
| 306 | + # The invalid role metadata must not be persisted |
| 307 | + exp_files = [*TOP_LEVEL_ROLE_NAMES, *test_data.visited_order[:-1]] |
| 308 | + exp_calls = [(role, 1) for role in test_data.visited_order] |
| 309 | + |
| 310 | + updater = self._init_updater() |
| 311 | + # Call explicitly refresh to simplify the expected_calls list |
| 312 | + updater.refresh() |
| 313 | + self.sim.fetch_tracker.metadata.clear() |
| 314 | + |
| 315 | + with self.assertRaises(UnsignedMetadataError): |
| 316 | + updater.get_targetinfo("missingpath") |
| 317 | + # Check that there were no visited roles after the invalid one |
| 318 | + # and only the valid metadata files were persisted |
| 319 | + self.assertListEqual(self.sim.fetch_tracker.metadata, exp_calls) |
| 320 | + self._assert_files_exist(exp_files) |
| 321 | + finally: |
| 322 | + self.teardown_subtest() |
| 323 | + |
284 | 324 |
|
285 | 325 | class TestTargetFileSearch(TestDelegations):
|
286 | 326 | """
|
|
0 commit comments