Skip to content

Commit 699972c

Browse files
author
Ivana Atanasova
committed
Apply top-level rolenames constants in tests
This applies the use of constants of top-level rolenames in the tests instead of the previously hardcoded strings. Fixes theupdateframework#1648 Signed-off-by: Ivana Atanasova <[email protected]>
1 parent 4524ca1 commit 699972c

6 files changed

+188
-188
lines changed

tests/repository_simulator.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def targets(self) -> Targets:
143143

144144
def all_targets(self) -> Iterator[Tuple[str, Targets]]:
145145
"""Yield role name and signed portion of targets one by one."""
146-
yield "targets", self.md_targets.signed
146+
yield Targets.type, self.md_targets.signed
147147
for role, md in self.md_delegates.items():
148148
yield role, md.signed
149149

@@ -185,7 +185,7 @@ def _initialize(self):
185185
def publish_root(self):
186186
"""Sign and store a new serialized version of root."""
187187
self.md_root.signatures.clear()
188-
for signer in self.signers["root"].values():
188+
for signer in self.signers[Root.type].values():
189189
self.md_root.sign(signer, append=True)
190190

191191
self.signed_roots.append(self.md_root.to_bytes(JSONSerializer()))
@@ -201,8 +201,8 @@ def fetch(self, url: str) -> Iterator[bytes]:
201201
ver_and_name = path[len("/metadata/") :][: -len(".json")]
202202
version, _, role = ver_and_name.partition(".")
203203
# root is always version-prefixed while timestamp is always NOT
204-
if role == "root" or (
205-
self.root.consistent_snapshot and ver_and_name != "timestamp"
204+
if role == Root.type or (
205+
self.root.consistent_snapshot and ver_and_name != Timestamp.type
206206
):
207207
version = int(version)
208208
else:
@@ -253,19 +253,19 @@ def _fetch_metadata(
253253
254254
If version is None, non-versioned metadata is being requested.
255255
"""
256-
if role == "root":
256+
if role == Root.type:
257257
# return a version previously serialized in publish_root()
258258
if version is None or version > len(self.signed_roots):
259259
raise FetcherHTTPError(f"Unknown root version {version}", 404)
260260
logger.debug("fetched root version %d", version)
261261
return self.signed_roots[version - 1]
262262

263263
# sign and serialize the requested metadata
264-
if role == "timestamp":
264+
if role == Timestamp.type:
265265
md: Metadata = self.md_timestamp
266-
elif role == "snapshot":
266+
elif role == Snapshot.type:
267267
md = self.md_snapshot
268-
elif role == "targets":
268+
elif role == Targets.type:
269269
md = self.md_targets
270270
else:
271271
md = self.md_delegates.get(role)
@@ -301,7 +301,7 @@ def update_timestamp(self):
301301
self.timestamp.snapshot_meta.version = self.snapshot.version
302302

303303
if self.compute_metafile_hashes_length:
304-
hashes, length = self._compute_hashes_and_length("snapshot")
304+
hashes, length = self._compute_hashes_and_length(Snapshot.type)
305305
self.timestamp.snapshot_meta.hashes = hashes
306306
self.timestamp.snapshot_meta.length = length
307307

@@ -324,7 +324,7 @@ def update_snapshot(self):
324324

325325
def add_target(self, role: str, data: bytes, path: str):
326326
"""Create a target from data and add it to the target_files."""
327-
if role == "targets":
327+
if role == Targets.type:
328328
targets = self.targets
329329
else:
330330
targets = self.md_delegates[role].signed
@@ -343,7 +343,7 @@ def add_delegation(
343343
hash_prefixes: Optional[List[str]],
344344
):
345345
"""Add delegated target role to the repository."""
346-
if delegator_name == "targets":
346+
if delegator_name == Targets.type:
347347
delegator = self.targets
348348
else:
349349
delegator = self.md_delegates[delegator_name].signed
@@ -379,9 +379,9 @@ def write(self):
379379

380380
for ver in range(1, len(self.signed_roots) + 1):
381381
with open(os.path.join(dest_dir, f"{ver}.root.json"), "wb") as f:
382-
f.write(self._fetch_metadata("root", ver))
382+
f.write(self._fetch_metadata(Root.type, ver))
383383

384-
for role in ["timestamp", "snapshot", "targets"]:
384+
for role in [Timestamp.type, Snapshot.type, Targets.type]:
385385
with open(os.path.join(dest_dir, f"{role}.json"), "wb") as f:
386386
f.write(self._fetch_metadata(role))
387387

tests/test_api.py

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def setUpClass(cls):
7171

7272
# Load keys into memory
7373
cls.keystore = {}
74-
for role in ["delegation", "snapshot", "targets", "timestamp"]:
74+
for role in ["delegation", Snapshot.type, Targets.type, Timestamp.type]:
7575
cls.keystore[role] = import_ed25519_privatekey_from_file(
7676
os.path.join(cls.keystore_dir, role + "_key"),
7777
password="password",
@@ -85,10 +85,10 @@ def tearDownClass(cls):
8585

8686
def test_generic_read(self):
8787
for metadata, inner_metadata_cls in [
88-
("root", Root),
89-
("snapshot", Snapshot),
90-
("timestamp", Timestamp),
91-
("targets", Targets),
88+
(Root.type, Root),
89+
(Snapshot.type, Snapshot),
90+
(Timestamp.type, Timestamp),
91+
(Targets.type, Targets),
9292
]:
9393

9494
# Load JSON-formatted metdata of each supported type from file
@@ -129,7 +129,7 @@ def test_compact_json(self):
129129
)
130130

131131
def test_read_write_read_compare(self):
132-
for metadata in ["root", "snapshot", "timestamp", "targets"]:
132+
for metadata in [Root.type, Snapshot.type, Timestamp.type, Targets.type]:
133133
path = os.path.join(self.repo_dir, "metadata", metadata + ".json")
134134
md_obj = Metadata.from_file(path)
135135

@@ -141,7 +141,7 @@ def test_read_write_read_compare(self):
141141
os.remove(path_2)
142142

143143
def test_to_from_bytes(self):
144-
for metadata in ["root", "snapshot", "timestamp", "targets"]:
144+
for metadata in [Root.type, Snapshot.type, Timestamp.type, Targets.type]:
145145
path = os.path.join(self.repo_dir, "metadata", metadata + ".json")
146146
with open(path, "rb") as f:
147147
metadata_bytes = f.read()
@@ -162,11 +162,11 @@ def test_sign_verify(self):
162162
root = Metadata[Root].from_file(root_path).signed
163163

164164
# Locate the public keys we need from root
165-
targets_keyid = next(iter(root.roles["targets"].keyids))
165+
targets_keyid = next(iter(root.roles[Targets.type].keyids))
166166
targets_key = root.keys[targets_keyid]
167-
snapshot_keyid = next(iter(root.roles["snapshot"].keyids))
167+
snapshot_keyid = next(iter(root.roles[Snapshot.type].keyids))
168168
snapshot_key = root.keys[snapshot_keyid]
169-
timestamp_keyid = next(iter(root.roles["timestamp"].keyids))
169+
timestamp_keyid = next(iter(root.roles[Timestamp.type].keyids))
170170
timestamp_key = root.keys[timestamp_keyid]
171171

172172
# Load sample metadata (targets) and assert ...
@@ -185,7 +185,7 @@ def test_sign_verify(self):
185185
with self.assertRaises(exceptions.UnsignedMetadataError):
186186
targets_key.verify_signature(md_obj, JSONSerializer())
187187

188-
sslib_signer = SSlibSigner(self.keystore["snapshot"])
188+
sslib_signer = SSlibSigner(self.keystore[Snapshot.type])
189189
# Append a new signature with the unrelated key and assert that ...
190190
sig = md_obj.sign(sslib_signer, append=True)
191191
# ... there are now two signatures, and
@@ -196,7 +196,7 @@ def test_sign_verify(self):
196196
# ... the returned (appended) signature is for snapshot key
197197
self.assertEqual(sig.keyid, snapshot_keyid)
198198

199-
sslib_signer = SSlibSigner(self.keystore["timestamp"])
199+
sslib_signer = SSlibSigner(self.keystore[Timestamp.type])
200200
# Create and assign (don't append) a new signature and assert that ...
201201
md_obj.sign(sslib_signer, append=False)
202202
# ... there now is only one signature,
@@ -211,7 +211,7 @@ def test_verify_failures(self):
211211
root = Metadata[Root].from_file(root_path).signed
212212

213213
# Locate the timestamp public key we need from root
214-
timestamp_keyid = next(iter(root.roles["timestamp"].keyids))
214+
timestamp_keyid = next(iter(root.roles[Timestamp.type].keyids))
215215
timestamp_key = root.keys[timestamp_keyid]
216216

217217
# Load sample metadata (timestamp)
@@ -362,20 +362,20 @@ def test_metadata_verify_delegate(self):
362362
role2 = Metadata[Targets].from_file(role2_path)
363363

364364
# test the expected delegation tree
365-
root.verify_delegate("root", root)
366-
root.verify_delegate("snapshot", snapshot)
367-
root.verify_delegate("targets", targets)
365+
root.verify_delegate(Root.type, root)
366+
root.verify_delegate(Snapshot.type, snapshot)
367+
root.verify_delegate(Targets.type, targets)
368368
targets.verify_delegate("role1", role1)
369369
role1.verify_delegate("role2", role2)
370370

371371
# only root and targets can verify delegates
372372
with self.assertRaises(TypeError):
373-
snapshot.verify_delegate("snapshot", snapshot)
373+
snapshot.verify_delegate(Snapshot.type, snapshot)
374374
# verify fails for roles that are not delegated by delegator
375375
with self.assertRaises(ValueError):
376376
root.verify_delegate("role1", role1)
377377
with self.assertRaises(ValueError):
378-
targets.verify_delegate("targets", targets)
378+
targets.verify_delegate(Targets.type, targets)
379379
# verify fails when delegator has no delegations
380380
with self.assertRaises(ValueError):
381381
role2.verify_delegate("role1", role1)
@@ -384,31 +384,31 @@ def test_metadata_verify_delegate(self):
384384
expires = snapshot.signed.expires
385385
snapshot.signed.bump_expiration()
386386
with self.assertRaises(exceptions.UnsignedMetadataError):
387-
root.verify_delegate("snapshot", snapshot)
387+
root.verify_delegate(Snapshot.type, snapshot)
388388
snapshot.signed.expires = expires
389389

390390
# verify fails if roles keys do not sign the metadata
391391
with self.assertRaises(exceptions.UnsignedMetadataError):
392-
root.verify_delegate("timestamp", snapshot)
392+
root.verify_delegate(Timestamp.type, snapshot)
393393

394394
# Add a key to snapshot role, make sure the new sig fails to verify
395-
ts_keyid = next(iter(root.signed.roles["timestamp"].keyids))
396-
root.signed.add_key("snapshot", root.signed.keys[ts_keyid])
395+
ts_keyid = next(iter(root.signed.roles[Timestamp.type].keyids))
396+
root.signed.add_key(Snapshot.type, root.signed.keys[ts_keyid])
397397
snapshot.signatures[ts_keyid] = Signature(ts_keyid, "ff" * 64)
398398

399399
# verify succeeds if threshold is reached even if some signatures
400400
# fail to verify
401-
root.verify_delegate("snapshot", snapshot)
401+
root.verify_delegate(Snapshot.type, snapshot)
402402

403403
# verify fails if threshold of signatures is not reached
404-
root.signed.roles["snapshot"].threshold = 2
404+
root.signed.roles[Snapshot.type].threshold = 2
405405
with self.assertRaises(exceptions.UnsignedMetadataError):
406-
root.verify_delegate("snapshot", snapshot)
406+
root.verify_delegate(Snapshot.type, snapshot)
407407

408408
# verify succeeds when we correct the new signature and reach the
409409
# threshold of 2 keys
410-
snapshot.sign(SSlibSigner(self.keystore["timestamp"]), append=True)
411-
root.verify_delegate("snapshot", snapshot)
410+
snapshot.sign(SSlibSigner(self.keystore[Timestamp.type]), append=True)
411+
root.verify_delegate(Snapshot.type, snapshot)
412412

413413
def test_key_class(self):
414414
# Test if from_securesystemslib_key removes the private key from keyval
@@ -434,44 +434,44 @@ def test_root_add_key_and_remove_key(self):
434434
)
435435

436436
# Assert that root does not contain the new key
437-
self.assertNotIn(keyid, root.signed.roles["root"].keyids)
437+
self.assertNotIn(keyid, root.signed.roles[Root.type].keyids)
438438
self.assertNotIn(keyid, root.signed.keys)
439439

440440
# Add new root key
441-
root.signed.add_key("root", key_metadata)
441+
root.signed.add_key(Root.type, key_metadata)
442442

443443
# Assert that key is added
444-
self.assertIn(keyid, root.signed.roles["root"].keyids)
444+
self.assertIn(keyid, root.signed.roles[Root.type].keyids)
445445
self.assertIn(keyid, root.signed.keys)
446446

447447
# Confirm that the newly added key does not break
448448
# the object serialization
449449
root.to_dict()
450450

451451
# Try adding the same key again and assert its ignored.
452-
pre_add_keyid = root.signed.roles["root"].keyids.copy()
453-
root.signed.add_key("root", key_metadata)
454-
self.assertEqual(pre_add_keyid, root.signed.roles["root"].keyids)
452+
pre_add_keyid = root.signed.roles[Root.type].keyids.copy()
453+
root.signed.add_key(Root.type, key_metadata)
454+
self.assertEqual(pre_add_keyid, root.signed.roles[Root.type].keyids)
455455

456456
# Add the same key to targets role as well
457-
root.signed.add_key("targets", key_metadata)
457+
root.signed.add_key(Targets.type, key_metadata)
458458

459459
# Add the same key to a nonexistent role.
460460
with self.assertRaises(ValueError):
461461
root.signed.add_key("nosuchrole", key_metadata)
462462

463463
# Remove the key from root role (targets role still uses it)
464-
root.signed.remove_key("root", keyid)
465-
self.assertNotIn(keyid, root.signed.roles["root"].keyids)
464+
root.signed.remove_key(Root.type, keyid)
465+
self.assertNotIn(keyid, root.signed.roles[Root.type].keyids)
466466
self.assertIn(keyid, root.signed.keys)
467467

468468
# Remove the key from targets as well
469-
root.signed.remove_key("targets", keyid)
470-
self.assertNotIn(keyid, root.signed.roles["targets"].keyids)
469+
root.signed.remove_key(Targets.type, keyid)
470+
self.assertNotIn(keyid, root.signed.roles[Targets.type].keyids)
471471
self.assertNotIn(keyid, root.signed.keys)
472472

473473
with self.assertRaises(ValueError):
474-
root.signed.remove_key("root", "nosuchkey")
474+
root.signed.remove_key(Root.type, "nosuchkey")
475475
with self.assertRaises(ValueError):
476476
root.signed.remove_key("nosuchrole", keyid)
477477

@@ -662,7 +662,7 @@ def test_length_and_hash_validation(self):
662662
targets_path = os.path.join(self.repo_dir, "metadata", "targets.json")
663663
targets = Metadata[Targets].from_file(targets_path)
664664
file1_targetfile = targets.signed.targets["file1.txt"]
665-
filepath = os.path.join(self.repo_dir, "targets", "file1.txt")
665+
filepath = os.path.join(self.repo_dir, Targets.type, "file1.txt")
666666

667667
with open(filepath, "rb") as file1:
668668
file1_targetfile.verify_length_and_hashes(file1)
@@ -680,7 +680,7 @@ def test_length_and_hash_validation(self):
680680

681681
def test_targetfile_from_file(self):
682682
# Test with an existing file and valid hash algorithm
683-
file_path = os.path.join(self.repo_dir, "targets", "file1.txt")
683+
file_path = os.path.join(self.repo_dir, Targets.type, "file1.txt")
684684
targetfile_from_file = TargetFile.from_file(
685685
file_path, file_path, ["sha256"]
686686
)
@@ -689,20 +689,20 @@ def test_targetfile_from_file(self):
689689
targetfile_from_file.verify_length_and_hashes(file)
690690

691691
# Test with a non-existing file
692-
file_path = os.path.join(self.repo_dir, "targets", "file123.txt")
692+
file_path = os.path.join(self.repo_dir, Targets.type, "file123.txt")
693693
with self.assertRaises(FileNotFoundError):
694694
TargetFile.from_file(
695695
file_path, file_path, [sslib_hash.DEFAULT_HASH_ALGORITHM]
696696
)
697697

698698
# Test with an unsupported algorithm
699-
file_path = os.path.join(self.repo_dir, "targets", "file1.txt")
699+
file_path = os.path.join(self.repo_dir, Targets.type, "file1.txt")
700700
with self.assertRaises(exceptions.UnsupportedAlgorithmError):
701701
TargetFile.from_file(file_path, file_path, ["123"])
702702

703703
def test_targetfile_from_data(self):
704704
data = b"Inline test content"
705-
target_file_path = os.path.join(self.repo_dir, "targets", "file1.txt")
705+
target_file_path = os.path.join(self.repo_dir, Targets.type, "file1.txt")
706706

707707
# Test with a valid hash algorithm
708708
targetfile_from_data = TargetFile.from_data(

0 commit comments

Comments
 (0)