1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
package cli
import (
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
)
func TestDarwinFishUploadClient(t *testing.T) {
fish, err := exec.LookPath("fish")
if err != nil {
t.Skip("fish not installed")
}
dir := t.TempDir()
binDir := filepath.Join(dir, "bin")
bodyDir := filepath.Join(dir, "bodies")
configDir := filepath.Join(dir, "config")
tokenDir := filepath.Join(configDir, "goprecords-upload-mymac")
for _, path := range []string{binDir, bodyDir, tokenDir} {
if err := os.MkdirAll(path, 0o755); err != nil {
t.Fatal(err)
}
}
recordsPath := filepath.Join(dir, "records")
if err := os.WriteFile(recordsPath, []byte("records-body\n"), 0o644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(tokenDir, "token"), []byte("secret-token\n"), 0o600); err != nil {
t.Fatal(err)
}
writeExecutable(t, filepath.Join(binDir, "curl"), `#!/bin/sh
for arg do
if [ "$prev" = "--data-binary" ]; then data=${arg#@}; fi
prev=$arg
url=$arg
done
kind=${url##*/}
printf '%s\n' "$*" >> "$GOPRECORDS_TEST_LOG"
cp "$data" "$GOPRECORDS_TEST_BODY_DIR/$kind"
`)
writeExecutable(t, filepath.Join(binDir, "uprecords"), `#!/bin/sh
if [ "$1" = "-a" ] && [ "$2" = "-m" ]; then
printf 'all records\n'
else
printf '%s\n' '-> current boot'
fi
`)
writeExecutable(t, filepath.Join(binDir, "sw_vers"), `#!/bin/sh
printf 'ProductName: macOS\nProductVersion: 14.0\n'
`)
writeExecutable(t, filepath.Join(binDir, "sysctl"), `#!/bin/sh
printf 'hw.model: MacBookPro\nhw.ncpu: 8\nhw.machine: arm64\n'
`)
logPath := filepath.Join(dir, "curl.log")
cmd := exec.Command(fish, "goprecords-upload-client-darwin.fish")
cmd.Dir = filepath.Join("..", "..", "scripts")
cmd.Env = append(os.Environ(),
"PATH="+binDir+string(os.PathListSeparator)+os.Getenv("PATH"),
"HOME="+dir,
"XDG_CONFIG_HOME="+configDir,
"GOPRECORDS_HOST=mymac",
"GOPRECORDS_BASE_URL=https://example.test",
"GOPRECORDS_RECORDS_FILE="+recordsPath,
"GOPRECORDS_TEST_LOG="+logPath,
"GOPRECORDS_TEST_BODY_DIR="+bodyDir,
)
out, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("fish client failed: %v\n%s", err, out)
}
logData, err := os.ReadFile(logPath)
if err != nil {
t.Fatal(err)
}
logText := string(logData)
if got := strings.Count(logText, "Authorization: Bearer secret-token"); got != 5 {
t.Fatalf("Authorization header count = %d, want 5\n%s", got, logText)
}
for _, kind := range []string{"records", "txt", "cur.txt", "os.txt", "cpuinfo.txt"} {
if !strings.Contains(logText, "https://example.test/upload/mymac/"+kind) {
t.Fatalf("missing upload for %s\n%s", kind, logText)
}
if _, err := os.Stat(filepath.Join(bodyDir, kind)); err != nil {
t.Fatalf("missing body for %s: %v", kind, err)
}
}
}
func writeExecutable(t *testing.T, path, content string) {
t.Helper()
if err := os.WriteFile(path, []byte(content), 0o755); err != nil {
t.Fatal(err)
}
}
|