package stdio import ( "bufio" "encoding/json" "io" "testing" "time" ) // 1887/A11: a bundle pulls one message through its runtime, naming the worker and the wait, and settles it by the id the // runtime gave. func TestABundlePullsAndSettlesThroughTheRuntime(t *testing.T) { t.Setenv(ServedAs, "mesh-build-go") inR, inW := io.Pipe() outR, outW := io.Pipe() got := make(chan *Pulled, 1) go func() { _ = ServeOn("", []Tool{{Name: "start", Run: func(map[string]any) (any, error) { p, err := SeatPull("SEAT_NODE_BUILD_GO_DELIVERY_worker", 1500*time.Millisecond) if err != nil { return nil, err } got <- p return map[string]any{}, SeatSettle(p.ID, SettleAck) }}}, inR, outW) }() lines := bufio.NewScanner(outR) next := func() map[string]any { done := make(chan map[string]any, 1) go func() { if lines.Scan() { var m map[string]any _ = json.Unmarshal(lines.Bytes(), &m) done <- m } }() select { case m := <-done: return m case <-time.After(3 * time.Second): t.Fatal("the bundle said nothing") return nil } } send := func(m map[string]any) { b, _ := json.Marshal(m); _, _ = inW.Write(append(b, '\n')) } send(map[string]any{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": map[string]any{"name": "start"}}) asked := next() params, _ := asked["params"].(map[string]any) if asked["method"] != "mesh/seat.pull" || params["worker"] != "SEAT_NODE_BUILD_GO_DELIVERY_worker" || params["wait_ms"] != 1500.0 { t.Fatalf("asked %v", asked) } send(map[string]any{"jsonrpc": "2.0", "id": asked["id"], "result": map[string]any{"id": "p1", "worker": "SEAT_NODE_BUILD_GO_DELIVERY_worker", "subject": "mesh.seat.node-build-go.accept.delivery", "body": map[string]any{"v": 1}, "delivered": 1}}) p := <-got if p.ID != "p1" || string(p.Body) != `{"v":1}` { t.Fatalf("pulled %+v", p) } asked = next() params, _ = asked["params"].(map[string]any) if asked["method"] != "mesh/seat.settle" || params["id"] != "p1" || params["fate"] != "ack" { t.Fatalf("settled %v", asked) } send(map[string]any{"jsonrpc": "2.0", "id": asked["id"], "result": map[string]any{}}) }