55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package provider
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/json"
|
|
"io"
|
|
"testing"
|
|
"time"
|
|
|
|
stdio "git.novox.be/novox/mesh-sdk/go"
|
|
)
|
|
|
|
// runtime drives a bundle over pipes as the runtime does: it reads what the bundle says and sends what the runtime would.
|
|
type runtime struct {
|
|
t *testing.T
|
|
lines *bufio.Scanner
|
|
in io.Writer
|
|
}
|
|
|
|
func (r *runtime) next() map[string]any {
|
|
done := make(chan map[string]any, 1)
|
|
go func() {
|
|
if r.lines.Scan() {
|
|
var m map[string]any
|
|
_ = json.Unmarshal(r.lines.Bytes(), &m)
|
|
done <- m
|
|
}
|
|
}()
|
|
select {
|
|
case m := <-done:
|
|
return m
|
|
case <-time.After(3 * time.Second):
|
|
r.t.Fatal("the bundle said nothing")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (r *runtime) send(m map[string]any) {
|
|
b, _ := json.Marshal(m)
|
|
_, _ = r.in.Write(append(b, '\n'))
|
|
}
|
|
|
|
func (r *runtime) call(id int, tool string, args map[string]any) {
|
|
r.send(map[string]any{"jsonrpc": "2.0", "id": id, "method": "tools/call", "params": map[string]any{"name": tool, "arguments": args}})
|
|
}
|
|
|
|
func serve(t *testing.T, tools []stdio.Tool) *runtime {
|
|
t.Setenv(stdio.ServedAs, "keeper")
|
|
inR, inW := io.Pipe()
|
|
outR, outW := io.Pipe()
|
|
go func() { _ = stdio.ServeOn("", tools, inR, outW) }()
|
|
t.Cleanup(func() { _ = inW.Close() })
|
|
return &runtime{t: t, lines: bufio.NewScanner(outR), in: inW}
|
|
}
|