Files
wehub-resource-sync a06f331eb8
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
install-script / powershell-syntax (push) Has been cancelled
install-script / install (macos-14) (push) Has been cancelled
install-script / install (ubuntu-latest) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:33:42 +08:00

220 lines
6.5 KiB
Go

package platform
import (
"path/filepath"
"testing"
)
// clearXDG unsets every XDG base-directory variable so a test starts
// from a known clean slate; t.Setenv restores the prior value at the
// end of the test.
func clearXDG(t *testing.T) {
t.Helper()
for _, v := range []string{"XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_CACHE_HOME"} {
t.Setenv(v, "")
}
}
// TestHome verifies the unified per-user directory is $HOME/.gortex.
func TestHome(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
if got, want := Home(), filepath.Join(home, ".gortex"); got != want {
t.Errorf("Home() = %s, want %s", got, want)
}
}
// TestConfigDir_HonorsXDGConfigHome verifies an absolute $XDG_CONFIG_HOME
// relocates config to the standard XDG location.
func TestConfigDir_HonorsXDGConfigHome(t *testing.T) {
clearXDG(t)
xdg := t.TempDir()
t.Setenv("XDG_CONFIG_HOME", xdg)
want := filepath.Join(xdg, "gortex")
if got := ConfigDir(); got != want {
t.Errorf("ConfigDir() = %s, want %s", got, want)
}
}
// TestConfigDir_UnsetFallback verifies the env-unset default is the
// unified $HOME/.gortex directory.
func TestConfigDir_UnsetFallback(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
want := filepath.Join(home, ".gortex")
if got := ConfigDir(); got != want {
t.Errorf("ConfigDir() = %s, want %s (unified default)", got, want)
}
}
// TestDataDir_HonorsXDGDataHome verifies an absolute $XDG_DATA_HOME
// relocates data to the standard XDG location.
func TestDataDir_HonorsXDGDataHome(t *testing.T) {
clearXDG(t)
xdg := t.TempDir()
t.Setenv("XDG_DATA_HOME", xdg)
want := filepath.Join(xdg, "gortex")
if got := DataDir(); got != want {
t.Errorf("DataDir() = %s, want %s", got, want)
}
}
// TestDataDir_UnsetFallback verifies the env-unset default collapses
// into the unified $HOME/.gortex directory.
func TestDataDir_UnsetFallback(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
want := filepath.Join(home, ".gortex")
if got := DataDir(); got != want {
t.Errorf("DataDir() = %s, want %s (unified default)", got, want)
}
}
// TestTelemetryDir verifies the telemetry buffer lives under DataDir, both for
// the unified default and an absolute $XDG_DATA_HOME relocation.
func TestTelemetryDir(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
if got, want := TelemetryDir(), filepath.Join(home, ".gortex", "telemetry"); got != want {
t.Errorf("TelemetryDir() = %s, want %s (unified default)", got, want)
}
xdg := t.TempDir()
t.Setenv("XDG_DATA_HOME", xdg)
if got, want := TelemetryDir(), filepath.Join(xdg, "gortex", "telemetry"); got != want {
t.Errorf("TelemetryDir() = %s, want %s (XDG)", got, want)
}
}
// TestCacheDir_HonorsXDGCacheHome verifies an absolute $XDG_CACHE_HOME
// relocates cache to the standard XDG location.
func TestCacheDir_HonorsXDGCacheHome(t *testing.T) {
clearXDG(t)
xdg := t.TempDir()
t.Setenv("XDG_CACHE_HOME", xdg)
want := filepath.Join(xdg, "gortex")
if got := CacheDir(); got != want {
t.Errorf("CacheDir() = %s, want %s", got, want)
}
}
// TestCacheDir_UnsetFallback verifies the env-unset default is the
// cache/ sub-directory inside the unified ~/.gortex tree.
func TestCacheDir_UnsetFallback(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
want := filepath.Join(home, ".gortex", "cache")
if got := CacheDir(); got != want {
t.Errorf("CacheDir() = %s, want %s (unified default)", got, want)
}
}
// TestOSCacheDir_ConvergesWithCacheDir verifies OSCacheDir now resolves
// to the same place as CacheDir under both an XDG override and the
// unified default.
func TestOSCacheDir_ConvergesWithCacheDir(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
if got, want := OSCacheDir(), CacheDir(); got != want {
t.Errorf("OSCacheDir() = %s, want %s (must converge with CacheDir)", got, want)
}
if got, want := OSCacheDir(), filepath.Join(home, ".gortex", "cache"); got != want {
t.Errorf("OSCacheDir() unified = %s, want %s", got, want)
}
xdg := t.TempDir()
t.Setenv("XDG_CACHE_HOME", xdg)
if got, want := OSCacheDir(), filepath.Join(xdg, "gortex"); got != want {
t.Errorf("OSCacheDir() with XDG_CACHE_HOME = %s, want %s", got, want)
}
}
// TestPurposeDirs_UnsetFallback verifies the store / models / memories
// sub-directories hang off the unified ~/.gortex tree by default.
func TestPurposeDirs_UnsetFallback(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
cases := []struct {
name string
got func() string
want string
}{
{"store", StoreDir, filepath.Join(home, ".gortex", "store")},
{"models", ModelsDir, filepath.Join(home, ".gortex", "models")},
{"memories", MemoriesDir, filepath.Join(home, ".gortex", "memories")},
}
for _, tc := range cases {
if got := tc.got(); got != tc.want {
t.Errorf("%sDir() = %s, want %s", tc.name, got, tc.want)
}
}
}
// TestPurposeDirs_HonorXDGDataHome verifies the purpose sub-directories
// follow an absolute $XDG_DATA_HOME into the standard XDG layout.
func TestPurposeDirs_HonorXDGDataHome(t *testing.T) {
clearXDG(t)
xdg := t.TempDir()
t.Setenv("XDG_DATA_HOME", xdg)
cases := []struct {
name string
got func() string
want string
}{
{"store", StoreDir, filepath.Join(xdg, "gortex", "store")},
{"models", ModelsDir, filepath.Join(xdg, "gortex", "models")},
{"memories", MemoriesDir, filepath.Join(xdg, "gortex", "memories")},
}
for _, tc := range cases {
if got := tc.got(); got != tc.want {
t.Errorf("%sDir() = %s, want %s", tc.name, got, tc.want)
}
}
}
// TestNonAbsoluteXDGIgnored verifies a relative XDG_*_HOME value is
// ignored, as the XDG Base Directory specification mandates — the
// resolver falls back to the unified $HOME/.gortex default instead.
func TestNonAbsoluteXDGIgnored(t *testing.T) {
clearXDG(t)
home := t.TempDir()
t.Setenv("HOME", home)
cases := []struct {
name string
envVar string
relVal string
got func() string
want string
}{
{"config", "XDG_CONFIG_HOME", "relative/config", ConfigDir, filepath.Join(home, ".gortex")},
{"data", "XDG_DATA_HOME", "relative/data", DataDir, filepath.Join(home, ".gortex")},
{"cache", "XDG_CACHE_HOME", "relative/cache", CacheDir, filepath.Join(home, ".gortex", "cache")},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
t.Setenv(tc.envVar, tc.relVal)
if got := tc.got(); got != tc.want {
t.Errorf("%s with relative %s=%q: got %s, want %s (relative value must be ignored)",
tc.name, tc.envVar, tc.relVal, got, tc.want)
}
})
}
}