返回 DeepSeek-Reasonix
windows_payload_test.go
根目录 / desktop / cmd / sign / windows_payload_test.go
1 package main
2
3 import (
4 "os"
5 "path/filepath"
6 "runtime"
7 "slices"
8 "testing"
9
10 "reasonix/desktop/internal/update"
11 )
12
13 func writeWindowsPayloadDir(t *testing.T, treeNames []string) string {
14 t.Helper()
15 dir := t.TempDir()
16 for _, name := range update.WindowsPayloadFileNames() {
17 if err := os.WriteFile(filepath.Join(dir, name), []byte("payload:"+name), 0o700); err != nil {
18 t.Fatal(err)
19 }
20 }
21 for _, name := range treeNames {
22 path := filepath.Join(dir, filepath.FromSlash(name))
23 if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
24 t.Fatal(err)
25 }
26 if err := os.WriteFile(path, []byte("payload:"+name), 0o644); err != nil {
27 t.Fatal(err)
28 }
29 }
30 return dir
31 }
32
33 func TestGenWindowsPayloadManifestWalksShellTree(t *testing.T) {
34 treeNames := []string{"app/Reasonix.exe", "app/resources/app.asar", "app/locales/en-US.pak", "app/d3dcompiler_47.dll"}
35 dir := writeWindowsPayloadDir(t, treeNames)
36 if err := genWindowsPayloadManifest(dir, "v2.3.4"); err != nil {
37 t.Fatal(err)
38 }
39 b, err := os.ReadFile(filepath.Join(dir, update.WindowsPayloadManifestName))
40 if err != nil {
41 t.Fatal(err)
42 }
43 hashes, err := update.DecodeWindowsPayloadManifest(b, "v2.3.4")
44 if err != nil {
45 t.Fatal(err)
46 }
47 if len(hashes) != len(update.WindowsPayloadFileNames())+len(treeNames) {
48 t.Fatalf("manifest members = %d, want %d", len(hashes), len(update.WindowsPayloadFileNames())+len(treeNames))
49 }
50 for _, name := range append(update.WindowsPayloadFileNames(), treeNames...) {
51 if want := update.WindowsPayloadSHA256([]byte("payload:" + name)); hashes[name] != want {
52 t.Fatalf("manifest hash for %s = %q, want %q", name, hashes[name], want)
53 }
54 }
55 want := append([]string{"reasonix-cli.exe", "reasonix-desktop.exe", "reasonix-update-helper.exe"}, treeNames...)
56 slices.Sort(want)
57 if got := update.WindowsPayloadVersionMembers(hashes); !slices.Equal(got, want) {
58 t.Fatalf("version members = %v, want %v", got, want)
59 }
60 }
61
62 func TestGenWindowsPayloadManifestRejectsSymlinkInShellTree(t *testing.T) {
63 if runtime.GOOS == "windows" {
64 t.Skip("symlink privilege varies on Windows CI")
65 }
66 dir := writeWindowsPayloadDir(t, []string{"app/Reasonix.exe"})
67 if err := os.Symlink(filepath.Join(dir, "reasonix-cli.exe"), filepath.Join(dir, "app", "linked.dll")); err != nil {
68 t.Fatal(err)
69 }
70 if err := genWindowsPayloadManifest(dir, "v2.3.4"); err == nil {
71 t.Fatal("symlink inside app/ was accepted")
72 }
73 if _, err := os.Stat(filepath.Join(dir, update.WindowsPayloadManifestName)); !os.IsNotExist(err) {
74 t.Fatalf("manifest was written despite the rejected tree: %v", err)
75 }
76 }
77
77 lines GO