diff --git a/tests/test_api.py b/tests/test_api.py index 24f6ace24a..c47e0ef34c 100755 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -219,7 +219,25 @@ def test_metadata_base(self): md.signed.bump_expiration(timedelta(days=365)) self.assertEqual(md.signed.expires, datetime(2031, 1, 2, 0, 0)) - + # Test is_expired with reference_time provided + is_expired = md.signed.is_expired(md.signed.expires) + self.assertTrue(is_expired) + is_expired = md.signed.is_expired(md.signed.expires + timedelta(days=1)) + self.assertTrue(is_expired) + is_expired = md.signed.is_expired(md.signed.expires - timedelta(days=1)) + self.assertFalse(is_expired) + + # Test is_expired without reference_time, + # manipulating md.signed.expires + expires = md.signed.expires + md.signed.expires = datetime.utcnow() + is_expired = md.signed.is_expired() + self.assertTrue(is_expired) + md.signed.expires = datetime.utcnow() + timedelta(days=1) + is_expired = md.signed.is_expired() + self.assertFalse(is_expired) + md.signed.expires = expires + def test_metadata_snapshot(self): snapshot_path = os.path.join( self.repo_dir, 'metadata', 'snapshot.json') diff --git a/tuf/api/metadata.py b/tuf/api/metadata.py index 99efd9b510..f579fd669c 100644 --- a/tuf/api/metadata.py +++ b/tuf/api/metadata.py @@ -351,6 +351,22 @@ def _common_fields_to_dict(self) -> Dict[str, Any]: "expires": self.expires.isoformat() + "Z", } + def is_expired(self, reference_time: datetime = None) -> bool: + """Checks metadata expiration against a reference time. + + Args: + reference_time: Optional; The time to check expiration date against. + A naive datetime in UTC expected. + If not provided, checks against the current UTC date and time. + + Returns: + True if expiration time is less than the reference time. + """ + if reference_time is None: + reference_time = datetime.utcnow() + + return reference_time >= self.expires + # Modification. def bump_expiration(self, delta: timedelta = timedelta(days=1)) -> None: """Increments the expires attribute by the passed timedelta. """