返回 DeepSeek-Reasonix
remote_tab_rejection_commit_test.go
根目录 / desktop / remote_tab_rejection_commit_test.go
1 package main
2
3 import (
4 "strings"
5 "testing"
6 "time"
7 )
8
9 func TestRemoteResumeFailurePublishesRestoredIdentity(t *testing.T) {
10 const oldPath = "/remote/sessions/s1.jsonl"
11 const targetPath = "/remote/sessions/s2.jsonl"
12 fs := newFakeServe(t, "s3cret", []serveSessionEntry{
13 {Name: "s1", Path: oldPath, Title: "First", Current: true},
14 {Name: "s2", Path: targetPath, Title: "Second"},
15 })
16 kernel := &fakeRemoteKernel{
17 statuses: []RemoteConnectionStatusView{{HostID: "box", State: "connected"}},
18 ensureView: RemoteServerView{HostID: "box", State: "ready", LocalURL: fs.server.URL},
19 ensureToken: "s3cret",
20 }
21 seedBridgeTestHost(t, "box")
22 a := &App{remoteRuntime: kernel}
23 cleanupRemoteTabPumps(t, a)
24 type identity struct{ name, path, route, title string }
25 observed := make(chan identity, 1)
26 a.remoteEventHook = func(name string, payload any) {
27 state, ok := payload.(RemoteTabStateView)
28 if !ok || !strings.Contains(state.Error, "already leased") {
29 return
30 }
31 tabID := strings.TrimSuffix(strings.TrimPrefix(name, "remote-tab:"), ":state")
32 a.remoteTabMu.Lock()
33 tab := a.remoteTabs[tabID]
34 got := identity{tab.session.name, tab.session.path, tab.routing.currentPath, tab.topicTitle}
35 a.remoteTabMu.Unlock()
36 observed <- got
37 }
38 openReadyRemoteTab(t, a, RemoteTabOpenOptions{SessionName: "s1", SessionPath: oldPath, SessionTitle: "First"})
39 fs.mu.Lock()
40 fs.failEnter = "session is already leased by another process"
41 fs.mu.Unlock()
42 if _, err := a.OpenRemoteProjectTab("box", "~/app", RemoteTabOpenOptions{
43 SessionName: "s2", SessionPath: targetPath, SessionTitle: "Second",
44 }); err != nil {
45 t.Fatal(err)
46 }
47 select {
48 case got := <-observed:
49 want := identity{"s1", oldPath, oldPath, "First"}
50 if got != want {
51 t.Fatalf("failure publication identity = %+v, want %+v", got, want)
52 }
53 case <-time.After(5 * time.Second):
54 t.Fatal("rejection did not publish a failure")
55 }
56 }
57
57 lines GO