From 0e577452c2aa4d671e8d223bc8c95710fa6449cf Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Thu, 19 Jan 2023 00:13:45 +0100 Subject: [PATCH] tests: fix prune_split tests by giving the timestamps in local timezone Guess this fixes issues like #5535. I tested this with TZ=: - UTC - UTC+12 - UTC-12 - UTC+14 - UTC-14 --- src/borg/testsuite/helpers.py | 45 ++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/borg/testsuite/helpers.py b/src/borg/testsuite/helpers.py index 7b0830d9a..5cf1900d9 100644 --- a/src/borg/testsuite/helpers.py +++ b/src/borg/testsuite/helpers.py @@ -405,6 +405,17 @@ class MockArchive: return f"{self.id}: {self.ts.isoformat()}" +# This is the local timezone of the system running the tests. +# We need this e.g. to construct archive timestamps for the prune tests, +# because borg prune operates in the local timezone (it first converts the +# archive timestamp to the local timezone). So, if we want the y/m/d/h/m/s +# values which prune uses to be exactly the ones we give [and NOT shift them +# by tzoffset], we need to give the timestamps in the same local timezone. +# Please note that the timestamps in a real borg archive or manifest are +# stored in UTC timezone. +local_tz = datetime.now(tz=timezone.utc).astimezone(tz=None).tzinfo + + @pytest.mark.parametrize( "rule,num_to_keep,expected_ids", [ @@ -424,23 +435,23 @@ def test_prune_split(rule, num_to_keep, expected_ids): archives = [ # years apart - MockArchive(datetime(2015, 1, 1, 10, 0, 0, tzinfo=timezone.utc), 1), - MockArchive(datetime(2016, 1, 1, 10, 0, 0, tzinfo=timezone.utc), 2), - MockArchive(datetime(2017, 1, 1, 10, 0, 0, tzinfo=timezone.utc), 3), + MockArchive(datetime(2015, 1, 1, 10, 0, 0, tzinfo=local_tz), 1), + MockArchive(datetime(2016, 1, 1, 10, 0, 0, tzinfo=local_tz), 2), + MockArchive(datetime(2017, 1, 1, 10, 0, 0, tzinfo=local_tz), 3), # months apart - MockArchive(datetime(2017, 2, 1, 10, 0, 0, tzinfo=timezone.utc), 4), - MockArchive(datetime(2017, 3, 1, 10, 0, 0, tzinfo=timezone.utc), 5), + MockArchive(datetime(2017, 2, 1, 10, 0, 0, tzinfo=local_tz), 4), + MockArchive(datetime(2017, 3, 1, 10, 0, 0, tzinfo=local_tz), 5), # days apart - MockArchive(datetime(2017, 3, 2, 10, 0, 0, tzinfo=timezone.utc), 6), - MockArchive(datetime(2017, 3, 3, 10, 0, 0, tzinfo=timezone.utc), 7), - MockArchive(datetime(2017, 3, 4, 10, 0, 0, tzinfo=timezone.utc), 8), + MockArchive(datetime(2017, 3, 2, 10, 0, 0, tzinfo=local_tz), 6), + MockArchive(datetime(2017, 3, 3, 10, 0, 0, tzinfo=local_tz), 7), + MockArchive(datetime(2017, 3, 4, 10, 0, 0, tzinfo=local_tz), 8), # minutes apart - MockArchive(datetime(2017, 10, 1, 9, 45, 0, tzinfo=timezone.utc), 9), - MockArchive(datetime(2017, 10, 1, 9, 55, 0, tzinfo=timezone.utc), 10), + MockArchive(datetime(2017, 10, 1, 9, 45, 0, tzinfo=local_tz), 9), + MockArchive(datetime(2017, 10, 1, 9, 55, 0, tzinfo=local_tz), 10), # seconds apart - MockArchive(datetime(2017, 10, 1, 10, 0, 1, tzinfo=timezone.utc), 11), - MockArchive(datetime(2017, 10, 1, 10, 0, 3, tzinfo=timezone.utc), 12), - MockArchive(datetime(2017, 10, 1, 10, 0, 5, tzinfo=timezone.utc), 13), + MockArchive(datetime(2017, 10, 1, 10, 0, 1, tzinfo=local_tz), 11), + MockArchive(datetime(2017, 10, 1, 10, 0, 3, tzinfo=local_tz), 12), + MockArchive(datetime(2017, 10, 1, 10, 0, 5, tzinfo=local_tz), 13), ] kept_because = {} keep = prune_split(archives, rule, num_to_keep, kept_because) @@ -456,12 +467,12 @@ def test_prune_split_keep_oldest(): archives = [ # oldest backup, but not last in its year - MockArchive(datetime(2018, 1, 1, 10, 0, 0, tzinfo=timezone.utc), 1), + MockArchive(datetime(2018, 1, 1, 10, 0, 0, tzinfo=local_tz), 1), # an interim backup - MockArchive(datetime(2018, 12, 30, 10, 0, 0, tzinfo=timezone.utc), 2), + MockArchive(datetime(2018, 12, 30, 10, 0, 0, tzinfo=local_tz), 2), # year end backups - MockArchive(datetime(2018, 12, 31, 10, 0, 0, tzinfo=timezone.utc), 3), - MockArchive(datetime(2019, 12, 31, 10, 0, 0, tzinfo=timezone.utc), 4), + MockArchive(datetime(2018, 12, 31, 10, 0, 0, tzinfo=local_tz), 3), + MockArchive(datetime(2019, 12, 31, 10, 0, 0, tzinfo=local_tz), 4), ] # Keep oldest when retention target can't otherwise be met