Skip to content

Commit d499d2e

Browse files
committed
TrustedMetadataSet: test cases into test functions
Split big test functions into smaller test functions and add helper setup methods. This will allow us when we have a unit test failure to easier and faster understand what's wrong. Signed-off-by: Martin Vrachev <[email protected]>
1 parent 63b9862 commit d499d2e

File tree

1 file changed

+54
-31
lines changed

1 file changed

+54
-31
lines changed

tests/test_trusted_metadata_set.py

Lines changed: 54 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,20 @@ def test_update_with_invalid_json(self):
132132

133133
update_func(metadata)
134134

135-
def test_verify_with_threshold(self):
136-
# Call verify_with_threshold with non root or targets delegator.
135+
136+
def test_verify_with_threshold_wrong_delegator(self):
137137
delegated_role = Metadata.from_bytes(self.metadata["role1"])
138138
timestamp = Metadata.from_bytes(self.metadata["timestamp"])
139139
with self.assertRaises(ValueError):
140140
verify_with_threshold(timestamp, "role1", delegated_role)
141141

142-
# Call verify_with_threshold with non existent role_name.
142+
def test_verify_with_threshold_non_existent_role_name(self):
143+
delegated_role = Metadata.from_bytes(self.metadata["role1"])
143144
targets = Metadata.from_bytes(self.metadata["targets"])
144145
with self.assertRaises(ValueError):
145146
verify_with_threshold(targets, "foo", delegated_role)
146147

147-
def test_invalid_update_root(self):
148+
def test_update_root_invalid_type(self):
148149
# new_root data with invalid snapshot type
149150
invalid_type_data = json.loads(self.metadata["root"])
150151
invalid_type_data["signed"]["_type"] = "snapshot"
@@ -155,6 +156,7 @@ def test_invalid_update_root(self):
155156
with self.assertRaises(exceptions.RepositoryError):
156157
self.trusted_set.update_root(invalid_type_data)
157158

