60 lines
1.9 KiB
Go
60 lines
1.9 KiB
Go
//go:build integration
|
|
|
|
package link
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/nats-io/nats.go"
|
|
"github.com/novox/mesh-controller/internal/testbus"
|
|
)
|
|
|
|
func TestAPartGoesOnlyToItsCaller(t *testing.T) {
|
|
conn, err := nats.Connect(testbus.URL(t))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer conn.Close()
|
|
l := NewCallLog()
|
|
c := l.begin("mesh-controller", "status", nil, "_INBOX.operator.ABCDEFGHIJKLMNOPQRSTUV")
|
|
l.page(c, []byte(strings.Repeat("z", 5000)), 2048)
|
|
sub, err := conn.Subscribe("pages.test", func(m *nats.Msg) { l.servePage("mesh-controller", "status", m, nil) })
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer sub.Unsubscribe()
|
|
_, err = askPart(context.Background(), conn, "pages.test", Paged{Call: c.ID, Parts: 3}, 0)
|
|
if err == nil || !strings.Contains(err.Error(), "another caller") {
|
|
t.Fatalf("a part was handed to a caller it was not paged to: %v", err)
|
|
}
|
|
_, err = askPart(context.Background(), conn, "pages.test", Paged{Call: "call-0-0", Parts: 3}, 0)
|
|
if err == nil || !strings.Contains(err.Error(), "not held here") {
|
|
t.Fatalf("a part of nothing held: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestAMissingPartFailsTheWhole(t *testing.T) {
|
|
conn, err := nats.Connect(testbus.URL(t))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer conn.Close()
|
|
sub, err := conn.Subscribe("pages.none", func(m *nats.Msg) { _ = m.Respond([]byte(`{"error":"gone"}`)) })
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer sub.Unsubscribe()
|
|
first, _ := json.Marshal(map[string]any{"error": "too large", "paged": Paged{Call: "call-1-1", Bytes: 10, Parts: 2}})
|
|
_, err = Whole(context.Background(), conn, "pages.none", first)
|
|
if err == nil || !strings.Contains(err.Error(), "part 0") || !strings.Contains(err.Error(), "gone") {
|
|
t.Fatalf("a missing part read as %v", err)
|
|
}
|
|
if plain, err := Whole(context.Background(), conn, "pages.none", []byte(`{"result":1}`)); err != nil ||
|
|
string(plain) != `{"result":1}` {
|
|
t.Fatalf("an answer that fits was changed: %s %v", plain, err)
|
|
}
|
|
}
|