1313import org .apache .kafka .clients .producer .KafkaProducer ;
1414import org .apache .kafka .clients .producer .ProducerConfig ;
1515import org .apache .kafka .clients .producer .ProducerRecord ;
16+ import org .apache .kafka .common .header .Header ;
17+ import org .apache .kafka .common .header .internals .RecordHeader ;
18+ import org .apache .kafka .common .header .internals .RecordHeaders ;
1619import org .junit .jupiter .api .AfterEach ;
1720import org .junit .jupiter .api .BeforeEach ;
1821import org .junit .jupiter .api .Test ;
3639import org .slf4j .Logger ;
3740import org .slf4j .LoggerFactory ;
3841
42+ import java .nio .charset .StandardCharsets ;
3943import java .time .Duration ;
4044import java .util .ArrayList ;
45+ import java .util .Arrays ;
4146import java .util .Collection ;
4247import java .util .Collections ;
4348import java .util .List ;
4954
5055import static org .awaitility .Awaitility .await ;
5156import static org .hamcrest .CoreMatchers .equalTo ;
57+ import static org .hamcrest .CoreMatchers .not ;
5258import static org .hamcrest .MatcherAssert .assertThat ;
5359import static org .mockito .ArgumentMatchers .any ;
5460import static org .mockito .ArgumentMatchers .anyString ;
5561import static org .mockito .Mockito .doAnswer ;
5662import static org .mockito .Mockito .mock ;
5763import static org .mockito .Mockito .when ;
5864
65+
5966public class KafkaSourceJsonTypeIT {
6067 private static final Logger LOG = LoggerFactory .getLogger (KafkaSourceJsonTypeIT .class );
6168 private static final int TEST_ID = 123456 ;
@@ -98,13 +105,21 @@ public class KafkaSourceJsonTypeIT {
98105 private String testKey ;
99106 private String testTopic ;
100107 private String testGroup ;
108+ private String headerKey1 ;
109+ private byte [] headerValue1 ;
110+ private String headerKey2 ;
111+ private byte [] headerValue2 ;
101112
102113 public KafkaSource createObjectUnderTest () {
103114 return new KafkaSource (sourceConfig , pluginMetrics , acknowledgementSetManager , pipelineDescription , kafkaClusterConfigSupplier , pluginConfigObservable );
104115 }
105116
106117 @ BeforeEach
107118 public void setup () throws Throwable {
119+ headerKey1 = RandomStringUtils .randomAlphabetic (6 );
120+ headerValue1 = RandomStringUtils .randomAlphabetic (10 ).getBytes (StandardCharsets .UTF_8 );
121+ headerKey2 = RandomStringUtils .randomAlphabetic (5 );
122+ headerValue2 = RandomStringUtils .randomAlphabetic (15 ).getBytes (StandardCharsets .UTF_8 );
108123 sourceConfig = mock (KafkaSourceConfig .class );
109124 pluginMetrics = mock (PluginMetrics .class );
110125 counter = mock (Counter .class );
@@ -209,6 +224,13 @@ public void TestJsonRecordsWithNullKey() throws Exception {
209224 assertThat (map .get ("kafka_key" ), equalTo (null ));
210225 assertThat (metadata .getAttributes ().get ("kafka_topic" ), equalTo (testTopic ));
211226 assertThat (metadata .getAttributes ().get ("kafka_partition" ), equalTo ("0" ));
227+ Map <String , byte []> kafkaHeaders = (Map <String , byte []>) metadata .getAttributes ().get ("kafka_headers" );
228+ assertThat (kafkaHeaders .get (headerKey1 ), equalTo (headerValue1 ));
229+ assertThat (kafkaHeaders .get (headerKey2 ), equalTo (headerValue2 ));
230+ assertThat (metadata .getAttributes ().get ("kafka_timestamp" ), not (equalTo (null )));
231+ assertThat (metadata .getAttributes ().get ("kafka_timestamp_type" ), equalTo ("CreateTime" ));
232+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey1 ), equalTo (headerValue1 ));
233+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey2 ), equalTo (headerValue2 ));
212234 }
213235 }
214236
@@ -240,6 +262,13 @@ public void TestJsonRecordsWithNegativeAcknowledgements() throws Exception {
240262 assertThat (map .get ("status" ), equalTo (true ));
241263 assertThat (metadata .getAttributes ().get ("kafka_topic" ), equalTo (testTopic ));
242264 assertThat (metadata .getAttributes ().get ("kafka_partition" ), equalTo ("0" ));
265+ Map <String , byte []> kafkaHeaders = (Map <String , byte []>) metadata .getAttributes ().get ("kafka_headers" );
266+ assertThat (kafkaHeaders .get (headerKey1 ), equalTo (headerValue1 ));
267+ assertThat (kafkaHeaders .get (headerKey2 ), equalTo (headerValue2 ));
268+ assertThat (metadata .getAttributes ().get ("kafka_timestamp" ), not (equalTo (null )));
269+ assertThat (metadata .getAttributes ().get ("kafka_timestamp_type" ), equalTo ("CreateTime" ));
270+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey1 ), equalTo (headerValue1 ));
271+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey2 ), equalTo (headerValue2 ));
243272 event .getEventHandle ().release (false );
244273 }
245274 receivedRecords .clear ();
@@ -258,6 +287,13 @@ public void TestJsonRecordsWithNegativeAcknowledgements() throws Exception {
258287 assertThat (map .get ("status" ), equalTo (true ));
259288 assertThat (metadata .getAttributes ().get ("kafka_topic" ), equalTo (testTopic ));
260289 assertThat (metadata .getAttributes ().get ("kafka_partition" ), equalTo ("0" ));
290+ Map <String , byte []> kafkaHeaders = (Map <String , byte []>) metadata .getAttributes ().get ("kafka_headers" );
291+ assertThat (kafkaHeaders .get (headerKey1 ), equalTo (headerValue1 ));
292+ assertThat (kafkaHeaders .get (headerKey2 ), equalTo (headerValue2 ));
293+ assertThat (metadata .getAttributes ().get ("kafka_timestamp" ), not (equalTo (null )));
294+ assertThat (metadata .getAttributes ().get ("kafka_timestamp_type" ), equalTo ("CreateTime" ));
295+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey1 ), equalTo (headerValue1 ));
296+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey2 ), equalTo (headerValue2 ));
261297 event .getEventHandle ().release (true );
262298 }
263299 }
@@ -289,6 +325,13 @@ public void TestJsonRecordsWithKafkaKeyModeDiscard() throws Exception {
289325 assertThat (map .get ("status" ), equalTo (true ));
290326 assertThat (metadata .getAttributes ().get ("kafka_topic" ), equalTo (testTopic ));
291327 assertThat (metadata .getAttributes ().get ("kafka_partition" ), equalTo ("0" ));
328+ Map <String , byte []> kafkaHeaders = (Map <String , byte []>) metadata .getAttributes ().get ("kafka_headers" );
329+ assertThat (kafkaHeaders .get (headerKey1 ), equalTo (headerValue1 ));
330+ assertThat (kafkaHeaders .get (headerKey2 ), equalTo (headerValue2 ));
331+ assertThat (metadata .getAttributes ().get ("kafka_timestamp" ), not (equalTo (null )));
332+ assertThat (metadata .getAttributes ().get ("kafka_timestamp_type" ), equalTo ("CreateTime" ));
333+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey1 ), equalTo (headerValue1 ));
334+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey2 ), equalTo (headerValue2 ));
292335 }
293336 }
294337
@@ -320,6 +363,13 @@ public void TestJsonRecordsWithKafkaKeyModeAsField() throws Exception {
320363 assertThat (map .get ("kafka_key" ), equalTo (testKey ));
321364 assertThat (metadata .getAttributes ().get ("kafka_topic" ), equalTo (testTopic ));
322365 assertThat (metadata .getAttributes ().get ("kafka_partition" ), equalTo ("0" ));
366+ Map <String , byte []> kafkaHeaders = (Map <String , byte []>) metadata .getAttributes ().get ("kafka_headers" );
367+ assertThat (kafkaHeaders .get (headerKey1 ), equalTo (headerValue1 ));
368+ assertThat (kafkaHeaders .get (headerKey2 ), equalTo (headerValue2 ));
369+ assertThat (metadata .getAttributes ().get ("kafka_timestamp" ), not (equalTo (null )));
370+ assertThat (metadata .getAttributes ().get ("kafka_timestamp_type" ), equalTo ("CreateTime" ));
371+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey1 ), equalTo (headerValue1 ));
372+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey2 ), equalTo (headerValue2 ));
323373 }
324374 }
325375
@@ -351,6 +401,13 @@ public void TestJsonRecordsWithKafkaKeyModeAsMetadata() throws Exception {
351401 assertThat (metadata .getAttributes ().get ("kafka_key" ), equalTo (testKey ));
352402 assertThat (metadata .getAttributes ().get ("kafka_topic" ), equalTo (testTopic ));
353403 assertThat (metadata .getAttributes ().get ("kafka_partition" ), equalTo ("0" ));
404+ Map <String , byte []> kafkaHeaders = (Map <String , byte []>) metadata .getAttributes ().get ("kafka_headers" );
405+ assertThat (kafkaHeaders .get (headerKey1 ), equalTo (headerValue1 ));
406+ assertThat (kafkaHeaders .get (headerKey2 ), equalTo (headerValue2 ));
407+ assertThat (metadata .getAttributes ().get ("kafka_timestamp" ), not (equalTo (null )));
408+ assertThat (metadata .getAttributes ().get ("kafka_timestamp_type" ), equalTo ("CreateTime" ));
409+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey1 ), equalTo (headerValue1 ));
410+ assertThat (metadata .getAttribute ("kafka_headers/" +headerKey2 ), equalTo (headerValue2 ));
354411 }
355412 }
356413
@@ -364,8 +421,12 @@ public void produceJsonRecords(final String servers, final String topicName, fin
364421 KafkaProducer producer = new KafkaProducer (props );
365422 for (int i = 0 ; i < numRecords ; i ++) {
366423 String value = "{\" name\" :\" testName" + i + "\" , \" id\" :" + (TEST_ID + i ) + ", \" status\" :true}" ;
424+ List <Header > headers = Arrays .asList (
425+ new RecordHeader (headerKey1 , headerValue1 ),
426+ new RecordHeader (headerKey2 , headerValue2 )
427+ );
367428 ProducerRecord <String , String > record =
368- new ProducerRecord <>(topicName , testKey , value );
429+ new ProducerRecord <>(topicName , null , testKey , value , new RecordHeaders ( headers ) );
369430 producer .send (record );
370431 try {
371432 Thread .sleep (100 );
0 commit comments