返回 DeepSeek-Reasonix
main_test.go
根目录 / cmd / reasonix-launcher / main_test.go
1 package main
2
3 import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "reasonix/internal/installlayout"
9 )
10
11 func TestStripLegacyLaunchArgs(t *testing.T) {
12 got := stripLegacyLaunchArgs([]string{
13 "launch", "--detach", "--safe-mode", "--app", `C:\Old\reasonix-desktop.exe`, "--foo", "bar",
14 })
15 want := []string{"--foo", "bar"}
16 if len(got) != len(want) || got[0] != want[0] || got[1] != want[1] {
17 t.Fatalf("got %#v want %#v", got, want)
18 }
19 got = stripLegacyLaunchArgs([]string{"--app=ignored", "keep"})
20 if len(got) != 1 || got[0] != "keep" {
21 t.Fatalf("got %#v", got)
22 }
23 got = stripLegacyLaunchArgs([]string{"--", "--safe-mode", "x"})
24 if len(got) != 3 || got[0] != "--" {
25 t.Fatalf("separator not preserved: %#v", got)
26 }
27 }
28
29 func TestResolveDesktopPathUsesCurrentJSON(t *testing.T) {
30 root := t.TempDir()
31 src := t.TempDir()
32 version := "v1.20.0"
33 members := make([]installlayout.Member, 0, 3)
34 for _, name := range installlayout.AllowedVersionMembers() {
35 path := filepath.Join(src, name)
36 if err := os.WriteFile(path, []byte("bin-"+name), 0o755); err != nil {
37 t.Fatal(err)
38 }
39 members = append(members, installlayout.Member{Name: name, Path: path})
40 }
41 if err := installlayout.ActivateVersion(installlayout.ActivationRequest{
42 InstallRoot: root,
43 Version: version,
44 RequestID: "launcher-test",
45 Members: members,
46 }); err != nil {
47 t.Fatal(err)
48 }
49 path, err := resolveDesktopPath(root)
50 if err != nil {
51 t.Fatal(err)
52 }
53 want := filepath.Join(root, "versions", version, installlayout.DesktopBinaryName())
54 if path != want {
55 t.Fatalf("path=%s want=%s", path, want)
56 }
57 }
58
59 func TestResolveDesktopPathFallsBackToFlatSibling(t *testing.T) {
60 root := t.TempDir()
61 flat := filepath.Join(root, installlayout.DesktopBinaryName())
62 if err := os.WriteFile(flat, []byte("flat"), 0o755); err != nil {
63 t.Fatal(err)
64 }
65 path, err := resolveDesktopPath(root)
66 if err != nil {
67 t.Fatal(err)
68 }
69 if path != flat {
70 t.Fatalf("path=%s want=%s", path, flat)
71 }
72 }
73
74 func TestResolveDesktopPathRejectsCorruptPointer(t *testing.T) {
75 root := t.TempDir()
76 // Write a current.json that fails schema validation.
77 if err := os.WriteFile(filepath.Join(root, installlayout.CurrentFileName), []byte(`{"schemaVersion":99}`), 0o644); err != nil {
78 t.Fatal(err)
79 }
80 // Even with a flat sibling, a corrupt pointer must fail closed. Falling back
81 // would silently run a stale executable after a partially observed update.
82 if err := os.WriteFile(filepath.Join(root, installlayout.DesktopBinaryName()), []byte("x"), 0o755); err != nil {
83 t.Fatal(err)
84 }
85 if path, err := resolveDesktopPath(root); err == nil {
86 t.Fatalf("corrupt current.json resolved stale flat desktop %q", path)
87 }
88 }
89
89 lines GO