From: Ian Lance Taylor Date: Wed, 4 Sep 2024 22:57:51 +0000 (-0700) Subject: os: don't fail TestGetwdDeepWithPWDSet if TMPDIR has a symlink X-Git-Tag: go1.24rc1~1002 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d102c2ed01b0aaa1278371fb1c1d2f0cd6a71f0d;p=gostls13.git 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 --- 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).