//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) } }