返回 DeepSeek-Reasonix
main_test.go
根目录 / cmd / reasonix-cli-launcher / main_test.go
1 package main
2
3 import (
4 "bytes"
5 "fmt"
6 "os"
7 "path/filepath"
8 "strings"
9 "testing"
10 )
11
12 func TestCLIHelperProcess(t *testing.T) {
13 if os.Getenv("REASONIX_CLI_LAUNCHER_HELPER") != "1" {
14 return
15 }
16 raw, _ := os.ReadFile("/dev/stdin")
17 args := os.Args[1:]
18 for i, arg := range args {
19 if arg == "--" {
20 args = args[i+1:]
21 break
22 }
23 }
24 fmt.Printf("args=%s input=%s", strings.Join(args, "|"), raw)
25 os.Exit(23)
26 }
27
28 func TestRunCLIPreservesArgumentsStreamsAndExitCode(t *testing.T) {
29 if os.PathSeparator == '\\' {
30 t.Skip("Unix fixture uses a shell executable path")
31 }
32 root := t.TempDir()
33 version := "v1.2.3"
34 dir := filepath.Join(root, "versions", version)
35 if err := os.MkdirAll(dir, 0o755); err != nil {
36 t.Fatal(err)
37 }
38 target := filepath.Join(dir, "reasonix-cli.exe")
39 script := "#!/bin/sh\nREASONIX_CLI_LAUNCHER_HELPER=1 exec \"" + os.Args[0] + "\" -test.run=TestCLIHelperProcess -- \"$@\"\n"
40 if err := os.WriteFile(target, []byte(script), 0o755); err != nil {
41 t.Fatal(err)
42 }
43 pointer := `{"schemaVersion":1,"activeVersion":"` + version + `","activeDir":"versions/` + version + `"}`
44 if err := os.WriteFile(filepath.Join(root, "current.json"), []byte(pointer), 0o644); err != nil {
45 t.Fatal(err)
46 }
47 launcher := filepath.Join(root, "reasonix-cli.exe")
48 if err := os.WriteFile(launcher, []byte("launcher"), 0o755); err != nil {
49 t.Fatal(err)
50 }
51 var stdout, stderr bytes.Buffer
52 code := runCLI(launcher, []string{"two words", "中文"}, strings.NewReader("pipe"), &stdout, &stderr)
53 if code != 23 || stdout.String() != "args=two words|中文 input=pipe" || stderr.Len() != 0 {
54 t.Fatalf("code=%d stdout=%q stderr=%q", code, stdout.String(), stderr.String())
55 }
56 }
57
58 func TestRunCLIFailsClosedOnInvalidPointer(t *testing.T) {
59 root := t.TempDir()
60 launcher := filepath.Join(root, "reasonix-cli.exe")
61 if err := os.WriteFile(launcher, []byte("launcher"), 0o755); err != nil {
62 t.Fatal(err)
63 }
64 if err := os.WriteFile(filepath.Join(root, "current.json"), []byte(`{"activeDir":"../../escape"}`), 0o644); err != nil {
65 t.Fatal(err)
66 }
67 var stderr bytes.Buffer
68 if code := runCLI(launcher, nil, nil, &bytes.Buffer{}, &stderr); code == 0 || !strings.Contains(stderr.String(), "resolve active CLI") {
69 t.Fatalf("code=%d stderr=%q", code, stderr.String())
70 }
71 }
72
72 lines GO