159+
def test_update_root_new_root_cannot_be_verified_with_threshold(self):
158160
# new_root data with threshold which cannot be verified.
159161
modified_threshold_data = copy.deepcopy(
160162
json.loads(self.metadata["root"])
@@ -164,10 +166,11 @@ def test_invalid_update_root(self):
164166
with self.assertRaises(exceptions.UnsignedMetadataError):
165167
self.trusted_set.update_root(modified_threshold_data)
166168

167-
# new_root.signed.version has the same version as old root
169+
def test_update_root_new_root_ver_same_as_trusted_root_ver(self):
168170
with self.assertRaises(exceptions.ReplayedMetadataError):
169171
self.trusted_set.update_root(self.metadata["root"])
170172

173+
def test_update_root_after_successful_root_update(self):
171174
# if _root_update_finished, then fail when calling update_root
172175
self.trusted_set.root_update_finished()
173176
with self.assertRaises(RuntimeError):
@@ -193,21 +196,27 @@ def _sign_modified_obj(
193196
signature = metadata_obj.sign(sslib_signer)
194197
return signature.to_dict()
195198

196-
def test_update_timestamp(self):
199+
200+
def _setup_update_snapshot_or_timestamp_test(self):
197201
self.trusted_set.root_update_finished()
198202
self.trusted_set.update_timestamp(self.metadata["timestamp"])
203+
204+
def test_update_timestamp_new_timestamp_ver_below_trusted_ver(self):
205+
self._setup_update_snapshot_or_timestamp_test()
199206
# new_timestamp.version < trusted_timestamp.version
200207
self.trusted_set.timestamp.signed.version = 2
201208
with self.assertRaises(exceptions.ReplayedMetadataError):
202209
self.trusted_set.update_timestamp(self.metadata["timestamp"])
203-
self.trusted_set.timestamp.signed.version = 1
204210

211+
def test_update_timestamp_snapshot_ver_below_trusted_snapshot_ver(self):
212+
self._setup_update_snapshot_or_timestamp_test()
205213
# new_timestamp.snapshot.version < trusted_timestamp.snapshot.version
206214
self.trusted_set.timestamp.signed.meta["snapshot.json"].version = 2
207215
with self.assertRaises(exceptions.ReplayedMetadataError):
208216
self.trusted_set.update_timestamp(self.metadata["timestamp"])
209-
self.trusted_set.timestamp.signed.meta["snapshot.json"].version = 1
210217

218+
def test_update_timestamp_snapshot_ver_below_trusted_snapshot_ver(self):
219+
self._setup_update_snapshot_or_timestamp_test()
211220
# new_timestamp has expired
212221
timestamp = Metadata.from_bytes(self.metadata["timestamp"])
213222
timestamp.signed.expires = datetime.strptime(
@@ -218,6 +227,7 @@ def test_update_timestamp(self):
218227
with self.assertRaises(exceptions.ExpiredMetadataError):
219228
self.trusted_set.update_timestamp(new_timestamp_byte_data)
220229

230+
221231
def _calculate_modified_hashes(
222232
self, true_hashes,
223233
data: bytes
@@ -231,9 +241,8 @@ def _calculate_modified_hashes(
231241
modified_hashes[algo] = observed_hash
232242
return modified_hashes
233243

234-
def test_update_snapshot(self):
235-
self.trusted_set.root_update_finished()
236-
self.trusted_set.update_timestamp(self.metadata["timestamp"])
244+
def test_update_snapshot_new_snapshot_invalid_type(self):
245+
self._setup_update_snapshot_or_timestamp_test()
237246
# new_snapshot data with invalid targets type
238247
invalid_type_data = json.loads(self.metadata["snapshot"])
239248
invalid_type_data["signed"]["_type"] = "targets"
@@ -248,14 +257,17 @@ def test_update_snapshot(self):
248257

249258
with self.assertRaises(exceptions.RepositoryError):
250259
self.trusted_set.update_snapshot(invalid_type_data)
251-
self.trusted_set.timestamp.signed.meta["snapshot.json"].hashes = true_hashes
260+
261+
def test_update_snapshot_after_targets_updated(self):
262+
self._setup_update_snapshot_or_timestamp_test()
252263
# cannot update snapshot after targets update completes or targets != None
253264
targets_obj = Metadata.from_bytes(self.metadata["targets"])
254265
self.trusted_set._trusted_set["targets"] = targets_obj
255266
with self.assertRaises(RuntimeError):
256267
self.trusted_set.update_snapshot(self.metadata["snapshot"])
257-
del self.trusted_set._trusted_set["targets"]
258268

269+
def test_update_snapshot_with_invalid_json(self):
270+
self._setup_update_snapshot_or_timestamp_test()
259271
# Deserialization error - failed to decode the new_snapshot JSON.
260272
timestamp_meta = self.trusted_set.timestamp.signed.meta["snapshot.json"]
261273
true_hashes = timestamp_meta.hashes or {}
@@ -268,24 +280,29 @@ def test_update_snapshot(self):
268280
self.trusted_set.update_snapshot(b'{""sig": }')
269281
self.trusted_set.timestamp.signed.meta["snapshot.json"].hashes = true_hashes
270282

283+
def test_update_snapshot_cannot_verify_snapshot_with_threshold(self):
284+
self._setup_update_snapshot_or_timestamp_test()
271285
# root data with threshold which cannot be verified for new_snapshot
272286
self.trusted_set.root.signed.roles["snapshot"].threshold = 2
273287
with self.assertRaises(exceptions.UnsignedMetadataError):
274288
self.trusted_set.update_snapshot(self.metadata["snapshot"])
275289
self.trusted_set.root.signed.roles["snapshot"].threshold = 1
276290

291+
def test_update_snapshot_version_different_timestamp_snapshot_version(self):
292+
self._setup_update_snapshot_or_timestamp_test()
277293
# new_snapshot.version != trusted timestamp.meta["snapshot"].version
278294
self.trusted_set.timestamp.signed.meta["snapshot.json"].version = 2
279295
with self.assertRaises(exceptions.BadVersionNumberError):
280296
self.trusted_set.update_snapshot(self.metadata["snapshot"])
281297
self.trusted_set.timestamp.signed.meta["snapshot.json"].version = 1
282298

283299

284-
def test_update_snapshot_after_succesfull_update(self):
285-
self.trusted_set.root_update_finished()
286-
self.trusted_set.update_timestamp(self.metadata["timestamp"])
300+
def _setup_update_snapshot_after_successful_update_test(self):
301+
self._setup_update_snapshot_or_timestamp_test()
287302
self.trusted_set.update_snapshot(self.metadata["snapshot"])
288303

304+
def test_update_snapshot_after_successful_update_new_snapshot_no_meta(self):
305+
self._setup_update_snapshot_after_successful_update_test()
289306
# Test removing a meta_file in new_snapshot compared to the old snapshot
290307
snapshot_obj = Metadata.from_bytes(self.metadata["snapshot"])
291308
snapshot_obj.signed.meta = {}
@@ -301,63 +318,69 @@ def test_update_snapshot_after_succesfull_update(self):
301318

302319
with self.assertRaises(exceptions.RepositoryError):
303320
self.trusted_set.update_snapshot(modified_snapshot_data)
304-
self.trusted_set.timestamp.signed.meta["snapshot.json"].hashes = true_hashes
305321

322+
def test_update_snapshot_after_succesfull_update_new_snapshot_meta_version_different(self):
323+
self._setup_update_snapshot_after_successful_update_test()
306324
# snapshot.meta["project1"].version != new_snapshot.meta["project1"].version
307325
for meta_file_path in self.trusted_set.snapshot.signed.meta.keys():
308326
self.trusted_set.snapshot.signed.meta[meta_file_path].version = 2
309327
with self.assertRaises(exceptions.BadVersionNumberError):
310328
self.trusted_set.update_snapshot(self.metadata["snapshot"])
311-
for meta_file_path in self.trusted_set.snapshot.signed.meta.keys():
312-
self.trusted_set.snapshot.signed.meta[meta_file_path].version = 1
313329

330+
def test_update_snapshot_after_succesfull_expired_new_snapshot(self):
331+
self._setup_update_snapshot_after_successful_update_test()
314332
# new_snapshot has expired
315333
snapshot_obj = Metadata.from_bytes(self.metadata["snapshot"])
316334
snapshot_obj.signed.expires = datetime.strptime(
317335
"1970-01-01T00:00:00Z", "%Y-%m-%dT%H:%M:%SZ"
318336
)
319337
self._sign_modified_obj("snapshot", snapshot_obj)
320338
modified_snapshot_data = json.dumps(snapshot_obj.to_dict()).encode()
339+
timestamp_meta = self.trusted_set.timestamp.signed.meta["snapshot.json"]
340+
true_hashes = timestamp_meta.hashes or {}
321341
modified_hashes = self._calculate_modified_hashes(
322342
true_hashes, modified_snapshot_data
323343
)
324344
self.trusted_set.timestamp.signed.meta["snapshot.json"].hashes = modified_hashes
345+
# remove length so it doesn't intervene the validation.
346+
self.trusted_set.timestamp.signed.meta["snapshot.json"].length = None
325347
with self.assertRaises(exceptions.ExpiredMetadataError):
326348
self.trusted_set.update_snapshot(modified_snapshot_data)
327-
self.trusted_set.timestamp.signed.meta["snapshot.json"].hashes = true_hashes
328349

329-
def test_update_targets(self):
350+
351+
def setup_update_targets_test(self):
330352
self.trusted_set.root_update_finished()
331353
self.trusted_set.update_timestamp(self.metadata["timestamp"])
332354
self.trusted_set.update_snapshot(self.metadata["snapshot"])
333-
355+
356+
def test_update_targets_no_meta_in_snapshot(self):
357+
self.setup_update_targets_test()
334358
# remove meta information with information about targets from snapshot
335359
self.trusted_set.snapshot.signed.meta = {}
336360
with self.assertRaises(exceptions.RepositoryError):
337361
self.trusted_set.update_targets(self.metadata["targets"])
338-
snapshot = Metadata.from_bytes(self.metadata["snapshot"])
339-
self.trusted_set.snapshot.signed.meta = snapshot.signed.meta
340362

363+
def test_update_targets_hash_different_than_snapshot_meta_hash(self):
364+
self.setup_update_targets_test()
341365
# observed_hash != stored hash in snapshot meta for targets
342366
true_hashes = {}
343367
for target_path, meta_file in self.trusted_set.snapshot.signed.meta.items():
344368
true_hashes[target_path] = meta_file.hashes
345369
self.trusted_set.snapshot.signed.meta[target_path].hashes = {"sha256": "b"}
346-
with self.assertRaises(exceptions.BadHashError):
370+
with self.assertRaises(exceptions.RepositoryError):
347371
self.trusted_set.update_targets(self.metadata["targets"])
348-
# Return to the original hash values
349-
for target_path in true_hashes.keys():
350-
self.trusted_set.snapshot.signed.meta[target_path].hashes = \
351-
true_hashes[target_path]
352372

373+
def test_update_targets_version_different_snapshot_meta_version(self):
374+
self.setup_update_targets_test()
353375
# new_delegate.signed.version != meta.version stored in snapshot
354376
for target_path in self.trusted_set.snapshot.signed.meta.keys():
355377
self.trusted_set.snapshot.signed.meta[target_path].version = 2
356378
with self.assertRaises(exceptions.BadVersionNumberError):
357379
self.trusted_set.update_targets(self.metadata["targets"])
358-
self.trusted_set.snapshot.signed.meta[target_path].version = 1
359380

360-
# new_delegate has expired
381+
def test_update_targets_expired_new_target(self):
382+
self.setup_update_targets_test()
383+
# new_delegated_target has expired
361384
targets_obj = Metadata.from_bytes(self.metadata["targets"])
362385
targets_obj.signed.expires = datetime.strptime(
363386
"1970-01-01T00:00:00Z", "%Y-%m-%dT%H:%M:%SZ"

0 commit comments

Comments
 (0)