Something went wrong. Try again.
Monorepo for Tangled tangled.org
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161//go:build linux
package microvm
import ( "context" "encoding/json" "log/slog" "os" "path/filepath" "strings" "testing"
"tangled.org/core/api/tangled" "tangled.org/core/spindle/config")
func writeTestImageSpec(t *testing.T, dir, name string, spec ImageSpec) { t.Helper() data, err := json.Marshal(spec) if err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, name+".json"), data, 0o644); err != nil { t.Fatal(err) }}
func testEngine(t *testing.T, imageDir string) *Engine { t.Helper() return &Engine{ l: slog.Default(), cfg: &config.Config{ MicroVMPipelines: config.MicroVMPipelines{ ImageDir: imageDir, DefaultImage: "alpine", }, }, }}
func testPipelineIdentity() tangled.Pipeline { return tangled.Pipeline{ TriggerMetadata: &tangled.Pipeline_TriggerMetadata{ Repo: &tangled.Pipeline_TriggerRepo{Did: "did:web:owner"}, }, }}
func TestNewDefersAgentHubUntilWorkflowSetup(t *testing.T) { e, err := New(context.Background(), &config.Config{}, nil, nil) if err != nil { t.Fatal(err) } if e.agent != nil { t.Fatal("agent hub started during engine initialization") }}
func TestInitWorkflowRejectsConfigOnNonNixOSImage(t *testing.T) { dir := t.TempDir() writeTestImageSpec(t, dir, "alpine", validImageSpec())
e := testEngine(t, dir) _, err := e.InitWorkflow(tangled.Pipeline_Workflow{ Raw: `image: alpinedependencies: - nixpkgs#hellosteps: - name: hello command: hello`, }, testPipelineIdentity()) if err == nil { t.Fatal("expected error for NixOS config options on a non-NixOS image") } if !strings.Contains(err.Error(), "NixOS") { t.Fatalf("error should mention NixOS images, got: %v", err) }}
func TestInitWorkflowPlainStepsOnNonNixOSImage(t *testing.T) { dir := t.TempDir() writeTestImageSpec(t, dir, "alpine", validImageSpec())
e := testEngine(t, dir) wf, err := e.InitWorkflow(tangled.Pipeline_Workflow{ Raw: `image: alpinesteps: - name: hello command: echo hello`, }, testPipelineIdentity()) if err != nil { t.Fatal(err) } if len(wf.Steps) != 2 { t.Fatalf("expected checkout and user steps, got %d steps", len(wf.Steps)) } state, ok := wf.Data.(*workflowState) if !ok { t.Fatal("workflow data is not workflowState") } if state.ConfigKey != "" { t.Fatalf("non-NixOS workflow should not have a config key, got %q", state.ConfigKey) }}
func TestInitWorkflowConfigOnNixOSImage(t *testing.T) { dir := t.TempDir() spec := validImageSpec() spec.BaseConfigHash = "abcdef123456" writeTestImageSpec(t, dir, "nixos", spec)
e := testEngine(t, dir) wf, err := e.InitWorkflow(tangled.Pipeline_Workflow{ Raw: `image: nixosdependencies: - nixpkgs#hellosteps: - name: hello command: hello`, }, testPipelineIdentity()) if err != nil { t.Fatal(err) } if len(wf.Steps) != 3 { t.Fatalf("expected checkout, activation, and user steps, got %d steps", len(wf.Steps)) } if step, ok := wf.Steps[1].(Step); !ok || step.action != activationStepAction { t.Fatalf("second step should be the activation step, got %+v", wf.Steps[1]) }}
func TestInitWorkflowCachesRenameHint(t *testing.T) { dir := t.TempDir() writeTestImageSpec(t, dir, "alpine", validImageSpec())
e := testEngine(t, dir) _, err := e.InitWorkflow(tangled.Pipeline_Workflow{ Raw: `image: alpinecaches: https://cache.nixos.org: ""steps: - name: hello command: hello`, }, tangled.Pipeline{}) if err == nil { t.Fatal("expected an error for the old caches key") } if !strings.Contains(err.Error(), "renamed to substituters") { t.Fatalf("error should point at substituters, got: %v", err) }}