From d102c2ed01b0aaa1278371fb1c1d2f0cd6a71f0d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 4 Sep 2024 15:57:51 -0700 Subject: [PATCH] os: don't fail TestGetwdDeepWithPWDSet if TMPDIR has a symlink When testing with PWD set, it's possible for the stat of PWD to fail with ENAMETOOLONG, and for syscall.Getwd to fail for the same reason. If PWD contains symlinks, the fallback code won't know about them. If Getwd returns the same result as PWD with resolved symlinks, the test should not fail. Change-Id: I39587ddb826d4e18339e185aad0cdd60167b1079 Reviewed-on: https://go-review.googlesource.com/c/go/+/610759 Auto-Submit: Ian Lance Taylor LUCI-TryBot-Result: Go LUCI Reviewed-by: Ian Lance Taylor Commit-Queue: Ian Lance Taylor Reviewed-by: Tim King --- src/os/getwd_unix_test.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/os/getwd_unix_test.go b/src/os/getwd_unix_test.go index 084344735c..f5265445c2 100644 --- a/src/os/getwd_unix_test.go +++ b/src/os/getwd_unix_test.go @@ -9,6 +9,7 @@ package os_test import ( "errors" . "os" + "path/filepath" "runtime" "strings" "syscall" @@ -26,7 +27,9 @@ func TestGetwdDeepWithPWDSet(t *testing.T) { // testGetwdDeep checks that os.Getwd is able to return paths // longer than syscall.PathMax (with or without PWD set). func testGetwdDeep(t *testing.T, setPWD bool) { - dir := t.TempDir() + tempDir := t.TempDir() + + dir := tempDir t.Chdir(dir) if setPWD { @@ -66,7 +69,23 @@ func testGetwdDeep(t *testing.T, setPWD bool) { t.Fatal(err) } if setPWD && wd != dir { - t.Fatalf("Getwd: want same value as $PWD: %q, got %q", dir, wd) + // It's possible for the stat of PWD to fail + // with ENAMETOOLONG, and for getwd to fail for + // the same reason, and it's possible for $TMPDIR + // to contain a symlink. In that case the fallback + // code will not return the same directory. + if len(dir) > 1000 { + symDir, err := filepath.EvalSymlinks(tempDir) + if err == nil && symDir != tempDir { + t.Logf("EvalSymlinks(%q) = %q", tempDir, symDir) + if strings.Replace(dir, tempDir, symDir, 1) == wd { + // Symlink confusion is OK. + break + } + } + } + + t.Fatalf("Getwd: got %q, want same value as $PWD: %q", wd, dir) } // Ideally the success criterion should be len(wd) > syscall.PathMax, // but the latter is not public for some platforms, so use Stat(wd). -- 2.48.1