66 lines
2.2 KiB
Go
66 lines
2.2 KiB
Go
package mq
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
|
|
"git.ipao.vip/rogee/go-sip/internal/tenant"
|
|
amqp "github.com/rabbitmq/amqp091-go"
|
|
)
|
|
|
|
func TestInvalidDataAckWaitsForDurableHandling(t *testing.T) {
|
|
route, err := tenant.ControlRoute("c046b893-8628-4589-ae50-619d049248a6")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
raw := []byte(`{"event_id":"original-event"}`)
|
|
for _, fail := range []bool{false, true} {
|
|
t.Run(map[bool]string{false: "durable", true: "storage failure"}[fail], func(t *testing.T) {
|
|
ack := ¤tRejectRecorder{}
|
|
b := &Broker{controlQueue: route.Queue}
|
|
b.SetInvalidMessageHandler(func(ctx context.Context, queue, key string, body []byte, cause error) error {
|
|
if ack.acked != 0 || ack.nacked != 0 {
|
|
t.Fatal("input disposed before rejection persisted")
|
|
}
|
|
if queue != route.Queue || key != route.BindingKey || !bytes.Equal(body, raw) || cause == nil {
|
|
t.Fatal("original rejection context lost")
|
|
}
|
|
if fail {
|
|
return errors.New("evidence storage failed")
|
|
}
|
|
return nil
|
|
})
|
|
err := b.rejectInbound(context.Background(), route.Queue, amqp.Delivery{Body: raw, RoutingKey: route.BindingKey, Acknowledger: ack}, errors.New("issued_at required"))
|
|
if fail {
|
|
if err == nil || ack.acked != 0 || ack.nacked != 1 || !ack.requeued {
|
|
t.Fatalf("identified data discarded on persistence failure: %+v %v", ack, err)
|
|
}
|
|
} else {
|
|
if err != nil || ack.acked != 1 || ack.rejected != 0 {
|
|
t.Fatalf("durable rejection not acknowledged: %+v %v", ack, err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
func TestRejectionRouteMustBelongToDispatcher(t *testing.T) {
|
|
id := "c046b893-8628-4589-ae50-619d049248a6"
|
|
route, err := tenant.ControlRoute(id)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
task, err := tenant.TaskRoute(id, "5")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := &Broker{dispatcherID: id, controlQueue: route.Queue}
|
|
if !b.OwnsRejectionRoute(route.Queue, route.BindingKey) || !b.OwnsRejectionRoute(task.Queue, task.BindingKey) {
|
|
t.Fatal("own source rejected")
|
|
}
|
|
if b.OwnsRejectionRoute(route.Queue, "d.other.control.in") || b.OwnsRejectionRoute("agent-call.d.other.control.v1", route.BindingKey) {
|
|
t.Fatal("foreign source accepted")
|
|
}
|
|
}
|