]> Cypherpunks repositories - gostls13.git/commitdiff
os: TestChtimes: separate hasNoatime
authorKir Kolyshkin <kolyshkin@gmail.com>
Fri, 21 Jun 2024 23:59:21 +0000 (16:59 -0700)
committerGopher Robot <gobot@golang.org>
Mon, 24 Jun 2024 16:39:42 +0000 (16:39 +0000)
Move the noatime check to a separate function (to be used by CL 91535),
adding some documentation along the way.

Unify the atime error message.

Change-Id: I5f75a4399f6e1b16ae20438003de5460f3eeb5aa
Reviewed-on: https://go-review.googlesource.com/c/go/+/594075
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Joedian Reid <joedian@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>

src/os/os_test.go

index 2a6b1bf9f5e104065db60ec4b6f4aa8c8530682b..b3fbe42ba788b8e416a43fc6fb6a687f0b0e9246 100644 (file)
@@ -1361,6 +1361,17 @@ func TestTruncateNonexistentFile(t *testing.T) {
        assertPathError(t, path, err)
 }
 
+var hasNoatime = sync.OnceValue(func() bool {
+       // A sloppy way to check if noatime flag is set (as all filesystems are
+       // checked, not just the one we're interested in). A correct way
+       // would be to use statvfs syscall and check if flags has ST_NOATIME,
+       // but the syscall is OS-specific and is not even wired into Go stdlib.
+       //
+       // Only used on NetBSD (which ignores explicit atime updates with noatime).
+       mounts, _ := ReadFile("/proc/mounts")
+       return bytes.Contains(mounts, []byte("noatime"))
+})
+
 func TestChtimes(t *testing.T) {
        t.Parallel()
 
@@ -1523,6 +1534,7 @@ func testChtimes(t *testing.T, name string) {
        pat := Atime(postStat)
        pmt := postStat.ModTime()
        if !pat.Before(at) {
+               errormsg := fmt.Sprintf("AccessTime didn't go backwards; was=%v, after=%v", at, pat)
                switch runtime.GOOS {
                case "plan9":
                        // Mtime is the time of the last change of
@@ -1530,14 +1542,14 @@ func testChtimes(t *testing.T, name string) {
                        // the contents are accessed; also, it is set
                        // whenever mtime is set.
                case "netbsd":
-                       mounts, _ := ReadFile("/proc/mounts")
-                       if strings.Contains(string(mounts), "noatime") {
-                               t.Logf("AccessTime didn't go backwards, but see a filesystem mounted noatime; ignoring. Issue 19293.")
+                       if hasNoatime() {
+                               t.Log(errormsg)
+                               t.Log("Known NetBSD issue (atime not changed on fs mounted with noatime); ignoring.")
                        } else {
-                               t.Logf("AccessTime didn't go backwards; was=%v, after=%v (Ignoring on NetBSD, assuming noatime, Issue 19293)", at, pat)
+                               t.Errorf(errormsg)
                        }
                default:
-                       t.Errorf("AccessTime didn't go backwards; was=%v, after=%v", at, pat)
+                       t.Errorf(errormsg)
                }
        }