|
22 | 22 | DelegatedRole,
|
23 | 23 | Targets,
|
24 | 24 | )
|
| 25 | +from tuf.exceptions import UnsignedMetadataError |
25 | 26 | from tuf.ngclient import Updater
|
26 | 27 |
|
27 | 28 |
|
@@ -287,6 +288,47 @@ def test_graph_traversal(self, test_data: DelegationsTestCase) -> None:
|
287 | 288 | finally:
|
288 | 289 | self.teardown_subtest()
|
289 | 290 |
|
| 291 | + invalid_metadata: utils.DataSet = { |
| 292 | + "unsigned delegated role": DelegationsTestCase( |
| 293 | + delegations=[ |
| 294 | + TestDelegation("targets", "A"), |
| 295 | + TestDelegation("targets", "B"), |
| 296 | + TestDelegation("A", "C"), |
| 297 | + ], |
| 298 | + # The traversal stops after visiting an invalid role |
| 299 | + visited_order=["A"], |
| 300 | + ) |
| 301 | + } |
| 302 | + |
| 303 | + @utils.run_sub_tests_with_dataset(invalid_metadata) |
| 304 | + def test_invalid_metadata(self, test_data: DelegationsTestCase) -> None: |
| 305 | + try: |
| 306 | + self._init_repo(test_data) |
| 307 | + # The invalid role is the last visited |
| 308 | + invalid_role = test_data.visited_order[-1] |
| 309 | + self.sim.signers[invalid_role].clear() |
| 310 | + |
| 311 | + self.setup_subtest() |
| 312 | + # The invalid role metadata must not be persisted |
| 313 | + exp_files = [*TOP_LEVEL_ROLE_NAMES, *test_data.visited_order[:-1]] |
| 314 | + exp_calls = [call(role, 1) for role in test_data.visited_order] |
| 315 | + |
| 316 | + updater = self._init_updater() |
| 317 | + # Call explicitly refresh to simplify the expected_calls list |
| 318 | + updater.refresh() |
| 319 | + |
| 320 | + with patch.object( |
| 321 | + self.sim, "_fetch_metadata", wraps=self.sim._fetch_metadata |
| 322 | + ) as wrapped_fetch: |
| 323 | + |
| 324 | + with self.assertRaises(UnsignedMetadataError): |
| 325 | + updater.get_targetinfo("missingpath") |
| 326 | + |
| 327 | + self.assertListEqual(wrapped_fetch.call_args_list, exp_calls) |
| 328 | + self._assert_files_exist(exp_files) |
| 329 | + finally: |
| 330 | + self.teardown_subtest() |
| 331 | + |
290 | 332 |
|
291 | 333 | class TestTargetFileSearch(TestDelegations):
|
292 | 334 | """
|
|
0 commit comments