Skip to content

Commit ba6ef64

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 ba6ef64

File tree

1 file changed

+57
-27
lines changed

1 file changed

+57
-27
lines changed

tests/test_updater_top_level_update.py

Lines changed: 57 additions & 27 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(microsecond=0) + datetime.timedelta(
316+
days=7
317+
)
318+
self.sim.timestamp.version = 2
319+
320+
# Make a successful update of valid metadata which stores it in cache
313321
self._run_refresh()
314322

315-
mock_time.utcnow.return_value = (
316-
datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
323+
self.sim.timestamp.version = 1
324+
325+
self.sim.timestamp.expires = now.replace(microsecond=0) + datetime.timedelta(
326+
days=21
317327
)
318-
with patch("datetime.datetime", mock_time):
319-
# Check for a rollback attack
320-
self.sim.timestamp.version = 2
321-
self._run_refresh()
322328

323-
self.sim.timestamp.version = 1
329+
mock_time.utcnow.return_value = (
330+
datetime.datetime.utcnow() + datetime.timedelta(
331+
days=18
332+
))
333+
with patch("datetime.datetime", mock_time):
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:
331-
self._run_refresh()
332343

333-
mock_time.utcnow.return_value = (
334-
datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
344+
now = datetime.datetime.utcnow()
345+
self.sim.timestamp.expires = now.replace(microsecond=0) + datetime.timedelta(
346+
days=7
335347
)
336-
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()
348+
# Bump the snapshot version number to 3
349+
self.sim.update_snapshot()
350+
self.sim.update_snapshot()
341351

342-
# Snapshot meta version is smaller than previous
343-
self.sim.timestamp.snapshot_meta.version = 1
344-
self.sim.timestamp.version += 1 # timestamp v3
352+
# Make a successful update of valid metadata which stores it in cache
353+
self._run_refresh()
345354

355+
self.sim.snapshot.version = 1
356+
# Snapshot version number is set to 2, which is still less than 3
357+
self.sim.update_snapshot()
358+
self.sim.timestamp.expires = now.replace(microsecond=0) + datetime.timedelta(
359+
days=21
360+
)
361+
362+
mock_time.utcnow.return_value = (
363+
datetime.datetime.utcnow() + datetime.timedelta(
364+
days=18
365+
))
366+
with patch("datetime.datetime", mock_time):
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,26 @@ 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(microsecond=0) + datetime.timedelta(
737+
days=7
738+
)
712739
# Make a successful update of valid metadata which stores it in cache
713740
self._run_refresh()
714741

715-
# Simulate expired local metadata by mocking system time one second ahead
742+
self.sim.targets.version += 1
743+
self.sim.update_snapshot()
744+
self.sim.timestamp.expires = now.replace(microsecond=0) + datetime.timedelta(
745+
days=21
746+
)
747+
748+
# Mocking time so that local timestam has expired
749+
# but the new timestamp has not
716750
mock_time.utcnow.return_value = (
717-
datetime.datetime.utcnow() + datetime.timedelta(seconds=1)
751+
datetime.datetime.utcnow() + datetime.timedelta(days=18)
718752
)
719753
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()
754+
self._run_refresh()
725755

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

0 commit comments

Comments
 (0)