72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
// Package harness provides reusable black-box integration helpers shared by
|
|
// inter-service suites.
|
|
package harness
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
var binaryCache struct {
|
|
mu sync.Mutex
|
|
paths map[string]string
|
|
}
|
|
|
|
// BuildBinary builds packagePath once per test process and returns the
|
|
// resulting executable path.
|
|
func BuildBinary(t testing.TB, name string, packagePath string) string {
|
|
t.Helper()
|
|
|
|
root := repositoryRoot(t)
|
|
key := name + ":" + packagePath
|
|
|
|
binaryCache.mu.Lock()
|
|
if binaryCache.paths == nil {
|
|
binaryCache.paths = make(map[string]string)
|
|
}
|
|
if path, ok := binaryCache.paths[key]; ok {
|
|
binaryCache.mu.Unlock()
|
|
return path
|
|
}
|
|
|
|
outputDir := filepath.Join(os.TempDir(), "galaxy-integration-binaries")
|
|
if err := os.MkdirAll(outputDir, 0o755); err != nil {
|
|
binaryCache.mu.Unlock()
|
|
t.Fatalf("create integration binary directory: %v", err)
|
|
}
|
|
|
|
outputPath := filepath.Join(outputDir, sanitizeBinaryName(key))
|
|
cmd := exec.Command("go", "build", "-o", outputPath, packagePath)
|
|
cmd.Dir = root
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
binaryCache.mu.Unlock()
|
|
t.Fatalf("build %s: %v\n%s", packagePath, err, output)
|
|
}
|
|
|
|
binaryCache.paths[key] = outputPath
|
|
binaryCache.mu.Unlock()
|
|
return outputPath
|
|
}
|
|
|
|
func repositoryRoot(t testing.TB) string {
|
|
t.Helper()
|
|
|
|
_, file, _, ok := runtime.Caller(0)
|
|
if !ok {
|
|
t.Fatal("resolve harness repository root: runtime caller is unavailable")
|
|
}
|
|
|
|
return filepath.Clean(filepath.Join(filepath.Dir(file), "..", "..", ".."))
|
|
}
|
|
|
|
func sanitizeBinaryName(value string) string {
|
|
replacer := strings.NewReplacer("/", "_", "\\", "_", ":", "_", ".", "_")
|
|
return replacer.Replace(value)
|
|
}
|