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.
159 lines
4.3 KiB
Go
159 lines
4.3 KiB
Go
package builder
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func goAvailable() bool {
|
|
_, err := exec.LookPath("go")
|
|
return err == nil
|
|
}
|
|
|
|
func TestBuildFusionCompileFailsWithoutGo(t *testing.T) {
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
setFakeGoFail(t, h)
|
|
buildDir := t.TempDir()
|
|
worker := filepath.Join(buildDir, "worker.exe")
|
|
if err := os.WriteFile(worker, []byte("w"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
prep := filepath.Join(t.TempDir(), "doc.pdf")
|
|
if err := os.WriteFile(prep, []byte("%PDF"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_, err := h.buildFusion(context.Background(), buildDir, prep, worker, "runner.exe", "parallel")
|
|
if err == nil {
|
|
t.Fatal("expected compile error from fake go")
|
|
}
|
|
}
|
|
|
|
func TestBuildFusionFromRequestPaired(t *testing.T) {
|
|
if !goAvailable() {
|
|
t.Skip("go not in PATH")
|
|
}
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
buildDir := t.TempDir()
|
|
worker := filepath.Join(buildDir, "worker.exe")
|
|
if err := os.WriteFile(worker, []byte("MZ"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
prep := filepath.Join(t.TempDir(), "report.pdf")
|
|
if err := os.WriteFile(prep, []byte("%PDF-1.4"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
req := &BuildRequest{
|
|
FusionMediaMode: "paired",
|
|
FusionPayloadKind: "file",
|
|
FusionMediaBaseName: "report.pdf",
|
|
}
|
|
res, err := h.buildFusionFromRequest(context.Background(), buildDir, prep, worker, req)
|
|
if err != nil {
|
|
t.Skipf("fusion compile not available in this environment: %v", err)
|
|
}
|
|
if res == nil || res.LauncherPath == "" {
|
|
t.Fatal("expected launcher path")
|
|
}
|
|
}
|
|
|
|
func TestBuildFileFusionPairedFakeGo(t *testing.T) {
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
setFakeGoSuccess(t, h)
|
|
|
|
buildDir := t.TempDir()
|
|
worker := filepath.Join(buildDir, "worker.exe")
|
|
if err := os.WriteFile(worker, []byte("w"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
prep := filepath.Join(t.TempDir(), "report.pdf")
|
|
if err := os.WriteFile(prep, []byte("%PDF-1.4"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
req := &BuildRequest{
|
|
TargetOS: "windows",
|
|
FusionMediaMode: "paired",
|
|
FusionPayloadKind: "file",
|
|
FusionMediaBaseName: "report.pdf",
|
|
}
|
|
win := BuildPlatform{GOOS: "windows", GOARCH: "amd64", Ext: ".exe"}
|
|
res, err := h.buildFileFusion(context.Background(), buildDir, prep, worker, req, win)
|
|
if err != nil {
|
|
t.Fatalf("buildFileFusion paired: %v", err)
|
|
}
|
|
if res == nil || res.LauncherPath == "" {
|
|
t.Fatal("expected launcher path")
|
|
}
|
|
if _, err := os.Stat(res.LauncherPath); err != nil {
|
|
t.Fatalf("launcher not created: %v", err)
|
|
}
|
|
if res.MediaName != "report.pdf" {
|
|
t.Fatalf("media name: %q", res.MediaName)
|
|
}
|
|
}
|
|
|
|
func TestBuildFileFusionEmbeddedFakeGo(t *testing.T) {
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
setFakeGoSuccess(t, h)
|
|
|
|
buildDir := t.TempDir()
|
|
worker := filepath.Join(buildDir, "worker.bin")
|
|
if err := os.WriteFile(worker, []byte("w"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
prep := filepath.Join(t.TempDir(), "clip.mkv")
|
|
if err := os.WriteFile(prep, []byte("fake video"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
req := &BuildRequest{
|
|
TargetOS: "linux",
|
|
FusionMediaMode: "embedded",
|
|
FusionPayloadKind: "file",
|
|
}
|
|
linux := BuildPlatform{GOOS: "linux", GOARCH: "amd64", Ext: ""}
|
|
res, err := h.buildFileFusion(context.Background(), buildDir, prep, worker, req, linux)
|
|
if err != nil {
|
|
t.Fatalf("buildFileFusion embedded: %v", err)
|
|
}
|
|
payloadBin := filepath.Join(buildDir, "fusion", "assets", "payload.bin")
|
|
st, err := os.Stat(payloadBin)
|
|
if err != nil {
|
|
t.Fatalf("embedded payload.bin missing: %v", err)
|
|
}
|
|
if st.Size() == 0 {
|
|
t.Fatal("embedded mode should copy payload into assets")
|
|
}
|
|
if res.MediaName != "clip.mkv" {
|
|
t.Fatalf("media name: %q", res.MediaName)
|
|
}
|
|
}
|
|
|
|
func TestBuildFusionWrapperFakeGoSuccess(t *testing.T) {
|
|
h, database := testHandlerDB(t)
|
|
defer database.Close()
|
|
setFakeGoSuccess(t, h)
|
|
|
|
buildDir := t.TempDir()
|
|
worker := filepath.Join(buildDir, "worker.exe")
|
|
if err := os.WriteFile(worker, []byte("w"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
prep := filepath.Join(t.TempDir(), "doc.pdf")
|
|
if err := os.WriteFile(prep, []byte("%PDF"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
launcher, err := h.buildFusion(context.Background(), buildDir, prep, worker, "doc.pdf.exe", "parallel")
|
|
if err != nil {
|
|
t.Fatalf("buildFusion: %v", err)
|
|
}
|
|
if launcher == "" {
|
|
t.Fatal("expected launcher path")
|
|
}
|
|
}
|