66 lines
2.1 KiB
Go
66 lines
2.1 KiB
Go
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{}})
|
|
}
|