@@ -300,33 +300,34 @@ def timestamp_version_modifier(timestamp: Timestamp) -> None:
300
300
301
301
timestamp = self .modify_metadata ("timestamp" , timestamp_version_modifier )
302
302
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
306
303
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
308
308
with self .assertRaises (exceptions .BadVersionNumberError ):
309
- self .trusted_set .update_snapshot (snapshot )
309
+ self .trusted_set .update_targets (self .metadata ["targets" ])
310
+
310
311
311
- def test_update_snapshot_after_successful_update_new_snapshot_no_meta (self ):
312
+ def test_update_snapshot_file_removed_from_meta (self ):
312
313
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" ]
316
316
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 )
318
319
with self .assertRaises (exceptions .RepositoryError ):
319
320
self .trusted_set .update_snapshot (snapshot )
320
321
321
- def test_update_snapshot_after_succesfull_update_new_snapshot_meta_version_different (self ):
322
+ def test_update_snapshot_meta_version_decreases (self ):
322
323
self ._root_updated_and_update_timestamp (self .metadata ["timestamp" ])
323
- # snapshot.meta["project1"].version != new_snapshot.meta["project1"].version
324
+
324
325
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
327
327
328
328
snapshot = self .modify_metadata ("snapshot" , version_meta_modifier )
329
329
self .trusted_set .update_snapshot (snapshot )
330
+
330
331
with self .assertRaises (exceptions .BadVersionNumberError ):
331
332
self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
332
333
@@ -343,6 +344,26 @@ def snapshot_expired_modifier(snapshot: Snapshot) -> None:
343
344
with self .assertRaises (exceptions .ExpiredMetadataError ):
344
345
self .trusted_set .update_targets (self .metadata ["targets" ])
345
346
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
+
346
367
def test_update_targets_no_meta_in_snapshot (self ):
347
368
def no_meta_modifier (snapshot : Snapshot ) -> None :
348
369
snapshot .meta = {}
0 commit comments