From c77b47ee82ddc2cafbb43b7e681740d3d40028ec Mon Sep 17 00:00:00 2001 From: Teodora Sechkova Date: Mon, 22 Nov 2021 16:28:43 +0200 Subject: [PATCH] Modify RepositorySimulator.add_delegation Reduce the number of function arguments and use DelegatedRole instead. When adding a list of delegations to the repository, move the Targets creation inside the loop to create a separate Targets object for each delegation. Create a new Metadata obgect only for delegated roles which do not exist yet in the repository. Signed-off-by: Teodora Sechkova --- tests/repository_simulator.py | 12 +++--------- tests/test_updater_consistent_snapshot.py | 6 ++++-- tests/test_updater_with_simulator.py | 14 +++++++------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/tests/repository_simulator.py b/tests/repository_simulator.py index 6377fe0a..948ee37d 100644 --- a/tests/repository_simulator.py +++ b/tests/repository_simulator.py @@ -345,13 +345,7 @@ def add_target(self, role: str, data: bytes, path: str) -> None: self.target_files[path] = RepositoryTarget(data, target) def add_delegation( - self, - delegator_name: str, - name: str, - targets: Targets, - terminating: bool, - paths: Optional[List[str]], - hash_prefixes: Optional[List[str]], + self, delegator_name: str, role: DelegatedRole, targets: Targets ) -> None: """Add delegated target role to the repository.""" if delegator_name == Targets.type: @@ -360,7 +354,6 @@ def add_delegation( delegator = self.md_delegates[delegator_name].signed # Create delegation - role = DelegatedRole(name, [], 1, terminating, paths, hash_prefixes) if delegator.delegations is None: delegator.delegations = Delegations({}, OrderedDict()) # put delegation last by default @@ -372,7 +365,8 @@ def add_delegation( self.add_signer(role.name, signer) # Add metadata for the role - self.md_delegates[role.name] = Metadata(targets, OrderedDict()) + if role.name not in self.md_delegates: + self.md_delegates[role.name] = Metadata(targets, OrderedDict()) def write(self) -> None: """Dump current repository metadata to self.dump_dir diff --git a/tests/test_updater_consistent_snapshot.py b/tests/test_updater_consistent_snapshot.py index 532769db..4ca37f36 100644 --- a/tests/test_updater_consistent_snapshot.py +++ b/tests/test_updater_consistent_snapshot.py @@ -16,6 +16,7 @@ from tuf.api.metadata import ( SPECIFICATION_VERSION, TOP_LEVEL_ROLE_NAMES, + DelegatedRole, TargetFile, Targets, ) @@ -145,9 +146,10 @@ def test_delegated_roles_update( sim = self._init_repo(consistent_snapshot) # Add new delegated targets spec_version = ".".join(SPECIFICATION_VERSION) - targets = Targets(1, spec_version, sim.safe_expiry, {}, None) for role in rolenames: - sim.add_delegation("targets", role, targets, False, ["*"], None) + delegated_role = DelegatedRole(role, [], 1, False, ["*"], None) + targets = Targets(1, spec_version, sim.safe_expiry, {}, None) + sim.add_delegation("targets", delegated_role, targets) sim.update_snapshot() updater = self._init_updater(sim) updater.refresh() diff --git a/tests/test_updater_with_simulator.py b/tests/test_updater_with_simulator.py index ee9e257a..8a3d6593 100644 --- a/tests/test_updater_with_simulator.py +++ b/tests/test_updater_with_simulator.py @@ -16,7 +16,7 @@ from tests import utils from tests.repository_simulator import RepositorySimulator -from tuf.api.metadata import SPECIFICATION_VERSION, Targets +from tuf.api.metadata import SPECIFICATION_VERSION, DelegatedRole, Targets from tuf.exceptions import BadVersionNumberError, UnsignedMetadataError from tuf.ngclient import Updater @@ -143,11 +143,10 @@ def test_fishy_rolenames(self) -> None: # Add new delegated targets, update the snapshot spec_version = ".".join(SPECIFICATION_VERSION) - targets = Targets(1, spec_version, self.sim.safe_expiry, {}, None) - for role in roles_to_filenames: - self.sim.add_delegation( - "targets", role, targets, False, ["*"], None - ) + for rolename in roles_to_filenames: + role = DelegatedRole(rolename, [], 1, False, ["*"], None) + targets = Targets(1, spec_version, self.sim.safe_expiry, {}, None) + self.sim.add_delegation("targets", role, targets) self.sim.update_snapshot() updater = self._run_refresh() @@ -236,7 +235,8 @@ def test_not_loading_targets_twice(self, wrapped_open: MagicMock) -> None: # Add new delegated targets, update the snapshot spec_version = ".".join(SPECIFICATION_VERSION) targets = Targets(1, spec_version, self.sim.safe_expiry, {}, None) - self.sim.add_delegation("targets", "role1", targets, False, ["*"], None) + role = DelegatedRole("role1", [], 1, False, ["*"], None) + self.sim.add_delegation("targets", role, targets) self.sim.update_snapshot() # Run refresh, top-level roles are loaded