mirror of
https://github.com/coder/coder.git
synced 2026-06-03 04:58:23 +00:00
5e701d3075
`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
74 lines
1.9 KiB
Go
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
|
|
}
|