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