diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py index eaa56c59e..5cd624726 100644 --- a/src/borg/testsuite/archiver.py +++ b/src/borg/testsuite/archiver.py @@ -54,7 +54,7 @@ from ..logger import setup_logging from ..remote import RemoteRepository, PathNotAllowed from ..repository import Repository from . import has_lchflags, llfuse -from . import BaseTestCase, changedir, environment_variable, no_selinux +from . import BaseTestCase, changedir, environment_variable, no_selinux, same_ts_ns from . import are_symlinks_supported, are_hardlinks_supported, are_fifos_supported, is_utime_fully_supported, is_birthtime_fully_supported from .platform import fakeroot_detected, is_darwin from .upgrader import make_attic_repo @@ -521,7 +521,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): # make sure borg fixes the directory mtime after touching it sti = os.stat('input/dir2') sto = os.stat('output/input/dir2') - assert sti.st_mtime_ns == sto.st_mtime_ns + assert same_ts_ns(sti.st_mtime_ns, sto.st_mtime_ns) @pytest.mark.skipif(not is_utime_fully_supported(), reason='cannot properly setup and execute test without utime') @@ -540,7 +540,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): # make sure borg fixes the directory mtime after touching it sti = os.stat('input/dir2') sto = os.stat('output/input/dir2') - assert sti.st_mtime_ns == sto.st_mtime_ns + assert same_ts_ns(sti.st_mtime_ns, sto.st_mtime_ns) @pytest.mark.skipif(not is_utime_fully_supported(), reason='cannot properly setup and execute test without utime') @@ -559,7 +559,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): # make sure borg fixes the directory mtime after touching it sti = os.stat('input/dir2') sto = os.stat('output/input/dir2') - assert sti.st_mtime_ns == sto.st_mtime_ns + assert same_ts_ns(sti.st_mtime_ns, sto.st_mtime_ns) @pytest.mark.skipif(not is_utime_fully_supported(), reason='cannot properly setup and execute test without utime') def test_atime(self): @@ -573,7 +573,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): else: atime_after = os.stat(some_file).st_atime_ns noatime_used = flags_noatime != flags_normal - return noatime_used and atime_before == atime_after + return noatime_used and same_ts_ns(atime_before, atime_after) self.create_test_files() atime, mtime = 123456780, 234567890 @@ -585,12 +585,14 @@ class ArchiverTestCase(ArchiverTestCaseBase): self.cmd('extract', self.repository_location + '::test') sti = os.stat('input/file1') sto = os.stat('output/input/file1') - assert sti.st_mtime_ns == sto.st_mtime_ns == mtime * 1e9 + assert same_ts_ns(sti.st_mtime_ns, sto.st_mtime_ns) + assert same_ts_ns(sto.st_mtime_ns, mtime * 1e9) if have_noatime: - assert sti.st_atime_ns == sto.st_atime_ns == atime * 1e9 + assert same_ts_ns(sti.st_atime_ns, sto.st_atime_ns) + assert same_ts_ns(sto.st_atime_ns, atime * 1e9) else: # it touched the input file's atime while backing it up - assert sto.st_atime_ns == atime * 1e9 + assert same_ts_ns(sto.st_atime_ns, atime * 1e9) @pytest.mark.skipif(not is_utime_fully_supported(), reason='cannot properly setup and execute test without utime') @pytest.mark.skipif(not is_birthtime_fully_supported(), reason='cannot properly setup and execute test without birthtime') @@ -605,8 +607,10 @@ class ArchiverTestCase(ArchiverTestCaseBase): self.cmd('extract', self.repository_location + '::test') sti = os.stat('input/file1') sto = os.stat('output/input/file1') - assert int(sti.st_birthtime * 1e9) == int(sto.st_birthtime * 1e9) == birthtime * 1e9 - assert sti.st_mtime_ns == sto.st_mtime_ns == mtime * 1e9 + assert same_ts_ns(sti.st_birthtime * 1e9, sto.st_birthtime * 1e9) + assert same_ts_ns(sto.st_birthtime * 1e9, birthtime * 1e9) + assert same_ts_ns(sti.st_mtime_ns, sto.st_mtime_ns) + assert same_ts_ns(sto.st_mtime_ns, mtime * 1e9) @pytest.mark.skipif(not is_utime_fully_supported(), reason='cannot properly setup and execute test without utime') @pytest.mark.skipif(not is_birthtime_fully_supported(), reason='cannot properly setup and execute test without birthtime') @@ -621,9 +625,10 @@ class ArchiverTestCase(ArchiverTestCaseBase): self.cmd('extract', self.repository_location + '::test') sti = os.stat('input/file1') sto = os.stat('output/input/file1') - assert int(sti.st_birthtime * 1e9) == birthtime * 1e9 - assert int(sto.st_birthtime * 1e9) == mtime * 1e9 - assert sti.st_mtime_ns == sto.st_mtime_ns == mtime * 1e9 + assert same_ts_ns(sti.st_birthtime * 1e9, birthtime * 1e9) + assert same_ts_ns(sto.st_birthtime * 1e9, mtime * 1e9) + assert same_ts_ns(sti.st_mtime_ns, sto.st_mtime_ns) + assert same_ts_ns(sto.st_mtime_ns, mtime * 1e9) def _extract_repository_id(self, path): with Repository(self.repository_path) as repository: @@ -1497,9 +1502,9 @@ class ArchiverTestCase(ArchiverTestCaseBase): # atime_extracted = os.stat(extracted_path).st_atime_ns xa_value_extracted = xattr.getxattr(extracted_path.encode(), xa_key) assert xa_value_extracted == xa_value - assert birthtime_extracted == birthtime_expected - assert mtime_extracted == mtime_expected - # assert atime_extracted == atime_expected # still broken, but not really important. + assert same_ts_ns(birthtime_extracted * 1e9, birthtime_expected * 1e9) + assert same_ts_ns(mtime_extracted, mtime_expected) + # assert same_ts_ns(atime_extracted, atime_expected) # still broken, but not really important. def test_path_normalization(self): self.cmd('init', '--encryption=repokey', self.repository_location) @@ -2589,7 +2594,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): else: atime_after = os.stat(some_file).st_atime_ns noatime_used = flags_noatime != flags_normal - return noatime_used and atime_before == atime_after + return noatime_used and same_ts_ns(atime_before, atime_after) self.cmd('init', '--encryption=repokey', self.repository_location) self.create_test_files() @@ -2623,9 +2628,9 @@ class ArchiverTestCase(ArchiverTestCaseBase): assert sti1.st_gid == sto1.st_gid assert sti1.st_size == sto1.st_size if have_noatime: - assert sti1.st_atime == sto1.st_atime - assert sti1.st_ctime == sto1.st_ctime - assert sti1.st_mtime == sto1.st_mtime + assert same_ts_ns(sti1.st_atime * 1e9, sto1.st_atime * 1e9) + assert same_ts_ns(sti1.st_ctime * 1e9, sto1.st_ctime * 1e9) + assert same_ts_ns(sti1.st_mtime * 1e9, sto1.st_mtime * 1e9) if are_hardlinks_supported(): # note: there is another hardlink to this, see below assert sti1.st_nlink == sto1.st_nlink == 2