WIP
[demos/kafka/training] / src / test / java / de / juplo / kafka / ApplicationTests.java
1 package de.juplo.kafka;
2
3 import lombok.extern.slf4j.Slf4j;
4 import org.apache.kafka.common.errors.InvalidProducerEpochException;
5 import org.junit.jupiter.api.*;
6 import org.junit.jupiter.api.extension.ExtendWith;
7 import org.springframework.beans.factory.annotation.Value;
8 import org.springframework.kafka.test.context.EmbeddedKafka;
9 import org.springframework.test.context.junit.jupiter.SpringExtension;
10
11 import java.time.Duration;
12 import java.util.concurrent.CompletableFuture;
13
14 import static de.juplo.kafka.ApplicationTests.PARTITIONS;
15 import static de.juplo.kafka.ApplicationTests.TOPIC;
16 import static org.assertj.core.api.Assertions.*;
17 import static org.awaitility.Awaitility.*;
18
19
20 @ExtendWith(SpringExtension.class)
21 @EmbeddedKafka(
22   topics = TOPIC,
23   partitions = PARTITIONS,
24   brokerProperties = {
25     "transaction.state.log.replication.factor=1",
26     "transaction.state.log.min.isr=1" })
27 @Slf4j
28 public class ApplicationTests
29 {
30         static final String TOPIC = "FOO";
31         static final int PARTITIONS = 10;
32
33   @Value("${spring.embedded.kafka.brokers}")
34   String bootstrapServers;
35
36         @Test
37         void testConcurrentProducers() throws Exception
38         {
39     SimpleProducer instanceA = new SimpleProducer(
40       bootstrapServers,
41       TOPIC,
42       "FOO");
43
44     instanceA.begin();
45     CompletableFuture<Long> resultA1 = instanceA.send("a","message #1");
46                 await("Sending of 1. message for A is completed")
47                                 .atMost(Duration.ofSeconds(5))
48                                 .until(() -> resultA1.isDone());
49     assertThat(resultA1.isCompletedExceptionally()).isFalse();
50
51     SimpleProducer instanceB = new SimpleProducer(
52       bootstrapServers,
53       TOPIC,
54       "FOO");
55
56     instanceB.begin();
57     CompletableFuture<Long> resultB1 = instanceB.send("b","message #1");
58     await("Sending of 1. message for B is completed")
59       .atMost(Duration.ofSeconds(5))
60       .until(() -> resultB1.isDone());
61     assertThat(resultB1.isCompletedExceptionally()).isFalse();
62
63     CompletableFuture<Long> resultA2 = instanceA.send("a","message #2");
64     await("Sending of 2. message for A is completed")
65       .atMost(Duration.ofSeconds(5))
66       .until(() -> resultA2.isDone());
67     assertThat(resultA2.isCompletedExceptionally()).isTrue();
68
69     CompletableFuture<Long> resultB2 = instanceB.send("b","message #2");
70     await("Sending of 2. message for B is completed")
71       .atMost(Duration.ofSeconds(5))
72       .until(() -> resultB2.isDone());
73     assertThat(resultB2.isCompletedExceptionally()).isFalse();
74
75     assertThatThrownBy(() -> instanceA.commit()).isInstanceOf(InvalidProducerEpochException.class);
76     assertThatCode(() -> instanceB.commit()).doesNotThrowAnyException();
77   }
78 }
79 รข