X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Ftest%2Fjava%2Fde%2Fjuplo%2Fkafka%2FApplicationTests.java;h=1336050a436a4990c9b8391faa06e86100326ce8;hb=ecadcd52ab7fe117fef3450a27b9d6ecdf621716;hp=4ddf8a909c509a336180aaa670f4e54dda06b084;hpb=c9d7601fc551069cd3a77da06a6333f22101a8a0;p=demos%2Fkafka%2Ftraining diff --git a/src/test/java/de/juplo/kafka/ApplicationTests.java b/src/test/java/de/juplo/kafka/ApplicationTests.java index 4ddf8a9..1336050 100644 --- a/src/test/java/de/juplo/kafka/ApplicationTests.java +++ b/src/test/java/de/juplo/kafka/ApplicationTests.java @@ -3,82 +3,122 @@ package de.juplo.kafka; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringSerializer; import org.apache.kafka.common.utils.Bytes; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.*; import java.util.function.Consumer; +import java.util.stream.Collectors; import java.util.stream.IntStream; +import static org.assertj.core.api.Assertions.assertThat; + public class ApplicationTests extends GenericApplicationTests { + @Autowired + AdderResults results; + + public ApplicationTests() { - super( - new RecordGenerator() + super(new ApplicationTestRecrodGenerator()); + ((ApplicationTestRecrodGenerator)recordGenerator).tests = this; + } + + + static class ApplicationTestRecrodGenerator implements RecordGenerator + { + ApplicationTests tests; + + final int[] numbers = {1, 7, 3, 2, 33, 6, 11}; + final String[] dieWilden13 = + IntStream + .range(1, 14) + .mapToObj(i -> "seeräuber-" + i) + .toArray(i -> new String[i]); + final StringSerializer stringSerializer = new StringSerializer(); + final Bytes calculateMessage = new Bytes(stringSerializer.serialize(TOPIC, "CALCULATE")); + + int counter = 0; + + Map> state; + + @Override + public int generate( + boolean poisonPills, + boolean logicErrors, + Consumer> messageSender) + { + counter = 0; + state = + Arrays + .stream(dieWilden13) + .collect(Collectors.toMap( + seeräuber -> seeräuber, + seeräuber -> new LinkedList())); + + for (int i = 0; i < 33; i++) + { + String seeräuber = dieWilden13[i % 13]; + int number = numbers[i % 7]; + + Bytes key = new Bytes(stringSerializer.serialize(TOPIC, seeräuber)); + + for (int message = 1; message <= number; message++) { - final int[] numbers = { 1, 7, 3, 2, 33, 6, 11 }; - final String[] dieWilden13 = - IntStream - .range(1,14) - .mapToObj(i -> "seeräuber-" + i) - .toArray(i -> new String[i]); - final StringSerializer stringSerializer = new StringSerializer(); - final Bytes startMessage = new Bytes(stringSerializer.serialize(TOPIC, "START")); - final Bytes endMessage = new Bytes(stringSerializer.serialize(TOPIC, "END")); - - int counter = 0; - - - @Override - public int generate( - boolean poisonPills, - boolean logicErrors, - Consumer> messageSender) - { - counter = 0; - - for (int i = 0; i < 33; i++) - { - String seeräuber = dieWilden13[i%13]; - int number = numbers[i%7]; - - Bytes key = new Bytes(stringSerializer.serialize(TOPIC, seeräuber)); - - send(key, startMessage, logicErrors, messageSender); - for (int message = 1; message <= number; message++) - { - Bytes value = new Bytes(stringSerializer.serialize(TOPIC, Integer.toString(message))); - send(key, value, logicErrors, messageSender); - } - send(key, endMessage, logicErrors, messageSender); - } - - return counter; - } - - void send( - Bytes key, - Bytes value, - boolean logicErrors, - Consumer> messageSender) - { - counter++; + Bytes value = new Bytes(stringSerializer.serialize(TOPIC, Integer.toString(message))); + send(key, value, logicErrors, messageSender); + } + send(key, calculateMessage, logicErrors, messageSender); + + state.get(seeräuber).add(new AdderResult(number, (number + 1) * number / 2)); + } - if (counter == 77) - { - if (logicErrors) - { - value = value.equals(startMessage) ? endMessage : startMessage; - } - } + return counter; + } - messageSender.accept(new ProducerRecord<>(TOPIC, key, value)); - } + void send( + Bytes key, + Bytes value, + boolean logicErrors, + Consumer> messageSender) + { + counter++; - @Override - public boolean canGeneratePoisonPill() + if (counter == 77) + { + if (logicErrors) + { + value = new Bytes(stringSerializer.serialize(TOPIC, Integer.toString(-1))); + } + } + + messageSender.accept(new ProducerRecord<>(TOPIC, key, value)); + } + + @Override + public boolean canGeneratePoisonPill() + { + return false; + } + + @Override + public void assertBusinessLogic() + { + tests.results + .getState() + .values() + .stream() + .flatMap(map -> map.entrySet().stream()) + .forEach(entry -> { - return false; - } - }); + String user = entry.getKey(); + List resultsForUser = entry.getValue(); + + assertThat(state.get(user)) + .describedAs("Unexpected results for user {}", user) + .containsExactlyElementsOf(resultsForUser); + }); + } } }