Skip to content

Commit d806051

Browse files
miss-islingtonserhiy-storchakaclaude
authored
[3.14] gh-154427: Check the access time in UtimeTests only if it is stored (GH-154428) (GH-154433)
HAMMER2 on DragonFly BSD does not store the access time and os.stat() returns the modification time instead. Probe the file system, like it is already done for the timestamp resolution. (cherry picked from commit 6f8f97f) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent ab4921d commit d806051

1 file changed

Lines changed: 16 additions & 5 deletions

File tree

Lib/test/test_os.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -899,11 +899,18 @@ def support_subsecond(self, filename):
899899
or (st.st_mtime != st[8])
900900
or (st.st_ctime != st[9]))
901901

902+
def support_atime(self, filename):
903+
# Heuristic to check if the filesystem stores the access time.
904+
# Use whole seconds, to not depend on the timestamp resolution.
905+
os.utime(filename, (1, 2))
906+
return os.stat(filename).st_atime == 1
907+
902908
def _test_utime(self, set_time, filename=None):
903909
if not filename:
904910
filename = self.fname
905911

906912
support_subsecond = self.support_subsecond(filename)
913+
support_atime = self.support_atime(filename)
907914
if support_subsecond:
908915
# Timestamp with a resolution of 1 microsecond (10^-6).
909916
#
@@ -930,18 +937,22 @@ def _test_utime(self, set_time, filename=None):
930937
# digits worth of sub-second precision.
931938
# Some day it would be good to fix this upstream.
932939
delta=1e-5
933-
self.assertAlmostEqual(st.st_atime, atime_ns * 1e-9, delta=1e-5)
940+
if support_atime:
941+
self.assertAlmostEqual(st.st_atime, atime_ns * 1e-9, delta=1e-5)
942+
self.assertAlmostEqual(st.st_atime_ns, atime_ns, delta=1e9 * 1e-5)
934943
self.assertAlmostEqual(st.st_mtime, mtime_ns * 1e-9, delta=1e-5)
935-
self.assertAlmostEqual(st.st_atime_ns, atime_ns, delta=1e9 * 1e-5)
936944
self.assertAlmostEqual(st.st_mtime_ns, mtime_ns, delta=1e9 * 1e-5)
937945
else:
938946
if support_subsecond:
939-
self.assertAlmostEqual(st.st_atime, atime_ns * 1e-9, delta=1e-6)
947+
if support_atime:
948+
self.assertAlmostEqual(st.st_atime, atime_ns * 1e-9, delta=1e-6)
940949
self.assertAlmostEqual(st.st_mtime, mtime_ns * 1e-9, delta=1e-6)
941950
else:
942-
self.assertEqual(st.st_atime, atime_ns * 1e-9)
951+
if support_atime:
952+
self.assertEqual(st.st_atime, atime_ns * 1e-9)
943953
self.assertEqual(st.st_mtime, mtime_ns * 1e-9)
944-
self.assertEqual(st.st_atime_ns, atime_ns)
954+
if support_atime:
955+
self.assertEqual(st.st_atime_ns, atime_ns)
945956
self.assertEqual(st.st_mtime_ns, mtime_ns)
946957

947958
def test_utime(self):

0 commit comments

Comments
 (0)