@@ -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