Skip to content

Commit ed0d0b8

Browse files
committed
Update expired metadata tests logic
This change improves the logic of expired metadata tests, so that it is explicitly visible what the expiry time and the versions are and when update/refresh is called in that period Signed-off-by: Ivana Atanasova <[email protected]>
1 parent 7c467b0 commit ed0d0b8

File tree

1 file changed

+56
-25
lines changed

1 file changed

+56
-25
lines changed

tests/test_updater_top_level_update.py

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -310,43 +310,66 @@ def test_new_timestamp_unsigned(self) -> None:
310310

311311
@patch.object(datetime, "datetime", wraps=datetime.datetime)
312312
def test_expired_timestamp_version_rollback(self, mock_time: Mock) -> None:
313+
314+
now = datetime.datetime.utcnow()
315+
self.sim.timestamp.expires = now.replace(
316+
microsecond=0
317+
) + datetime.timedelta(days=7)
318+
319+
self.sim.timestamp.version = 2
320+
321+
# Make a successful update of valid metadata which stores it in cache
313322
self._run_refresh()
314323

324+
self.sim.timestamp.version = 1
325+
326+
self.sim.timestamp.expires = now.replace(
327+
microsecond=0
328+
) + datetime.timedelta(days=21)
329+
315330
mock_time.utcnow.return_value = (
316-
datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
331+
datetime.datetime.utcnow() + datetime.timedelta(days=18)
317332
)
318333
with patch("datetime.datetime", mock_time):
319-
# Check for a rollback attack
320-
self.sim.timestamp.version = 2
321-
self._run_refresh()
322-
323-
self.sim.timestamp.version = 1
334+
# Check that a rollback protection is performed even if
335+
# local timestamp has expired
324336
with self.assertRaises(BadVersionNumberError):
325337
self._run_refresh()
326338

327-
self._assert_version_equals(Timestamp.type, 2)
339+
self._assert_version_equals(Timestamp.type, 2)
328340

329341
@patch.object(datetime, "datetime", wraps=datetime.datetime)
330342
def test_expired_timestamp_snapshot_rollback(self, mock_time: Mock) -> None:
343+
344+
now = datetime.datetime.utcnow()
345+
self.sim.timestamp.expires = now.replace(
346+
microsecond=0
347+
) + datetime.timedelta(days=7)
348+
349+
# Bump the snapshot version number to 3
350+
self.sim.update_snapshot()
351+
self.sim.update_snapshot()
352+
353+
# Make a successful update of valid metadata which stores it in cache
331354
self._run_refresh()
332355

356+
self.sim.snapshot.version = 1
357+
# Snapshot version number is set to 2, which is still less than 3
358+
self.sim.update_snapshot()
359+
self.sim.timestamp.expires = now.replace(
360+
microsecond=0
361+
) + datetime.timedelta(days=21)
362+
333363
mock_time.utcnow.return_value = (
334-
datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
364+
datetime.datetime.utcnow() + datetime.timedelta(days=18)
335365
)
336366
with patch("datetime.datetime", mock_time):
337-
# Check for a rollback attack.
338-
self.sim.snapshot.version = 2
339-
self.sim.update_timestamp() # timestamp v2
340-
self._run_refresh()
341-
342-
# Snapshot meta version is smaller than previous
343-
self.sim.timestamp.snapshot_meta.version = 1
344-
self.sim.timestamp.version += 1 # timestamp v3
345-
367+
# Assert that rollback protection is done even if
368+
# local timestamp has expired
346369
with self.assertRaises(BadVersionNumberError):
347370
self._run_refresh()
348371

349-
self._assert_version_equals(Timestamp.type, 2)
372+
self._assert_version_equals(Timestamp.type, 3)
350373

351374
def test_new_timestamp_version_rollback(self) -> None:
352375
# Check for a rollback attack
@@ -709,19 +732,27 @@ def test_expired_metadata(self, mock_time: Mock) -> None:
709732
# Test that expired local timestamp/snapshot can be used for updating
710733
# from remote
711734

735+
now = datetime.datetime.utcnow()
736+
self.sim.timestamp.expires = now.replace(
737+
microsecond=0
738+
) + datetime.timedelta(days=7)
739+
712740
# Make a successful update of valid metadata which stores it in cache
713741
self._run_refresh()
714742

715-
# Simulate expired local metadata by mocking system time one second ahead
743+
self.sim.targets.version += 1
744+
self.sim.update_snapshot()
745+
self.sim.timestamp.expires = now.replace(
746+
microsecond=0
747+
) + datetime.timedelta(days=21)
748+
749+
# Mocking time so that local timestam has expired
750+
# but the new timestamp has not
716751
mock_time.utcnow.return_value = (
717-
datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
752+
datetime.datetime.utcnow() + datetime.timedelta(days=18)
718753
)
719754
with patch("datetime.datetime", mock_time):
720-
self.sim.targets.version += 1
721-
self.sim.update_snapshot()
722-
# Create a new updater and perform a second update while
723-
# the metadata is already stored in cache (metadata dir)
724-
self._run_refresh()
755+
self._run_refresh()
725756

726757
# Assert that the final version of timestamp/snapshot is version 2
727758
# which means a successful refresh is performed

0 commit comments

Comments
 (0)