返回 DeepSeek-Reasonix
home_test.go
根目录 / internal / testenv / home_test.go
1 package testenv
2
3 import (
4 "os"
5 "path/filepath"
6 "strings"
7 "testing"
8 )
9
10 func TestIsolateUserStateRedirectsAndRestoresCallerEnvironment(t *testing.T) {
11 callerHome := t.TempDir()
12 callerEnvironment := map[string]string{
13 "HOME": callerHome,
14 "USERPROFILE": callerHome,
15 "XDG_CONFIG_HOME": filepath.Join(callerHome, "caller-config"),
16 "XDG_CACHE_HOME": filepath.Join(callerHome, "caller-xdg-cache"),
17 "XDG_STATE_HOME": filepath.Join(callerHome, "caller-xdg-state"),
18 "AppData": filepath.Join(callerHome, "caller-appdata"),
19 "LocalAppData": filepath.Join(callerHome, "caller-local-appdata"),
20 "REASONIX_HOME": filepath.Join(callerHome, "explicit-reasonix-home"),
21 "REASONIX_STATE_HOME": filepath.Join(callerHome, "caller-state"),
22 "REASONIX_CACHE_HOME": filepath.Join(callerHome, "caller-cache"),
23 }
24 for key, value := range callerEnvironment {
25 t.Setenv(key, value)
26 }
27
28 cleanup, err := IsolateUserState()
29 if err != nil {
30 t.Fatal(err)
31 }
32 t.Cleanup(cleanup)
33 isolateHome := os.Getenv("HOME")
34 if isolateHome == "" || isolateHome == callerHome {
35 t.Fatalf("HOME = %q, want a disposable home distinct from caller %q", isolateHome, callerHome)
36 }
37 if rel, err := filepath.Rel(callerHome, isolateHome); err != nil || filepath.IsAbs(rel) || rel == ".." || strings.HasPrefix(rel, ".."+string(os.PathSeparator)) {
38 t.Fatalf("isolated home %q is not contained by caller home %q", isolateHome, callerHome)
39 }
40 wantIsolatedEnvironment := map[string]string{
41 "HOME": isolateHome,
42 "USERPROFILE": isolateHome,
43 "XDG_CONFIG_HOME": filepath.Join(isolateHome, ".config"),
44 "XDG_CACHE_HOME": filepath.Join(isolateHome, ".cache"),
45 "XDG_STATE_HOME": filepath.Join(isolateHome, ".local", "state"),
46 "AppData": filepath.Join(isolateHome, "AppData", "Roaming"),
47 "LocalAppData": filepath.Join(isolateHome, "AppData", "Local"),
48 }
49 for key, want := range wantIsolatedEnvironment {
50 if got := os.Getenv(key); got != want {
51 t.Errorf("%s inside isolated test process = %q, want %q", key, got, want)
52 }
53 }
54 for _, key := range []string{"REASONIX_HOME", "REASONIX_STATE_HOME", "REASONIX_CACHE_HOME"} {
55 if _, ok := os.LookupEnv(key); ok {
56 t.Fatalf("%s remained set inside isolated test process", key)
57 }
58 }
59
60 cleanup()
61 for key, want := range callerEnvironment {
62 if got := os.Getenv(key); got != want {
63 t.Errorf("%s after cleanup = %q, want %q", key, got, want)
64 }
65 }
66 if _, err := os.Stat(isolateHome); !os.IsNotExist(err) {
67 t.Fatalf("isolated home still exists after cleanup: %v", err)
68 }
69 }
70
70 lines GO