155 lines
3.7 KiB
Go
155 lines
3.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestRunBuildBuildsArtifactFromManifest(t *testing.T) {
|
|
projectDir := t.TempDir()
|
|
writeBuildFixture(t, projectDir, "demo-mcp", `
|
|
module example.com/demo
|
|
|
|
go 1.25.0
|
|
`, `
|
|
binary_name = "demo-mcp"
|
|
|
|
[build]
|
|
main_package = "./cmd/demo-mcp"
|
|
output_dir = "build"
|
|
version_var = "main.version"
|
|
`, `
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
var version = "dev"
|
|
|
|
func main() {
|
|
fmt.Print(version)
|
|
}
|
|
`)
|
|
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
err := run([]string{
|
|
"build",
|
|
"--manifest-dir", projectDir,
|
|
"--goos", runtime.GOOS,
|
|
"--goarch", runtime.GOARCH,
|
|
"--version", "1.2.3",
|
|
}, &stdout, &stderr)
|
|
if err != nil {
|
|
t.Fatalf("run returned error: %v (stderr: %s)", err, stderr.String())
|
|
}
|
|
|
|
artifactPath := artifactPath(projectDir, "build", "demo-mcp", runtime.GOOS, runtime.GOARCH)
|
|
if _, err := os.Stat(artifactPath); err != nil {
|
|
t.Fatalf("expected artifact at %s: %v", artifactPath, err)
|
|
}
|
|
|
|
output, err := exec.Command(artifactPath).Output()
|
|
if err != nil {
|
|
t.Fatalf("run artifact: %v", err)
|
|
}
|
|
if strings.TrimSpace(string(output)) != "1.2.3" {
|
|
t.Fatalf("artifact output = %q, want %q", strings.TrimSpace(string(output)), "1.2.3")
|
|
}
|
|
}
|
|
|
|
func TestRunBuildUsesManifestVersionVar(t *testing.T) {
|
|
projectDir := t.TempDir()
|
|
writeBuildFixture(t, projectDir, "custom-version", `
|
|
module example.com/custom-version
|
|
|
|
go 1.25.0
|
|
`, `
|
|
binary_name = "custom-version"
|
|
|
|
[build]
|
|
main_package = "./cmd/custom-version"
|
|
output_dir = "dist"
|
|
version_var = "main.releaseVersion"
|
|
`, `
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
var releaseVersion = "dev"
|
|
|
|
func main() {
|
|
fmt.Print(releaseVersion)
|
|
}
|
|
`)
|
|
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
err := run([]string{
|
|
"build",
|
|
"--manifest-dir", projectDir,
|
|
"--goos", runtime.GOOS,
|
|
"--goarch", runtime.GOARCH,
|
|
"--version", "9.9.9",
|
|
}, &stdout, &stderr)
|
|
if err != nil {
|
|
t.Fatalf("run returned error: %v (stderr: %s)", err, stderr.String())
|
|
}
|
|
|
|
artifactPath := artifactPath(projectDir, "dist", "custom-version", runtime.GOOS, runtime.GOARCH)
|
|
output, err := exec.Command(artifactPath).Output()
|
|
if err != nil {
|
|
t.Fatalf("run artifact: %v", err)
|
|
}
|
|
if strings.TrimSpace(string(output)) != "9.9.9" {
|
|
t.Fatalf("artifact output = %q, want %q", strings.TrimSpace(string(output)), "9.9.9")
|
|
}
|
|
}
|
|
|
|
func TestBuildHelp(t *testing.T) {
|
|
var stdout bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
|
|
if err := run([]string{"build", "--help"}, &stdout, &stderr); err != nil {
|
|
t.Fatalf("run returned error: %v", err)
|
|
}
|
|
|
|
output := stdout.String()
|
|
if !strings.Contains(output, "--manifest-dir") {
|
|
t.Fatalf("build help should mention --manifest-dir: %q", output)
|
|
}
|
|
if !strings.Contains(output, "version_var") {
|
|
t.Fatalf("build help should mention manifest build config: %q", output)
|
|
}
|
|
}
|
|
|
|
func writeBuildFixture(t *testing.T, projectDir, binaryName, goModContent, manifestContent, mainContent string) {
|
|
t.Helper()
|
|
|
|
if err := os.WriteFile(filepath.Join(projectDir, "go.mod"), []byte(strings.TrimSpace(goModContent)+"\n"), 0o644); err != nil {
|
|
t.Fatalf("write go.mod: %v", err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(projectDir, "mcp.toml"), []byte(strings.TrimSpace(manifestContent)+"\n"), 0o644); err != nil {
|
|
t.Fatalf("write mcp.toml: %v", err)
|
|
}
|
|
|
|
cmdDir := filepath.Join(projectDir, "cmd", binaryName)
|
|
if err := os.MkdirAll(cmdDir, 0o755); err != nil {
|
|
t.Fatalf("mkdir cmd dir: %v", err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(cmdDir, "main.go"), []byte(strings.TrimSpace(mainContent)+"\n"), 0o644); err != nil {
|
|
t.Fatalf("write main.go: %v", err)
|
|
}
|
|
}
|
|
|
|
func artifactPath(projectDir, outDir, binaryName, goos, goarch string) string {
|
|
name := binaryName + "-" + goos + "-" + goarch
|
|
if goos == "windows" {
|
|
name += ".exe"
|
|
}
|
|
return filepath.Join(projectDir, outDir, name)
|
|
}
|