Files
coder/testutil/temp.go
Ethan 5e701d3075 test: fix TestWatcher_SharedParentRefcount on macOS (#25379)
`TestWatcher_SharedParentRefcount` was deterministically broken on
macOS: `t.TempDir()` lives under `/var` which is a symlink to
`/private/var`, but the watcher canonicalizes paths via
`filepath.EvalSymlinks` before storing them, so the test's `w.dirs[dir]`
lookup missed and returned `0` instead of `2`.

Adds `testutil.TempDirResolved`, a shared helper that returns
`t.TempDir()` with symlinks resolved and falls back to the raw temp dir
on error (Windows-friendly). Migrates the matching inline
`EvalSymlinks(t.TempDir())` callsites in
`agent/agentgit/agentgit_test.go` to use it.

Closes https://github.com/coder/internal/issues/1531
2026-05-15 17:37:08 +10:00

74 lines
1.9 KiB
Go

package testutil
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
)
// TempFile returns the name of a temporary file that does not exist.
func TempFile(t *testing.T, dir, pattern string) string {
t.Helper()
if dir == "" {
dir = t.TempDir()
}
f, err := os.CreateTemp(dir, pattern)
require.NoError(t, err, "create temp file")
name := f.Name()
err = f.Close()
require.NoError(t, err, "close temp file")
err = os.Remove(name)
require.NoError(t, err, "remove temp file")
t.Cleanup(func() {
// The test might have created created and it may have already removed it,
// so we ignore the error.
_ = os.Remove(name)
})
return name
}
// CreateTemp is a convenience function for creating a temporary file, like
// os.CreateTemp, but it also registers a cleanup function to close and remove
// the file.
func CreateTemp(t *testing.T, dir, pattern string) *os.File {
t.Helper()
if dir == "" {
dir = t.TempDir()
}
f, err := os.CreateTemp(dir, pattern)
require.NoError(t, err, "create temp file")
t.Cleanup(func() {
_ = f.Close()
err = os.Remove(f.Name())
if err != nil {
t.Logf("CreateTemp: Cleanup: remove failed for %q: %v", f.Name(), err)
}
})
return f
}
// TempDirResolved returns t.TempDir() with symlinks resolved via
// filepath.EvalSymlinks. Tests that compare paths against values
// processed by EvalSymlinks (directly or indirectly) should use
// this helper so the comparison works on macOS, where the default
// temp dir lives under /var which is a symlink to /private/var.
//
// If EvalSymlinks errors (for example on Windows where the temp
// path may not resolve cleanly), the raw t.TempDir() result is
// returned. This matches the lenient behavior already used in
// existing tests.
func TempDirResolved(t *testing.T) string {
t.Helper()
dir := t.TempDir()
if resolved, err := filepath.EvalSymlinks(dir); err == nil {
return resolved
}
return dir
}