返回 DeepSeek-Reasonix
current_test.go
根目录 / internal / installlayout / current_test.go
1 package installlayout
2
3 import (
4 "os"
5 "path/filepath"
6 "runtime"
7 "testing"
8 )
9
10 func TestDecodeCurrentAcceptsSchema1(t *testing.T) {
11 raw := []byte(`{
12 "schemaVersion": 1,
13 "activeVersion": "v1.20.0",
14 "activeDir": "versions/v1.20.0"
15 }
16 `)
17 ptr, err := DecodeCurrent(raw)
18 if err != nil {
19 t.Fatal(err)
20 }
21 if ptr.ActiveVersion != "v1.20.0" || ptr.ActiveDir != "versions/v1.20.0" {
22 t.Fatalf("unexpected pointer: %+v", ptr)
23 }
24 }
25
26 func TestDecodeCurrentRejectsUnknownSchemaAndTraversal(t *testing.T) {
27 cases := []string{
28 `{"schemaVersion":2,"activeVersion":"v1.20.0","activeDir":"versions/v1.20.0"}`,
29 `{"schemaVersion":1,"activeVersion":"../evil","activeDir":"versions/v1.20.0"}`,
30 `{"schemaVersion":1,"activeVersion":"v1.20.0","activeDir":"/abs/path"}`,
31 `{"schemaVersion":1,"activeVersion":"v1.20.0","activeDir":"versions/../etc"}`,
32 `{"schemaVersion":1,"activeVersion":"v1.20.0","activeDir":"versions/v1.19.0"}`,
33 `{"schemaVersion":1,"activeVersion":"v1.20.0","activeDir":"versions/v1.20.0","extra":1}`,
34 }
35 for _, raw := range cases {
36 if _, err := DecodeCurrent([]byte(raw)); err == nil {
37 t.Fatalf("expected rejection for %s", raw)
38 }
39 }
40 }
41
42 func TestWriteAndReadCurrentRoundTrip(t *testing.T) {
43 root := t.TempDir()
44 version := "v1.20.0"
45 dir := filepath.Join(root, "versions", version)
46 if err := os.MkdirAll(dir, 0o755); err != nil {
47 t.Fatal(err)
48 }
49 // Create a dummy desktop binary so ValidateActiveDir only needs the dir.
50 if err := os.WriteFile(filepath.Join(dir, DesktopBinaryName()), []byte("x"), 0o755); err != nil {
51 t.Fatal(err)
52 }
53 ptr := CurrentPointer{SchemaVersion: 1, ActiveVersion: version, ActiveDir: VersionDirRelative(version)}
54 if err := WriteCurrent(root, ptr); err != nil {
55 t.Fatal(err)
56 }
57 got, err := ReadCurrent(root)
58 if err != nil {
59 t.Fatal(err)
60 }
61 if got.ActiveVersion != version {
62 t.Fatalf("got %q", got.ActiveVersion)
63 }
64 }
65
66 func TestValidateActiveDirRejectsSymlinkVersionDir(t *testing.T) {
67 if runtime.GOOS == "windows" {
68 t.Skip("symlink privilege varies on Windows CI")
69 }
70 root := t.TempDir()
71 outside := t.TempDir()
72 link := filepath.Join(root, "versions", "v1.20.0")
73 if err := os.MkdirAll(filepath.Dir(link), 0o755); err != nil {
74 t.Fatal(err)
75 }
76 if err := os.Symlink(outside, link); err != nil {
77 t.Fatal(err)
78 }
79 err := ValidateActiveDir(root, "v1.20.0", "versions/v1.20.0")
80 if err == nil {
81 t.Fatal("expected symlink rejection")
82 }
83 }
84
85 func TestValidateVersionName(t *testing.T) {
86 ok := []string{"v1.20.0", "v1.20.0-preview.1", "v1.19.1"}
87 for _, v := range ok {
88 if err := ValidateVersionName(v); err != nil {
89 t.Fatalf("%s: %v", v, err)
90 }
91 }
92 bad := []string{"", "1.20.0", "v1/20", "v1..20", "v1.20.0/../x", `v1.20.0\x`}
93 for _, v := range bad {
94 if err := ValidateVersionName(v); err == nil {
95 t.Fatalf("expected rejection for %q", v)
96 }
97 }
98 }
99 func TestResolveInstallRootFromVersionedDesktop(t *testing.T) {
100 root := t.TempDir()
101 version := "v1.20.0"
102 dir := filepath.Join(root, "versions", version)
103 if err := os.MkdirAll(dir, 0o755); err != nil {
104 t.Fatal(err)
105 }
106 desktop := filepath.Join(dir, DesktopBinaryName())
107 if err := os.WriteFile(desktop, []byte("x"), 0o755); err != nil {
108 t.Fatal(err)
109 }
110 if err := WriteCurrent(root, CurrentPointer{SchemaVersion: 1, ActiveVersion: version, ActiveDir: VersionDirRelative(version)}); err != nil {
111 t.Fatal(err)
112 }
113 got, err := ResolveInstallRoot(desktop)
114 if err != nil || got != root {
115 t.Fatalf("got %q err=%v want %q", got, err, root)
116 }
117 }
118
118 lines GO