package buildstep import ( "context" "testing" "time" "git.novox.be/novox/mesh-sdk/go/delivery" ) // 1887/A9a, ADR 0525 ยง10: a build seat's verbs are .current, .pause and .resume; current names the ask running, // pause stops the puller taking asks, resume lets it take them again. func TestSeatToolsCurrentPauseResume(t *testing.T) { src, st := NewFakeAsks(), newSteps() release := make(chan struct{}) p := &Puller{Source: src, Language: delivery.AskGo, Node: "shanks", Put: st.put, Capacity: func() int { return 1 }, PullWait: 10 * time.Millisecond, Run: func(ctx context.Context, a delivery.StepAsk) (any, error) { <-release; return nil, nil }} tools := map[string]func(map[string]any) (any, error){} for _, tool := range SeatTools("node-build-go", "Go", p) { tools[tool.Name] = tool.Run } for _, name := range []string{"node-build-go.current", "node-build-go.pause", "node-build-go.resume"} { if tools[name] == nil { t.Fatalf("no %s", name) } } a := testAsk(delivery.AskDelivery) _ = src.PublishAsk(a) ctx, cancel := context.WithCancel(context.Background()) defer cancel() go p.Pull(ctx) waitFor(t, "the ask running", func() bool { return p.InHand() == 1 }) out, _ := tools["node-build-go.current"](nil) cur := out.(map[string]any) running := cur["running"].([]RunningAsk) if len(running) != 1 || running[0].ID != a.ID || running[0].Module != "m" || cur["capacity"] != 1 || cur["paused"] != false { t.Fatalf("current = %+v", cur) } if out, err := tools["node-build-go.pause"](nil); err != nil || out.(map[string]any)["paused"] != true { t.Fatalf("pause = %v, %v", out, err) } close(release) _ = src.PublishAsk(testAsk(delivery.AskDelivery)) time.Sleep(50 * time.Millisecond) if src.Waiting(delivery.AskDelivery) != 1 { t.Fatal("a paused node took an ask") } if _, err := tools["node-build-go.resume"](nil); err != nil { t.Fatal(err) } waitFor(t, "the ask taken after the resume", func() bool { return src.Waiting(delivery.AskDelivery) == 0 }) }