mirror of
https://github.com/theupdateframework/python-tuf
synced 2026-05-24 10:08:28 +00:00
tests: Use freezegun for time mocking to fix pypy3 compatibility
Use freezegun for time mocking instead of manually patching the datetime module, as it provides a more streamlined solution that works both on CPython and on PyPy. Unfortunately, due to differences between the C datetime extension used by CPython, and the pure Python version of datetime (used by PyPy, and as a fallback on CPython), there does not seem to be a trivial way to mock time that would work with both versions. Fixes #2708 Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
parent
d77ab75a4e
commit
ee27bcccc1
3 changed files with 19 additions and 19 deletions
|
|
@ -8,3 +8,6 @@
|
|||
# are pinned to prevent unexpected linting failures when tools update)
|
||||
ruff==0.6.7
|
||||
mypy==1.11.2
|
||||
|
||||
# Required for type stubs
|
||||
freezegun==1.5.1
|
||||
|
|
|
|||
|
|
@ -5,3 +5,4 @@
|
|||
|
||||
# coverage measurement
|
||||
coverage==7.6.1
|
||||
freezegun==1.5.1
|
||||
|
|
|
|||
|
|
@ -11,7 +11,9 @@
|
|||
import unittest
|
||||
from datetime import timezone
|
||||
from typing import Iterable, Optional
|
||||
from unittest.mock import MagicMock, Mock, call, patch
|
||||
from unittest.mock import MagicMock, call, patch
|
||||
|
||||
import freezegun
|
||||
|
||||
from tests import utils
|
||||
from tests.repository_simulator import RepositorySimulator
|
||||
|
|
@ -306,8 +308,7 @@ def test_new_timestamp_unsigned(self) -> None:
|
|||
|
||||
self._assert_files_exist([Root.type])
|
||||
|
||||
@patch.object(datetime, "datetime", wraps=datetime.datetime)
|
||||
def test_expired_timestamp_version_rollback(self, mock_time: Mock) -> None:
|
||||
def test_expired_timestamp_version_rollback(self) -> None:
|
||||
"""Verifies that local timestamp is used in rollback checks even if it is expired.
|
||||
|
||||
The timestamp updates and rollback checks are performed
|
||||
|
|
@ -331,10 +332,9 @@ def test_expired_timestamp_version_rollback(self, mock_time: Mock) -> None:
|
|||
|
||||
self.sim.timestamp.version = 1
|
||||
|
||||
mock_time.now.return_value = datetime.datetime.now(
|
||||
timezone.utc
|
||||
) + datetime.timedelta(days=18)
|
||||
patcher = patch("datetime.datetime", mock_time)
|
||||
patcher = freezegun.freeze_time(
|
||||
datetime.datetime.now(timezone.utc) + datetime.timedelta(days=18)
|
||||
)
|
||||
# Check that a rollback protection is performed even if
|
||||
# local timestamp has expired
|
||||
with patcher, self.assertRaises(BadVersionNumberError):
|
||||
|
|
@ -342,8 +342,7 @@ def test_expired_timestamp_version_rollback(self, mock_time: Mock) -> None:
|
|||
|
||||
self._assert_version_equals(Timestamp.type, 2)
|
||||
|
||||
@patch.object(datetime, "datetime", wraps=datetime.datetime)
|
||||
def test_expired_timestamp_snapshot_rollback(self, mock_time: Mock) -> None:
|
||||
def test_expired_timestamp_snapshot_rollback(self) -> None:
|
||||
"""Verifies that rollback protection is done even if local timestamp has expired.
|
||||
|
||||
The snapshot updates and rollback protection checks are performed
|
||||
|
|
@ -370,10 +369,9 @@ def test_expired_timestamp_snapshot_rollback(self, mock_time: Mock) -> None:
|
|||
self.sim.update_snapshot()
|
||||
self.sim.timestamp.expires = now + datetime.timedelta(days=21)
|
||||
|
||||
mock_time.now.return_value = datetime.datetime.now(
|
||||
timezone.utc
|
||||
) + datetime.timedelta(days=18)
|
||||
patcher = patch("datetime.datetime", mock_time)
|
||||
patcher = freezegun.freeze_time(
|
||||
datetime.datetime.now(timezone.utc) + datetime.timedelta(days=18)
|
||||
)
|
||||
# Assert that rollback protection is done even if
|
||||
# local timestamp has expired
|
||||
with patcher, self.assertRaises(BadVersionNumberError):
|
||||
|
|
@ -736,8 +734,7 @@ def test_load_metadata_from_cache(self, wrapped_open: MagicMock) -> None:
|
|||
expected_calls = [("root", 2), ("timestamp", None)]
|
||||
self.assertListEqual(self.sim.fetch_tracker.metadata, expected_calls)
|
||||
|
||||
@patch.object(datetime, "datetime", wraps=datetime.datetime)
|
||||
def test_expired_metadata(self, mock_time: Mock) -> None:
|
||||
def test_expired_metadata(self) -> None:
|
||||
"""Verifies that expired local timestamp/snapshot can be used for
|
||||
updating from remote.
|
||||
|
||||
|
|
@ -761,10 +758,9 @@ def test_expired_metadata(self, mock_time: Mock) -> None:
|
|||
|
||||
# Mocking time so that local timestam has expired
|
||||
# but the new timestamp has not
|
||||
mock_time.now.return_value = datetime.datetime.now(
|
||||
timezone.utc
|
||||
) + datetime.timedelta(days=18)
|
||||
with patch("datetime.datetime", mock_time):
|
||||
with freezegun.freeze_time(
|
||||
datetime.datetime.now(timezone.utc) + datetime.timedelta(days=18)
|
||||
):
|
||||
self._run_refresh()
|
||||
|
||||
# Assert that the final version of timestamp/snapshot is version 2
|
||||
|
|
|
|||
Loading…
Reference in a new issue