@@ -132,19 +132,20 @@ def test_update_with_invalid_json(self):
132
132
133
133
update_func (metadata )
134
134
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 ):
137
137
delegated_role = Metadata .from_bytes (self .metadata ["role1" ])
138
138
timestamp = Metadata .from_bytes (self .metadata ["timestamp" ])
139
139
with self .assertRaises (ValueError ):
140
140
verify_with_threshold (timestamp , "role1" , delegated_role )
141
141
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" ])
143
144
targets = Metadata .from_bytes (self .metadata ["targets" ])
144
145
with self .assertRaises (ValueError ):
145
146
verify_with_threshold (targets , "foo" , delegated_role )
146
147
147
- def test_invalid_update_root (self ):
148
+ def test_update_root_invalid_type (self ):
148
149
# new_root data with invalid snapshot type
149
150
invalid_type_data = json .loads (self .metadata ["root" ])
150
151
invalid_type_data ["signed" ]["_type" ] = "snapshot"
@@ -155,6 +156,7 @@ def test_invalid_update_root(self):
155
156
with self .assertRaises (exceptions .RepositoryError ):
156
157
self .trusted_set .update_root (invalid_type_data )
157
158
159
+ def test_update_root_new_root_cannot_be_verified_with_threshold (self ):
158
160
# new_root data with threshold which cannot be verified.
159
161
modified_threshold_data = copy .deepcopy (
160
162
json .loads (self .metadata ["root" ])
@@ -164,10 +166,11 @@ def test_invalid_update_root(self):
164
166
with self .assertRaises (exceptions .UnsignedMetadataError ):
165
167
self .trusted_set .update_root (modified_threshold_data )
166
168
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 ):
168
170
with self .assertRaises (exceptions .ReplayedMetadataError ):
169
171
self .trusted_set .update_root (self .metadata ["root" ])
170
172
173
+ def test_update_root_after_successful_root_update (self ):
171
174
# if _root_update_finished, then fail when calling update_root
172
175
self .trusted_set .root_update_finished ()
173
176
with self .assertRaises (RuntimeError ):
@@ -193,21 +196,27 @@ def _sign_modified_obj(
193
196
signature = metadata_obj .sign (sslib_signer )
194
197
return signature .to_dict ()
195
198
196
- def test_update_timestamp (self ):
199
+
200
+ def _setup_update_snapshot_or_timestamp_test (self ):
197
201
self .trusted_set .root_update_finished ()
198
202
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 ()
199
206
# new_timestamp.version < trusted_timestamp.version
200
207
self .trusted_set .timestamp .signed .version = 2
201
208
with self .assertRaises (exceptions .ReplayedMetadataError ):
202
209
self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
203
- self .trusted_set .timestamp .signed .version = 1
204
210
211
+ def test_update_timestamp_snapshot_ver_below_trusted_snapshot_ver (self ):
212
+ self ._setup_update_snapshot_or_timestamp_test ()
205
213
# new_timestamp.snapshot.version < trusted_timestamp.snapshot.version
206
214
self .trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 2
207
215
with self .assertRaises (exceptions .ReplayedMetadataError ):
208
216
self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
209
- self .trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 1
210
217
218
+ def test_update_timestamp_snapshot_ver_below_trusted_snapshot_ver (self ):
219
+ self ._setup_update_snapshot_or_timestamp_test ()
211
220
# new_timestamp has expired
212
221
timestamp = Metadata .from_bytes (self .metadata ["timestamp" ])
213
222
timestamp .signed .expires = datetime .strptime (
@@ -218,6 +227,7 @@ def test_update_timestamp(self):
218
227
with self .assertRaises (exceptions .ExpiredMetadataError ):
219
228
self .trusted_set .update_timestamp (new_timestamp_byte_data )
220
229
230
+
221
231
def _calculate_modified_hashes (
222
232
self , true_hashes ,
223
233
data : bytes
@@ -231,9 +241,8 @@ def _calculate_modified_hashes(
231
241
modified_hashes [algo ] = observed_hash
232
242
return modified_hashes
233
243
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 ()
237
246
# new_snapshot data with invalid targets type
238
247
invalid_type_data = json .loads (self .metadata ["snapshot" ])
239
248
invalid_type_data ["signed" ]["_type" ] = "targets"
@@ -248,14 +257,17 @@ def test_update_snapshot(self):
248
257
249
258
with self .assertRaises (exceptions .RepositoryError ):
250
259
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 ()
252
263
# cannot update snapshot after targets update completes or targets != None
253
264
targets_obj = Metadata .from_bytes (self .metadata ["targets" ])
254
265
self .trusted_set ._trusted_set ["targets" ] = targets_obj
255
266
with self .assertRaises (RuntimeError ):
256
267
self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
257
- del self .trusted_set ._trusted_set ["targets" ]
258
268
269
+ def test_update_snapshot_with_invalid_json (self ):
270
+ self ._setup_update_snapshot_or_timestamp_test ()
259
271
# Deserialization error - failed to decode the new_snapshot JSON.
260
272
timestamp_meta = self .trusted_set .timestamp .signed .meta ["snapshot.json" ]
261
273
true_hashes = timestamp_meta .hashes or {}
@@ -268,24 +280,29 @@ def test_update_snapshot(self):
268
280
self .trusted_set .update_snapshot (b'{""sig": }' )
269
281
self .trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
270
282
283
+ def test_update_snapshot_cannot_verify_snapshot_with_threshold (self ):
284
+ self ._setup_update_snapshot_or_timestamp_test ()
271
285
# root data with threshold which cannot be verified for new_snapshot
272
286
self .trusted_set .root .signed .roles ["snapshot" ].threshold = 2
273
287
with self .assertRaises (exceptions .UnsignedMetadataError ):
274
288
self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
275
289
self .trusted_set .root .signed .roles ["snapshot" ].threshold = 1
276
290
291
+ def test_update_snapshot_version_different_timestamp_snapshot_version (self ):
292
+ self ._setup_update_snapshot_or_timestamp_test ()
277
293
# new_snapshot.version != trusted timestamp.meta["snapshot"].version
278
294
self .trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 2
279
295
with self .assertRaises (exceptions .BadVersionNumberError ):
280
296
self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
281
297
self .trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 1
282
298
283
299
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 ()
287
302
self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
288
303
304
+ def test_update_snapshot_after_successful_update_new_snapshot_no_meta (self ):
305
+ self ._setup_update_snapshot_after_successful_update_test ()
289
306
# Test removing a meta_file in new_snapshot compared to the old snapshot
290
307
snapshot_obj = Metadata .from_bytes (self .metadata ["snapshot" ])
291
308
snapshot_obj .signed .meta = {}
@@ -301,63 +318,69 @@ def test_update_snapshot_after_succesfull_update(self):
301
318
302
319
with self .assertRaises (exceptions .RepositoryError ):
303
320
self .trusted_set .update_snapshot (modified_snapshot_data )
304
- self .trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
305
321
322
+ def test_update_snapshot_after_succesfull_update_new_snapshot_meta_version_different (self ):
323
+ self ._setup_update_snapshot_after_successful_update_test ()
306
324
# snapshot.meta["project1"].version != new_snapshot.meta["project1"].version
307
325
for meta_file_path in self .trusted_set .snapshot .signed .meta .keys ():
308
326
self .trusted_set .snapshot .signed .meta [meta_file_path ].version = 2
309
327
with self .assertRaises (exceptions .BadVersionNumberError ):
310
328
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
313
329
330
+ def test_update_snapshot_after_succesfull_expired_new_snapshot (self ):
331
+ self ._setup_update_snapshot_after_successful_update_test ()
314
332
# new_snapshot has expired
315
333
snapshot_obj = Metadata .from_bytes (self .metadata ["snapshot" ])
316
334
snapshot_obj .signed .expires = datetime .strptime (
317
335
"1970-01-01T00:00:00Z" , "%Y-%m-%dT%H:%M:%SZ"
318
336
)
319
337
self ._sign_modified_obj ("snapshot" , snapshot_obj )
320
338
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 {}
321
341
modified_hashes = self ._calculate_modified_hashes (
322
342
true_hashes , modified_snapshot_data
323
343
)
324
344
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
325
347
with self .assertRaises (exceptions .ExpiredMetadataError ):
326
348
self .trusted_set .update_snapshot (modified_snapshot_data )
327
- self .trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
328
349
329
- def test_update_targets (self ):
350
+
351
+ def setup_update_targets_test (self ):
330
352
self .trusted_set .root_update_finished ()
331
353
self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
332
354
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 ()
334
358
# remove meta information with information about targets from snapshot
335
359
self .trusted_set .snapshot .signed .meta = {}
336
360
with self .assertRaises (exceptions .RepositoryError ):
337
361
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
340
362
363
+ def test_update_targets_hash_different_than_snapshot_meta_hash (self ):
364
+ self .setup_update_targets_test ()
341
365
# observed_hash != stored hash in snapshot meta for targets
342
366
true_hashes = {}
343
367
for target_path , meta_file in self .trusted_set .snapshot .signed .meta .items ():
344
368
true_hashes [target_path ] = meta_file .hashes
345
369
self .trusted_set .snapshot .signed .meta [target_path ].hashes = {"sha256" : "b" }
346
- with self .assertRaises (exceptions .BadHashError ):
370
+ with self .assertRaises (exceptions .RepositoryError ):
347
371
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 ]
352
372
373
+ def test_update_targets_version_different_snapshot_meta_version (self ):
374
+ self .setup_update_targets_test ()
353
375
# new_delegate.signed.version != meta.version stored in snapshot
354
376
for target_path in self .trusted_set .snapshot .signed .meta .keys ():
355
377
self .trusted_set .snapshot .signed .meta [target_path ].version = 2
356
378
with self .assertRaises (exceptions .BadVersionNumberError ):
357
379
self .trusted_set .update_targets (self .metadata ["targets" ])
358
- self .trusted_set .snapshot .signed .meta [target_path ].version = 1
359
380
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
361
384
targets_obj = Metadata .from_bytes (self .metadata ["targets" ])
362
385
targets_obj .signed .expires = datetime .strptime (
363
386
"1970-01-01T00:00:00Z" , "%Y-%m-%dT%H:%M:%SZ"
0 commit comments