Files
mesh-tools/node-tools/internal/bus/seat_pull_test.go
T

65 lines
2.8 KiB
Go

package bus_test
import (
"encoding/json"
"strings"
"testing"
"time"
"github.com/novox/mesh-tools/node-tools/internal/bus"
)
// 1887/A11: a holder pulls one message at a time, only from a worker its membership lists, never a prefetch; it settles
// only what it pulled, and a message handed back comes again.
func TestAHolderPullsOneMessageWhenItHasRoom(t *testing.T) {
_, conn, js := seatMesh(t)
for _, id := range []string{"a1", "a2"} {
if _, err := conn.SeatPublish("mesh-delivery", "mesh.seat.operator-channel.accept.ask.mesh-delivery",
json.RawMessage(`{"id":"`+id+`"}`), id); err != nil {
t.Fatal(err)
}
}
first, err := conn.SeatPull("messenger", "SEAT_OPERATOR_CHANNEL_worker", 0)
if err != nil || first == nil || string(first.Body) != `{"id":"a1"}` || first.Delivered != 1 {
t.Fatalf("the first pull = %+v, %v", first, err)
}
// One pulled, one still waiting on the stream: nothing was fetched ahead.
info, err := js.ConsumerInfo("SEAT_OPERATOR_CHANNEL", "SEAT_OPERATOR_CHANNEL_worker")
if err != nil || info.NumPending != 1 || info.NumAckPending != 1 {
t.Fatalf("after one pull: pending %d, in hand %d (%v); want 1 and 1", info.NumPending, info.NumAckPending, err)
}
second, err := conn.SeatPull("messenger", "SEAT_OPERATOR_CHANNEL_worker", 0)
if err != nil || second == nil || string(second.Body) != `{"id":"a2"}` {
t.Fatalf("the second pull = %+v, %v", second, err)
}
if none, err := conn.SeatPull("messenger", "SEAT_OPERATOR_CHANNEL_worker", 0); err != nil || none != nil {
t.Fatalf("an empty worker answered %+v, %v", none, err)
}
began := time.Now()
if none, err := conn.SeatPull("messenger", "SEAT_OPERATOR_CHANNEL_worker", 200*time.Millisecond); err != nil || none != nil || time.Since(began) < 150*time.Millisecond {
t.Fatalf("a waiting pull answered %+v, %v after %v", none, err, time.Since(began))
}
if err := conn.SeatSettle("telegram", first.ID, bus.SettleAck); err == nil {
t.Error("a module settled another's message")
}
if err := conn.SeatSettle("messenger", first.ID, bus.SettleProgress); err != nil {
t.Fatal(err)
}
if err := conn.SeatSettle("messenger", first.ID, bus.SettleAck); err != nil {
t.Fatal(err)
}
if err := conn.SeatSettle("messenger", first.ID, bus.SettleAck); err == nil {
t.Error("a message was settled twice")
}
if err := conn.SeatSettle("messenger", second.ID, bus.SettleNak); err != nil {
t.Fatal(err)
}
again, err := conn.SeatPull("messenger", "SEAT_OPERATOR_CHANNEL_worker", time.Second)
if err != nil || again == nil || string(again.Body) != `{"id":"a2"}` || again.Delivered != 2 {
t.Fatalf("the message handed back = %+v, %v", again, err)
}
if _, err := conn.SeatPull("telegram", "SEAT_OPERATOR_CHANNEL_worker", 0); err == nil || !strings.Contains(err.Error(), "membership lists") {
t.Errorf("a channel pulled the router's work: %v", err)
}
}