summaryrefslogtreecommitdiff
path: root/internal/cli
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cli')
-rw-r--r--internal/cli/upload_client_darwin_script_test.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/internal/cli/upload_client_darwin_script_test.go b/internal/cli/upload_client_darwin_script_test.go
new file mode 100644
index 0000000..6505b23
--- /dev/null
+++ b/internal/cli/upload_client_darwin_script_test.go
@@ -0,0 +1,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)
+ }
+}