You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.8 KiB
116 lines
2.8 KiB
package kafka
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/segmentio/kafka-go"
|
|
"github.com/seaweedfs/seaweedfs/weed/mq/kafka/gateway"
|
|
)
|
|
|
|
func TestKafkaProduceConsumeE2E(t *testing.T) {
|
|
// Start gateway server
|
|
gatewayServer := gateway.NewServer(gateway.Options{
|
|
Listen: ":0", // random port
|
|
})
|
|
|
|
go func() {
|
|
if err := gatewayServer.Start(); err != nil {
|
|
t.Errorf("Gateway server error: %v", err)
|
|
}
|
|
}()
|
|
defer gatewayServer.Close()
|
|
|
|
// Wait for server to start
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
// Get the actual listening address
|
|
host, port := gatewayServer.GetListenerAddr()
|
|
brokerAddr := fmt.Sprintf("%s:%d", host, port)
|
|
t.Logf("Gateway running on %s", brokerAddr)
|
|
|
|
// Get handler and configure it
|
|
handler := gatewayServer.GetHandler()
|
|
handler.SetBrokerAddress(host, port)
|
|
|
|
// Add test topic
|
|
topicName := "e2e-test-topic"
|
|
handler.AddTopicForTesting(topicName, 1)
|
|
|
|
// Test messages
|
|
testMessages := []string{
|
|
"Hello Kafka Gateway!",
|
|
"This is message 2",
|
|
"Final test message",
|
|
}
|
|
|
|
// === PRODUCE PHASE ===
|
|
t.Log("=== STARTING PRODUCE PHASE ===")
|
|
|
|
writer := &kafka.Writer{
|
|
Addr: kafka.TCP(brokerAddr),
|
|
Topic: topicName,
|
|
Balancer: &kafka.LeastBytes{},
|
|
}
|
|
defer writer.Close()
|
|
|
|
// Produce messages
|
|
for i, msg := range testMessages {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
|
|
err := writer.WriteMessages(ctx, kafka.Message{
|
|
Key: []byte(fmt.Sprintf("key-%d", i)),
|
|
Value: []byte(msg),
|
|
})
|
|
cancel()
|
|
if err != nil {
|
|
t.Fatalf("Failed to produce message %d: %v", i, err)
|
|
}
|
|
t.Logf("Produced message %d: %s", i, msg)
|
|
}
|
|
|
|
t.Log("=== PRODUCE PHASE COMPLETED ===")
|
|
|
|
// === CONSUME PHASE ===
|
|
t.Log("=== STARTING CONSUME PHASE ===")
|
|
|
|
reader := kafka.NewReader(kafka.ReaderConfig{
|
|
Brokers: []string{brokerAddr},
|
|
Topic: topicName,
|
|
GroupID: "test-consumer-group",
|
|
})
|
|
defer reader.Close()
|
|
|
|
// Consume messages
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
consumedMessages := make([]string, 0, len(testMessages))
|
|
|
|
for i := 0; i < len(testMessages); i++ {
|
|
msg, err := reader.ReadMessage(ctx)
|
|
if err != nil {
|
|
t.Fatalf("Failed to consume message %d: %v", i, err)
|
|
}
|
|
|
|
consumedMsg := string(msg.Value)
|
|
consumedMessages = append(consumedMessages, consumedMsg)
|
|
t.Logf("Consumed message %d: %s (offset: %d)", i, consumedMsg, msg.Offset)
|
|
}
|
|
|
|
t.Log("=== CONSUME PHASE COMPLETED ===")
|
|
|
|
// === VERIFICATION ===
|
|
if len(consumedMessages) != len(testMessages) {
|
|
t.Fatalf("Expected %d messages, got %d", len(testMessages), len(consumedMessages))
|
|
}
|
|
|
|
for i, expected := range testMessages {
|
|
if consumedMessages[i] != expected {
|
|
t.Errorf("Message %d mismatch: expected %q, got %q", i, expected, consumedMessages[i])
|
|
}
|
|
}
|
|
|
|
t.Log("✅ SUCCESS: Complete produce/consume cycle working!")
|
|
}
|