返回 DeepSeek-Reasonix
registry_windows_test.go
根目录 / desktop / internal / winuninstall / registry_windows_test.go
1 //go:build windows
2
3 package winuninstall
4
5 import (
6 "errors"
7 "fmt"
8 "os"
9 "testing"
10
11 "golang.org/x/sys/windows/registry"
12 )
13
14 func TestDeleteInstallLocationIfOwned(t *testing.T) {
15 tests := []struct {
16 name string
17 location string
18 wantDelete bool
19 }{
20 {name: "same root", location: `D:\Reasonix`, wantDelete: true},
21 {name: "quoted case variant", location: `"d:\reasonix\"`, wantDelete: true},
22 {name: "separate legacy install", location: `C:\Legacy\Reasonix`, wantDelete: false},
23 }
24
25 for i, tt := range tests {
26 t.Run(tt.name, func(t *testing.T) {
27 keyPath := fmt.Sprintf(`Software\ReasonixTests\winuninstall-%d-%d`, os.Getpid(), i)
28 key, _, err := registry.CreateKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE|registry.SET_VALUE)
29 if err != nil {
30 t.Fatal(err)
31 }
32 if err := key.SetStringValue("", tt.location); err != nil {
33 key.Close()
34 t.Fatal(err)
35 }
36 if err := key.SetStringValue("Installer Language", "1033"); err != nil {
37 key.Close()
38 t.Fatal(err)
39 }
40 if err := key.Close(); err != nil {
41 t.Fatal(err)
42 }
43 t.Cleanup(func() {
44 _ = registry.DeleteKey(registry.CURRENT_USER, keyPath)
45 })
46
47 if err := deleteInstallLocationIfOwned(keyPath, `D:\Reasonix`); err != nil {
48 t.Fatal(err)
49 }
50
51 key, err = registry.OpenKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE)
52 if err != nil {
53 t.Fatal(err)
54 }
55 defer key.Close()
56 gotLocation, _, locationErr := key.GetStringValue("")
57 if tt.wantDelete {
58 if !errors.Is(locationErr, registry.ErrNotExist) {
59 t.Fatalf("default install location still exists: value=%q err=%v", gotLocation, locationErr)
60 }
61 } else if locationErr != nil || gotLocation != tt.location {
62 t.Fatalf("separate install location = %q, %v; want %q", gotLocation, locationErr, tt.location)
63 }
64 if language, _, err := key.GetStringValue("Installer Language"); err != nil || language != "1033" {
65 t.Fatalf("named value = %q, %v; want preserved", language, err)
66 }
67 })
68 }
69 }
70
71 func TestDeleteInstallLocationIfOwnedIgnoresMissingKey(t *testing.T) {
72 keyPath := fmt.Sprintf(`Software\ReasonixTests\missing-%d`, os.Getpid())
73 _ = registry.DeleteKey(registry.CURRENT_USER, keyPath)
74 if err := deleteInstallLocationIfOwned(keyPath, `D:\Reasonix`); err != nil {
75 t.Fatal(err)
76 }
77 }
78
78 lines GO