Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion requirements/lint.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# Lint tools
# (We are not so interested in the specific versions of the tools: the versions
# are pinned to prevent unexpected linting failures when tools update)
ruff==0.16.10
ruff==0.17.0
mypy==2.4.0
zizmor==1.30.1

Expand Down
8 changes: 3 additions & 5 deletions tests/repository_simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@

from __future__ import annotations

import datetime
import hashlib
import logging
import os
import tempfile
from dataclasses import dataclass, field
from datetime import UTC, datetime, timedelta
from typing import TYPE_CHECKING
from urllib import parse

Expand Down Expand Up @@ -129,10 +129,8 @@ def __init__(self) -> None:

self.fetch_tracker = FetchTracker()

now = datetime.datetime.now(datetime.UTC)
self.safe_expiry = now.replace(microsecond=0) + datetime.timedelta(
days=30
)
now = datetime.now(UTC)
self.safe_expiry = now.replace(microsecond=0) + timedelta(days=30)

self._initialize()

Expand Down
38 changes: 15 additions & 23 deletions tests/test_updater_top_level_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
from __future__ import annotations

import builtins
import datetime
import os
import sys
import tempfile
import unittest
from datetime import UTC, datetime, timedelta
from pathlib import Path
from typing import TYPE_CHECKING
from unittest.mock import MagicMock, call, patch
Expand Down Expand Up @@ -49,9 +49,7 @@ class TestRefresh(unittest.TestCase):
# set dump_dir to trigger repository state dumps
dump_dir: str | None = None

past_datetime = datetime.datetime.now(datetime.UTC).replace(
microsecond=0
) - datetime.timedelta(days=5)
past_datetime = datetime.now(UTC).replace(microsecond=0) - timedelta(days=5)

def setUp(self) -> None:
self.temp_dir = tempfile.TemporaryDirectory()
Expand Down Expand Up @@ -311,21 +309,19 @@ def test_expired_timestamp_version_rollback(self) -> None:
- Second updater refresh performed on day 18:
assert that rollback check uses expired timestamp v1"""

now = datetime.datetime.now(datetime.UTC)
self.sim.timestamp.expires = now + datetime.timedelta(days=7)
now = datetime.now(UTC)
self.sim.timestamp.expires = now + timedelta(days=7)

self.sim.timestamp.version = 2

# Make a successful update of valid metadata which stores it in cache
self._run_refresh()

self.sim.timestamp.expires = now + datetime.timedelta(days=21)
self.sim.timestamp.expires = now + timedelta(days=21)

self.sim.timestamp.version = 1

patcher = freezegun.freeze_time(
datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=18)
)
patcher = freezegun.freeze_time(datetime.now(UTC) + timedelta(days=18))
# Check that a rollback protection is performed even if
# local timestamp has expired
with patcher, self.assertRaises(BadVersionNumberError):
Expand All @@ -345,8 +341,8 @@ def test_expired_timestamp_snapshot_rollback(self) -> None:
- Second updater refresh performed on day 18:
assert that rollback protection is done with expired timestamp v1"""

now = datetime.datetime.now(datetime.UTC)
self.sim.timestamp.expires = now + datetime.timedelta(days=7)
now = datetime.now(UTC)
self.sim.timestamp.expires = now + timedelta(days=7)

# Bump the snapshot version number to 3
self.sim.update_snapshot()
Expand All @@ -358,11 +354,9 @@ def test_expired_timestamp_snapshot_rollback(self) -> None:
self.sim.snapshot.version = 1
# Snapshot version number is set to 2, which is still less than 3
self.sim.update_snapshot()
self.sim.timestamp.expires = now + datetime.timedelta(days=21)
self.sim.timestamp.expires = now + timedelta(days=21)

patcher = freezegun.freeze_time(
datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=18)
)
patcher = freezegun.freeze_time(datetime.now(UTC) + timedelta(days=18))
# Assert that rollback protection is done even if
# local timestamp has expired
with patcher, self.assertRaises(BadVersionNumberError):
Expand Down Expand Up @@ -443,7 +437,7 @@ def test_new_snapshot_hash_mismatch(self) -> None:

# Modify snapshot contents without updating
# timestamp's snapshot hash
self.sim.snapshot.expires += datetime.timedelta(days=1)
self.sim.snapshot.expires += timedelta(days=1)
self.sim.snapshot.version += 1 # snapshot v2
self.sim.timestamp.snapshot_meta.version = self.sim.snapshot.version
self.sim.timestamp.version += 1 # timestamp v3
Expand Down Expand Up @@ -821,21 +815,19 @@ def test_expired_metadata(self) -> None:
- Second updater refresh performed on day 18,
it is successful and timestamp/snapshot final versions are v2"""

now = datetime.datetime.now(datetime.UTC)
self.sim.timestamp.expires = now + datetime.timedelta(days=7)
now = datetime.now(UTC)
self.sim.timestamp.expires = now + timedelta(days=7)

# Make a successful update of valid metadata which stores it in cache
self._run_refresh()

self.sim.targets.version += 1
self.sim.update_snapshot()
self.sim.timestamp.expires = now + datetime.timedelta(days=21)
self.sim.timestamp.expires = now + timedelta(days=21)

# Mocking time so that local timestam has expired
# but the new timestamp has not
with freezegun.freeze_time(
datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=18)
):
with freezegun.freeze_time(datetime.now(UTC) + timedelta(days=18)):
self._run_refresh()

# Assert that the final version of timestamp/snapshot is version 2
Expand Down
6 changes: 3 additions & 3 deletions tuf/api/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ def signed_bytes(self) -> bytes:
"""Default canonical json byte representation of ``self.signed``."""

# Use local scope import to avoid circular import errors
from tuf.api.serialization.json import CanonicalJSONSerializer # noqa: I001, PLC0415
from tuf.api.serialization.json import CanonicalJSONSerializer # noqa: PLC0415

return CanonicalJSONSerializer().serialize(self.signed)

Expand Down Expand Up @@ -264,7 +264,7 @@ def from_bytes(

if deserializer is None:
# Use local scope import to avoid circular import errors
from tuf.api.serialization.json import JSONDeserializer # noqa: I001, PLC0415
from tuf.api.serialization.json import JSONDeserializer # noqa: PLC0415

deserializer = JSONDeserializer()

Expand All @@ -291,7 +291,7 @@ def to_bytes(self, serializer: MetadataSerializer | None = None) -> bytes:

if serializer is None:
# Use local scope import to avoid circular import errors
from tuf.api.serialization.json import JSONSerializer # noqa: I001, PLC0415
from tuf.api.serialization.json import JSONSerializer # noqa: PLC0415

serializer = JSONSerializer(compact=True)

Expand Down
4 changes: 2 additions & 2 deletions tuf/ngclient/_internal/trusted_metadata_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@

from __future__ import annotations

import datetime
import logging
from collections import abc
from datetime import UTC, datetime
from typing import TYPE_CHECKING, cast

from tuf.api import exceptions
Expand Down Expand Up @@ -116,7 +116,7 @@ def __init__(self, root_data: bytes, envelope_type: EnvelopeType):
"""
self._trusted_set: dict[str, Signed] = {}
self._trusted_delegations: set[tuple[str, str]] = set()
self.reference_time = datetime.datetime.now(datetime.UTC)
self.reference_time = datetime.now(UTC)

if envelope_type is EnvelopeType.SIMPLE:
self._load_data = _load_from_simple_envelope
Expand Down
Loading