Files
orca/tests/integration/harness_test.go
T
Jon Chery 5f92196625 test(P08): integration test harness + drift-detection stubs (REQ-087)
tests/integration/harness.go: temp ORCA_HOME + mock peers + helpers.
tests/integration/scenarios_test.go: ns-create/job-submit/drain/backup/
secrets/acl/metrics scenarios. drift_scenarios_test.go: 4 stubs (auto-
remediation, NFS, cooldown, secret exclusion) skip until P10b.
scripts/tests/orca-commands_test.bash: bats for new CLI commands.

---ci---
project: orca
phase: 08
milestone: v0.11
status: execute
---/ci---
2026-08-07 06:04:06 +00:00

139 lines
3.2 KiB
Go

package integration
import (
"context"
"testing"
"time"
"git.cloudinit.dev/coreci/orca/internal/model"
"git.cloudinit.dev/coreci/orca/internal/paths"
)
func TestHarness_CreatesValidOrcaHome(t *testing.T) {
h := NewHarness(t)
if h.Home == "" {
t.Fatal("Home is empty")
}
if h.DB == nil {
t.Fatal("DB is nil")
}
if h.Registry == nil {
t.Fatal("Registry is nil")
}
if err := h.VerifyState(); err != nil {
t.Fatalf("VerifyState: %v", err)
}
ctx := context.Background()
nodes, err := h.Registry.List(ctx)
if err != nil {
t.Fatalf("List nodes: %v", err)
}
if len(nodes) != 1 || nodes[0].Name != "localhost" {
t.Errorf("expected localhost node, got %+v", nodes)
}
}
func TestHarness_MasterKeyMode(t *testing.T) {
h := NewHarness(t)
if err := h.VerifyState(); err != nil {
t.Fatalf("VerifyState: %v", err)
}
info, err := statPerm(paths.MasterKeyPath())
if err != nil {
t.Fatalf("stat master key: %v", err)
}
const want = 0o600
if info != want {
t.Errorf("master key mode %o, want %o", info, want)
}
}
func TestHarness_MockPeerRecordsCommands(t *testing.T) {
h := NewHarness(t)
peer := h.RegisterPeer("node-a", "node-a:22")
peer.SetRunning("alloc-1", "alloc-2")
ctx := context.Background()
running, err := h.ListAllocs(ctx, "node-a")
if err != nil {
t.Fatalf("ListAllocs: %v", err)
}
if len(running) != 2 {
t.Errorf("running allocs = %v, want 2", running)
}
cmds := peer.Commands()
if len(cmds) < 1 {
t.Fatalf("expected recorded commands, got %v", cmds)
}
foundList := false
for _, c := range cmds {
if startsWith(c, "systemctl list-units 'orca-alloc-*.service'") {
foundList = true
}
}
if !foundList {
t.Errorf("no list-units command recorded: %v", cmds)
}
}
func TestHarness_DrainNodeStopsAllocs(t *testing.T) {
h := NewHarness(t)
peer := h.RegisterPeer("node-b", "node-b:22")
peer.SetRunning("alloc-x", "alloc-y")
ctx := context.Background()
stopped, err := h.DrainNode(ctx, "node-b")
if err != nil {
t.Fatalf("DrainNode: %v", err)
}
if len(stopped) != 2 {
t.Errorf("stopped = %v, want 2", stopped)
}
if r := peer.RunningAllocs(); len(r) != 0 {
t.Errorf("after drain, running = %v, want empty", r)
}
nodes, err := h.Registry.List(ctx)
if err != nil {
t.Fatalf("List: %v", err)
}
for _, n := range nodes {
if n.Name == "node-b" && n.State != model.NodeStateDrained {
t.Errorf("node-b state = %q, want drained", n.State)
}
}
}
func TestHarness_SubmitJobHelperWorks(t *testing.T) {
h := NewHarness(t)
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
jobID, err := h.SubmitJob(ctx, "smoke", "/bin/true")
if err != nil {
t.Fatalf("SubmitJob: %v", err)
}
if jobID == "" {
t.Fatal("SubmitJob returned empty id")
}
jobs, err := h.Jobs.List(ctx)
if err != nil {
t.Fatalf("Jobs.List: %v", err)
}
var found bool
for _, j := range jobs {
if j.ID == jobID && j.Status == model.JobStatusComplete {
found = true
}
}
if !found {
t.Errorf("submitted job %s not complete in list: %+v", jobID, jobs)
}
}
func TestHarness_MockTransportUnknownPeerErrors(t *testing.T) {
h := NewHarness(t)
ctx := context.Background()
if _, err := h.Transport.Exec(ctx, "ghost", "true"); err == nil {
t.Error("expected error for unknown peer, got nil")
}
}