返回 DeepSeek-Reasonix
terminal_process_unix_test.go
根目录 / desktop / terminal_process_unix_test.go
1 //go:build !windows
2
3 package main
4
5 import (
6 "bytes"
7 "os"
8 "os/exec"
9 "testing"
10 "time"
11 )
12
13 func TestUnixTerminalProcessPTYSmoke(t *testing.T) {
14 shell, err := exec.LookPath("sh")
15 if err != nil {
16 t.Skipf("sh is unavailable: %v", err)
17 }
18 proc, err := startTerminalProcess(terminalStartSpec{
19 command: commandForShellPath(shell, "sh"),
20 dir: t.TempDir(),
21 env: terminalEnvironment([]string{"PATH=" + os.Getenv("PATH"), "HOME=" + t.TempDir()}),
22 cols: defaultTerminalColumns,
23 rows: defaultTerminalRows,
24 })
25 if err != nil {
26 t.Fatal(err)
27 }
28 defer proc.Close()
29
30 if err := proc.Resize(100, 30); err != nil {
31 t.Fatalf("resize PTY: %v", err)
32 }
33
34 const marker = "reasonix-pty-smoke"
35 readResult := make(chan error, 1)
36 markerSeen := make(chan struct{})
37 go func() {
38 var output bytes.Buffer
39 buf := make([]byte, 4096)
40 seen := false
41 for {
42 n, readErr := proc.Read(buf)
43 if n > 0 {
44 output.Write(buf[:n])
45 if !seen && bytes.Contains(output.Bytes(), []byte(marker)) {
46 seen = true
47 close(markerSeen)
48 }
49 }
50 if readErr != nil {
51 if !seen {
52 readResult <- readErr
53 } else {
54 readResult <- nil
55 }
56 return
57 }
58 }
59 }()
60
61 if _, err := proc.Write([]byte("printf '" + marker + "\\n'\n")); err != nil {
62 t.Fatalf("write PTY command: %v", err)
63 }
64 select {
65 case <-markerSeen:
66 case <-time.After(10 * time.Second):
67 t.Fatal("timed out waiting for PTY output")
68 }
69
70 if _, err := proc.Write([]byte("exit\n")); err != nil {
71 t.Fatalf("write PTY exit: %v", err)
72 }
73 waitResult := make(chan error, 1)
74 go func() {
75 _, waitErr := proc.Wait()
76 waitResult <- waitErr
77 }()
78 select {
79 case err := <-waitResult:
80 if err != nil {
81 t.Fatalf("wait for PTY exit: %v", err)
82 }
83 case <-time.After(10 * time.Second):
84 t.Fatal("timed out waiting for PTY process exit")
85 }
86 select {
87 case err := <-readResult:
88 if err != nil {
89 t.Fatalf("read PTY output: %v", err)
90 }
91 case <-time.After(10 * time.Second):
92 t.Fatal("timed out waiting for PTY reader to finish")
93 }
94 }
95
95 lines GO