@@ -300,33 +300,34 @@ def timestamp_version_modifier(timestamp: Timestamp) -> None:
300300
301301 timestamp = self .modify_metadata ("timestamp" , timestamp_version_modifier )
302302 self ._root_updated_and_update_timestamp (timestamp )
303- # new_snapshot.version != trusted timestamp.meta["snapshot"].version
304- def snapshot_version_modifier (snapshot : Snapshot ) -> None :
305- snapshot .version = 3
306303
307- snapshot = self .modify_metadata ("snapshot" , snapshot_version_modifier )
304+ #intermediate snapshot is allowed to not match meta version
305+ self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
306+
307+ # final snapshot must match meta version
308308 with self .assertRaises (exceptions .BadVersionNumberError ):
309- self .trusted_set .update_snapshot (snapshot )
309+ self .trusted_set .update_targets (self .metadata ["targets" ])
310+
310311
311- def test_update_snapshot_after_successful_update_new_snapshot_no_meta (self ):
312+ def test_update_snapshot_file_removed_from_meta (self ):
312313 self ._update_all_besides_targets (self .metadata ["timestamp" ])
313- # Test removing a meta_file in new_snapshot compared to the old snapshot
314- def no_meta_modifier (snapshot : Snapshot ) -> None :
315- snapshot .meta = {}
314+ def remove_file_from_meta (snapshot : Snapshot ) -> None :
315+ del snapshot .meta ["targets.json" ]
316316
317- snapshot = self .modify_metadata ("snapshot" , no_meta_modifier )
317+ # Test removing a meta_file in new_snapshot compared to the old snapshot
318+ snapshot = self .modify_metadata ("snapshot" , remove_file_from_meta )
318319 with self .assertRaises (exceptions .RepositoryError ):
319320 self .trusted_set .update_snapshot (snapshot )
320321
321- def test_update_snapshot_after_succesfull_update_new_snapshot_meta_version_different (self ):
322+ def test_update_snapshot_meta_version_decreases (self ):
322323 self ._root_updated_and_update_timestamp (self .metadata ["timestamp" ])
323- # snapshot.meta["project1"].version != new_snapshot.meta["project1"].version
324+
324325 def version_meta_modifier (snapshot : Snapshot ) -> None :
325- for metafile_path in snapshot .meta .keys ():
326- snapshot .meta [metafile_path ].version += 1
326+ snapshot .meta ["targets.json" ].version += 1
327327
328328 snapshot = self .modify_metadata ("snapshot" , version_meta_modifier )
329329 self .trusted_set .update_snapshot (snapshot )
330+
330331 with self .assertRaises (exceptions .BadVersionNumberError ):
331332 self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
332333
@@ -343,6 +344,26 @@ def snapshot_expired_modifier(snapshot: Snapshot) -> None:
343344 with self .assertRaises (exceptions .ExpiredMetadataError ):
344345 self .trusted_set .update_targets (self .metadata ["targets" ])
345346
347+ def test_update_snapshot_successful_rollback_checks (self ):
348+ def meta_version_bump (timestamp : Timestamp ) -> None :
349+ timestamp .meta ["snapshot.json" ].version += 1
350+
351+ def version_bump (snapshot : Snapshot ) -> None :
352+ snapshot .version += 1
353+
354+ # load a "local" timestamp, then update to newer one:
355+ self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
356+ new_timestamp = self .modify_metadata ("timestamp" , meta_version_bump )
357+ self .trusted_set .update_timestamp (new_timestamp )
358+
359+ # load a "local" snapshot, then update to newer one:
360+ self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
361+ new_snapshot = self .modify_metadata ("snapshot" , version_bump )
362+ self .trusted_set .update_snapshot (new_snapshot )
363+
364+ # update targets to trigger final snapshot meta version check
365+ self .trusted_set .update_targets (self .metadata ["targets" ])
366+
346367 def test_update_targets_no_meta_in_snapshot (self ):
347368 def no_meta_modifier (snapshot : Snapshot ) -> None :
348369 snapshot .meta = {}
0 commit comments