github.com/segmentio/kafka-go@v0.4.48-0.20240318174348-3f6244eb34fd/rawproduce_test.go (about) 1 package kafka 2 3 import ( 4 "bytes" 5 "context" 6 "testing" 7 "time" 8 9 "github.com/segmentio/kafka-go/protocol" 10 ktesting "github.com/segmentio/kafka-go/testing" 11 ) 12 13 func TestClientRawProduce(t *testing.T) { 14 // The RawProduce request records are encoded in the format introduced in Kafka 0.11.0. 15 if !ktesting.KafkaIsAtLeast("0.11.0") { 16 t.Skip("Skipping because the RawProduce request is not supported by Kafka versions below 0.11.0") 17 } 18 19 client, topic, shutdown := newLocalClientAndTopic() 20 defer shutdown() 21 22 now := time.Now() 23 24 res, err := client.RawProduce(context.Background(), &RawProduceRequest{ 25 Topic: topic, 26 Partition: 0, 27 RequiredAcks: -1, 28 RawRecords: NewRawRecordSet(NewRecordReader( 29 Record{Time: now, Value: NewBytes([]byte(`hello-1`))}, 30 Record{Time: now, Value: NewBytes([]byte(`hello-2`))}, 31 Record{Time: now, Value: NewBytes([]byte(`hello-3`))}, 32 ), 0), 33 }) 34 35 if err != nil { 36 t.Fatal(err) 37 } 38 39 if res.Error != nil { 40 t.Error(res.Error) 41 } 42 43 for index, err := range res.RecordErrors { 44 t.Errorf("record at index %d produced an error: %v", index, err) 45 } 46 } 47 48 func TestClientRawProduceCompressed(t *testing.T) { 49 // The RawProduce request records are encoded in the format introduced in Kafka 0.11.0. 50 if !ktesting.KafkaIsAtLeast("0.11.0") { 51 t.Skip("Skipping because the RawProduce request is not supported by Kafka versions below 0.11.0") 52 } 53 54 client, topic, shutdown := newLocalClientAndTopic() 55 defer shutdown() 56 57 now := time.Now() 58 59 res, err := client.RawProduce(context.Background(), &RawProduceRequest{ 60 Topic: topic, 61 Partition: 0, 62 RequiredAcks: -1, 63 RawRecords: NewRawRecordSet(NewRecordReader( 64 Record{Time: now, Value: NewBytes([]byte(`hello-1`))}, 65 Record{Time: now, Value: NewBytes([]byte(`hello-2`))}, 66 Record{Time: now, Value: NewBytes([]byte(`hello-3`))}, 67 ), protocol.Gzip), 68 }) 69 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 if res.Error != nil { 75 t.Error(res.Error) 76 } 77 78 for index, err := range res.RecordErrors { 79 t.Errorf("record at index %d produced an error: %v", index, err) 80 } 81 } 82 83 func TestClientRawProduceNilRecords(t *testing.T) { 84 client, topic, shutdown := newLocalClientAndTopic() 85 defer shutdown() 86 87 _, err := client.RawProduce(context.Background(), &RawProduceRequest{ 88 Topic: topic, 89 Partition: 0, 90 RequiredAcks: -1, 91 RawRecords: protocol.RawRecordSet{Reader: nil}, 92 }) 93 94 if err != nil { 95 t.Fatal(err) 96 } 97 } 98 99 func TestClientRawProduceEmptyRecords(t *testing.T) { 100 client, topic, shutdown := newLocalClientAndTopic() 101 defer shutdown() 102 103 _, err := client.Produce(context.Background(), &ProduceRequest{ 104 Topic: topic, 105 Partition: 0, 106 RequiredAcks: -1, 107 Records: NewRecordReader(), 108 }) 109 110 if err != nil { 111 t.Fatal(err) 112 } 113 } 114 115 func NewRawRecordSet(reader protocol.RecordReader, attr protocol.Attributes) protocol.RawRecordSet { 116 rs := protocol.RecordSet{Version: 2, Attributes: attr, Records: reader} 117 buf := &bytes.Buffer{} 118 rs.WriteTo(buf) 119 120 return protocol.RawRecordSet{ 121 Reader: buf, 122 } 123 }