diff options
Diffstat (limited to 'internal/cli/upload_client_darwin_script_test.go')
| -rw-r--r-- | internal/cli/upload_client_darwin_script_test.go | 101 |
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) + } +} |
