feat(go): add nats kafka ingest bridge
This commit is contained in:
75
go/vehicle-gateway/cmd/nats-kafka-bridge/main_test.go
Normal file
75
go/vehicle-gateway/cmd/nats-kafka-bridge/main_test.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/segmentio/kafka-go"
|
||||
|
||||
"lingniu-vehicle-ingest/go/vehicle-gateway/internal/envelope"
|
||||
)
|
||||
|
||||
func TestBridgeBatchWritesKafkaThenAcks(t *testing.T) {
|
||||
env := envelope.FrameEnvelope{Protocol: envelope.ProtocolJT808, Phone: "13307795425", MessageID: "0x0200"}
|
||||
payload, err := json.Marshal(env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
writer := &recordingBridgeWriter{}
|
||||
acked := 0
|
||||
|
||||
err = bridgeBatch(context.Background(), writer, []bridgeMessage{
|
||||
{subject: "vehicle.raw.jt808.v1", data: payload, ack: func() error {
|
||||
acked++
|
||||
return nil
|
||||
}},
|
||||
}, map[string]string{"vehicle.raw.jt808.v1": "vehicle.raw.jt808.v1"})
|
||||
if err != nil {
|
||||
t.Fatalf("bridgeBatch() error = %v", err)
|
||||
}
|
||||
if len(writer.messages) != 1 {
|
||||
t.Fatalf("kafka writes = %d, want 1", len(writer.messages))
|
||||
}
|
||||
if got, want := writer.messages[0].Topic, "vehicle.raw.jt808.v1"; got != want {
|
||||
t.Fatalf("topic = %q, want %q", got, want)
|
||||
}
|
||||
if got, want := string(writer.messages[0].Key), "JT808:13307795425"; got != want {
|
||||
t.Fatalf("key = %q, want %q", got, want)
|
||||
}
|
||||
if acked != 1 {
|
||||
t.Fatalf("acks = %d, want 1", acked)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBridgeBatchDoesNotAckWhenKafkaFails(t *testing.T) {
|
||||
writer := &recordingBridgeWriter{err: errors.New("kafka unavailable")}
|
||||
acked := 0
|
||||
|
||||
err := bridgeBatch(context.Background(), writer, []bridgeMessage{
|
||||
{subject: "vehicle.event.unified.v1", data: []byte(`{"protocol":"JT808"}`), ack: func() error {
|
||||
acked++
|
||||
return nil
|
||||
}},
|
||||
}, map[string]string{"vehicle.event.unified.v1": "vehicle.event.unified.v1"})
|
||||
if err == nil {
|
||||
t.Fatal("bridgeBatch() error is nil, want kafka error")
|
||||
}
|
||||
if acked != 0 {
|
||||
t.Fatalf("acks = %d, want 0", acked)
|
||||
}
|
||||
}
|
||||
|
||||
type recordingBridgeWriter struct {
|
||||
messages []kafka.Message
|
||||
err error
|
||||
}
|
||||
|
||||
func (w *recordingBridgeWriter) WriteMessages(_ context.Context, messages ...kafka.Message) error {
|
||||
if w.err != nil {
|
||||
return w.err
|
||||
}
|
||||
w.messages = append(w.messages, messages...)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user