53 lines
2.0 KiB
Go
53 lines
2.0 KiB
Go
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 <seat>.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 })
|
|
}
|