+ void commitsOffsetOfErrorForReprocessingOnDeserializationErrorInvalidMessage()
+ {
+ send100Messages((partition, key, counter) ->
+ {
+ Bytes value;
+ String type;
+
+ if (counter == 77)
+ {
+ value = serializeFooMessage(key, counter);
+ type = null;
+ }
+ else
+ {
+ if (counter%3 != 0)
+ {
+ value = serializeClientMessage(key, counter);
+ type = "message";
+ }
+ else {
+ value = serializeGreeting(key);
+ type = "greeting";
+ }
+ }
+
+ return toRecord(partition, key, value, Optional.ofNullable(type));
+ });
+
+ await("Consumer failed")
+ .atMost(Duration.ofSeconds(30))
+ .pollInterval(Duration.ofSeconds(1))
+ .until(() -> !endlessConsumer.running());
+
+ checkSeenOffsetsForProgress();
+ compareToCommitedOffsets(newOffsets);
+
+ endlessConsumer.start();
+ await("Consumer failed")
+ .atMost(Duration.ofSeconds(30))
+ .pollInterval(Duration.ofSeconds(1))
+ .until(() -> !endlessConsumer.running());
+
+ checkSeenOffsetsForProgress();
+ compareToCommitedOffsets(newOffsets);
+ assertThat(receivedRecords.size())
+ .describedAs("Received not all sent events")
+ .isLessThan(100);
+
+ assertThatNoException()
+ .describedAs("Consumer should not be running")
+ .isThrownBy(() -> endlessConsumer.exitStatus());
+ assertThat(endlessConsumer.exitStatus())
+ .describedAs("Consumer should have exited abnormally")
+ .containsInstanceOf(RecordDeserializationException.class);
+ }
+
+ @Test
+ void commitsOffsetOfErrorForReprocessingOnDeserializationErrorOnUnknownMessage()