返回 DeepSeek-Reasonix
remote_prefs_test.go
根目录 / desktop / remote_prefs_test.go
1 package main
2
3 import (
4 "encoding/json"
5 "os"
6 "path/filepath"
7 "testing"
8 "time"
9
10 "reasonix/internal/config"
11 )
12
13 func TestRemotePrefsFailedSaveDoesNotPublishCache(t *testing.T) {
14 root := t.TempDir()
15 blocked := filepath.Join(root, "not-a-directory")
16 if err := os.WriteFile(blocked, []byte("blocked"), 0o600); err != nil {
17 t.Fatal(err)
18 }
19 t.Setenv("REASONIX_STATE_HOME", blocked)
20
21 if err := setRemoteSessionTitleOverride("box", "~/app", "session", "unsaved"); err == nil {
22 t.Fatal("setRemoteSessionTitleOverride unexpectedly succeeded")
23 }
24 if got := remoteSessionTitleOverride("box", "~/app", "session"); got != "" {
25 t.Fatalf("failed save published cached title %q", got)
26 }
27 }
28
29 func TestRemotePrefsMutationPreservesExternalWrites(t *testing.T) {
30 root := t.TempDir()
31 t.Setenv("REASONIX_STATE_HOME", root)
32 if err := setRemoteSessionTitleOverride("box", "~/app", "session-a", "Local title"); err != nil {
33 t.Fatal(err)
34 }
35 // Exercise the ordinary read path before another desktop instance replaces
36 // the file with a newer snapshot.
37 if got := remoteSessionTitleOverride("box", "~/app", "session-a"); got != "Local title" {
38 t.Fatalf("warm title = %q", got)
39 }
40
41 path := remotePrefsPath()
42 data, err := os.ReadFile(path)
43 if err != nil {
44 t.Fatal(err)
45 }
46 var external remotePrefs
47 if err := json.Unmarshal(data, &external); err != nil {
48 t.Fatal(err)
49 }
50 external.LastHostID = "external-host"
51 external.SessionTitles[remoteSessionPrefKey("box", "~/app", "session-b")] = "External title"
52 data, err = json.Marshal(external)
53 if err != nil {
54 t.Fatal(err)
55 }
56 unlock, err := config.LockConfigFileEdits(path)
57 if err != nil {
58 t.Fatal(err)
59 }
60 if err := os.WriteFile(path, data, 0o600); err != nil {
61 unlock()
62 t.Fatal(err)
63 }
64 result := make(chan error, 1)
65 go func() {
66 result <- setRemoteSessionPinned("box", "~/app", "session-a", true)
67 }()
68 select {
69 case err := <-result:
70 unlock()
71 t.Fatalf("remote prefs mutation bypassed the cross-process lock: %v", err)
72 case <-time.After(20 * time.Millisecond):
73 }
74 unlock()
75 if err := <-result; err != nil {
76 t.Fatal(err)
77 }
78 got := loadRemotePrefs()
79 if got.LastHostID != "external-host" || got.SessionTitles[remoteSessionPrefKey("box", "~/app", "session-b")] != "External title" {
80 t.Fatalf("mutation overwrote external fields: %+v", got)
81 }
82 }
83
83 lines GO