Persist build extra_files for Build Manager history, print dashboard login on every start, add libp2p for Mesh P2P forge, defer WebSocket until login, and split devrun.bat from LAUNCH.bat with USB deck auto-detection.
211 lines
6.1 KiB
Go
211 lines
6.1 KiB
Go
package builder
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestDetectFusionPayloadKind(t *testing.T) {
|
|
if detectFusionPayloadKind("prep.exe") != "exe" {
|
|
t.Fatal("expected exe")
|
|
}
|
|
if detectFusionPayloadKind("PREP.EXE") != "exe" {
|
|
t.Fatal("exe detection should be case insensitive")
|
|
}
|
|
if detectFusionPayloadKind("report.pdf") != "file" {
|
|
t.Fatal("expected file for pdf")
|
|
}
|
|
if detectFusionPayloadKind("clip.mkv") != "file" {
|
|
t.Fatal("expected file for video")
|
|
}
|
|
}
|
|
|
|
func TestNormalizeFusionMediaMode(t *testing.T) {
|
|
tests := map[string]string{
|
|
"": "paired",
|
|
" Paired ": "paired",
|
|
"EMBEDDED": "embedded",
|
|
"bogus": "paired",
|
|
}
|
|
for in, want := range tests {
|
|
if got := normalizeFusionMediaMode(in); got != want {
|
|
t.Fatalf("normalizeFusionMediaMode(%q) = %q, want %q", in, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNormalizeFusionOrderAll(t *testing.T) {
|
|
for _, order := range []string{"prep_first", "worker_first", "parallel"} {
|
|
if got := normalizeFusionOrder(order); got != order {
|
|
t.Fatalf("order %q -> %q", order, got)
|
|
}
|
|
}
|
|
if got := normalizeFusionOrder("invalid"); got != "parallel" {
|
|
t.Fatalf("default order: %q", got)
|
|
}
|
|
}
|
|
|
|
func TestRunnerNameForFileWindows(t *testing.T) {
|
|
win := BuildPlatform{GOOS: "windows", GOARCH: "amd64", Ext: ".exe"}
|
|
got := runnerNameForFile("movie.mp4", win)
|
|
if got != "movie.mp4.exe" {
|
|
t.Fatalf("windows runner: %q", got)
|
|
}
|
|
}
|
|
|
|
func TestRunnerNameForFileLinux(t *testing.T) {
|
|
linux := BuildPlatform{GOOS: "linux", GOARCH: "amd64", Ext: ""}
|
|
got := runnerNameForFile("movie.mp4", linux)
|
|
if got != "movie-runner" {
|
|
t.Fatalf("linux runner: %q", got)
|
|
}
|
|
}
|
|
|
|
func TestFusionExportSubdir(t *testing.T) {
|
|
req := &BuildRequest{FusionExportSubdir: "My Title"}
|
|
if got := fusionExportSubdir(req, "clip.mkv"); got != "My_Title" {
|
|
t.Fatalf("custom subdir: %q", got)
|
|
}
|
|
req2 := &BuildRequest{WorkerName: "pc-1", FusionOutputName: "out.exe"}
|
|
if got := fusionExportSubdir(req2, "quarterly.pdf"); got != "quarterly" {
|
|
t.Fatalf("derived subdir: %q", got)
|
|
}
|
|
}
|
|
|
|
func TestSanitizeDirName(t *testing.T) {
|
|
if got := sanitizeDirName(""); got != "" {
|
|
t.Fatalf("empty: %q", got)
|
|
}
|
|
if got := sanitizeDirName("../../../etc"); got != "etc" {
|
|
t.Fatalf("basename only: %q", got)
|
|
}
|
|
if got := sanitizeDirName("***"); got != "title" {
|
|
t.Fatalf("invalid chars fallback: %q", got)
|
|
}
|
|
}
|
|
|
|
func TestPatchFusionMain(t *testing.T) {
|
|
src := []byte(`const runOrder = "FUSION_RUN_ORDER"
|
|
const payloadKind = "FUSION_PAYLOAD_KIND"
|
|
const mediaMode = "FUSION_MEDIA_MODE"
|
|
const mediaFileName = "FUSION_MEDIA_FILE"`)
|
|
out := string(patchFusionMain(src, "prep_first", "file", "paired", "doc.pdf"))
|
|
if !strings.Contains(out, `const runOrder = "prep_first"`) {
|
|
t.Fatalf("runOrder not patched: %s", out)
|
|
}
|
|
if !strings.Contains(out, `const mediaFileName = "doc.pdf"`) {
|
|
t.Fatalf("mediaFileName not patched: %s", out)
|
|
}
|
|
}
|
|
|
|
func TestWriteFusionManifest(t *testing.T) {
|
|
dir := t.TempDir()
|
|
if err := writeFusionManifest(dir, "file", "paired", "report.pdf"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
raw, err := os.ReadFile(filepath.Join(dir, "manifest.json"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var m map[string]string
|
|
if err := json.Unmarshal(raw, &m); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if m["media_file_name"] != "report.pdf" {
|
|
t.Fatalf("manifest: %+v", m)
|
|
}
|
|
}
|
|
|
|
func TestWriteFusionManifestExError(t *testing.T) {
|
|
// nil map marshals fine; test invalid dir
|
|
err := writeFusionManifestEx("/nonexistent/path/xyz", map[string]string{"a": "b"})
|
|
if err == nil {
|
|
t.Fatal("expected write error for invalid dir")
|
|
}
|
|
}
|
|
|
|
func TestPrepareFusionProjectMissingSource(t *testing.T) {
|
|
h := &Handler{projectRoot: t.TempDir()}
|
|
_, err := h.prepareFusionProject(t.TempDir(), "parallel", "file", "paired", "x.pdf")
|
|
if err == nil || !strings.Contains(err.Error(), "fusion source missing") {
|
|
t.Fatalf("expected missing fusion source error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestPrepareFusionProjectSuccess(t *testing.T) {
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
|
|
fusionDir, err := h.prepareFusionProject(t.TempDir(), "prep_first", "file", "paired", "report.pdf")
|
|
if err != nil {
|
|
t.Fatalf("prepareFusionProject: %v", err)
|
|
}
|
|
main, err := os.ReadFile(filepath.Join(fusionDir, "main.go"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
body := string(main)
|
|
for _, want := range []string{`runOrder = "prep_first"`, `payloadKind = "file"`, `mediaFileName = "report.pdf"`} {
|
|
if !strings.Contains(body, want) {
|
|
t.Fatalf("patched main missing %q:\n%s", want, body)
|
|
}
|
|
}
|
|
if _, err := os.Stat(filepath.Join(fusionDir, "go.mod")); err != nil {
|
|
t.Fatalf("fusion go.mod not copied: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestBuildFileFusionMissingWorker(t *testing.T) {
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
setFakeGoSuccess(t, h)
|
|
|
|
buildDir := t.TempDir()
|
|
prep := filepath.Join(t.TempDir(), "report.pdf")
|
|
if err := os.WriteFile(prep, []byte("%PDF"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
req := &BuildRequest{FusionMediaMode: "paired", FusionPayloadKind: "file"}
|
|
win := BuildPlatform{GOOS: "windows", GOARCH: "amd64", Ext: ".exe"}
|
|
_, err := h.buildFileFusion(context.Background(), buildDir, prep, filepath.Join(buildDir, "missing.exe"), req, win)
|
|
if err == nil {
|
|
t.Fatal("expected worker copy failure")
|
|
}
|
|
}
|
|
|
|
func TestPublishFusionDeliverable(t *testing.T) {
|
|
root := t.TempDir()
|
|
h := &Handler{projectRoot: root}
|
|
src := filepath.Join(t.TempDir(), "runner.exe")
|
|
if err := os.WriteFile(src, []byte("bin"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
dir, err := h.publishFusionDeliverable("MyTitle", map[string]string{"runner.exe": src}, fusionReadmeInfo{
|
|
Title: "MyTitle", RunnerName: "runner.exe", MediaName: "prep.pdf", PayloadKind: "file",
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(filepath.Join(dir, "README.txt")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := os.Stat(filepath.Join(dir, "runner.exe")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestPublishFusionDeliverableNoRoot(t *testing.T) {
|
|
h := &Handler{projectRoot: ""}
|
|
dir, err := h.publishFusionDeliverable("x", nil, fusionReadmeInfo{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if dir != "" {
|
|
t.Fatalf("expected empty dir when no project root, got %q", dir)
|
|
}
|
|
}
|