@Test(expected = IllegalStateException.class) public void shouldThrowOnAbortIfTransactionsNotInitialized() { buildMockProducer(true); producer.abortTransaction(); }
@Test public void shouldPreserveCommittedMessagesOnAbortIfTransactionsAreEnabled() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.send(record1); producer.send(record2); producer.commitTransaction(); producer.beginTransaction(); producer.abortTransaction(); List<ProducerRecord<byte[], byte[]>> expectedResult = new ArrayList<>(); expectedResult.add(record1); expectedResult.add(record2); assertThat(producer.history(), equalTo(expectedResult)); }
@Test public void shouldNotCountAbortedTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.abortTransaction(); producer.beginTransaction(); producer.commitTransaction(); assertThat(producer.commitCount(), equalTo(1L)); }
@Test public void shouldThrowOnAbortTransactionIfNoTransactionGotStarted() { buildMockProducer(true); producer.initTransactions(); try { producer.abortTransaction(); fail("Should have thrown as producer has no open transaction"); } catch (IllegalStateException e) { } }
@Test public void shouldThrowOnAbortForNonAutoCompleteIfTransactionsAreEnabled() throws Exception { buildMockProducer(false); producer.initTransactions(); producer.beginTransaction(); Future<RecordMetadata> md1 = producer.send(record1); assertFalse(md1.isDone()); producer.abortTransaction(); assertTrue(md1.isDone()); }
@Test public void shouldThrowOnAbortTransactionIfProducerIsClosed() { buildMockProducer(true); producer.close(); try { producer.abortTransaction(); fail("Should have thrown as producer is already closed"); } catch (IllegalStateException e) { } }
@Test public void shouldPreserveCommittedConsumerGroupsOffsetsOnAbortIfTransactionsAreEnabled() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); String group = "g"; Map<TopicPartition, OffsetAndMetadata> groupCommit = new HashMap<TopicPartition, OffsetAndMetadata>() { { put(new TopicPartition(topic, 0), new OffsetAndMetadata(42L, null)); put(new TopicPartition(topic, 1), new OffsetAndMetadata(73L, null)); } }; producer.sendOffsetsToTransaction(groupCommit, group); producer.commitTransaction(); producer.beginTransaction(); producer.abortTransaction(); Map<String, Map<TopicPartition, OffsetAndMetadata>> expectedResult = new HashMap<>(); expectedResult.put(group, groupCommit); assertThat(producer.consumerGroupOffsetsHistory(), equalTo(Collections.singletonList(expectedResult))); }
@Test public void shouldThrowOnAbortTransactionIfProducerGotFenced() { buildMockProducer(true); producer.initTransactions(); producer.fenceProducer(); try { producer.abortTransaction(); fail("Should have thrown as producer is fenced off"); } catch (ProducerFencedException e) { } }
@Test public void shouldDropMessagesOnAbortIfTransactionsAreEnabled() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.send(record1); producer.send(record2); producer.abortTransaction(); assertTrue(producer.history().isEmpty()); producer.beginTransaction(); producer.commitTransaction(); assertTrue(producer.history().isEmpty()); }
@Test public void shouldDropConsumerGroupOffsetsOnAbortIfTransactionsAreEnabled() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); String group = "g"; Map<TopicPartition, OffsetAndMetadata> groupCommit = new HashMap<TopicPartition, OffsetAndMetadata>() { { put(new TopicPartition(topic, 0), new OffsetAndMetadata(42L, null)); put(new TopicPartition(topic, 1), new OffsetAndMetadata(73L, null)); } }; producer.sendOffsetsToTransaction(groupCommit, group); producer.abortTransaction(); producer.beginTransaction(); producer.commitTransaction(); assertTrue(producer.consumerGroupOffsetsHistory().isEmpty()); }
@Test public void shouldAbortEmptyTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.abortTransaction(); assertFalse(producer.transactionInFlight()); assertTrue(producer.transactionAborted()); assertFalse(producer.transactionCommitted()); }
@Test public void testNoAbortAfterCommitFailure() { MockProducer<String, String> producer = spy(new MockProducer<>()); producer.initTransactions(); @SuppressWarnings("unchecked") ProducerFactory<String, String> pf = mock(ProducerFactory.class); given(pf.transactionCapable()).willReturn(true); given(pf.createProducer()).willReturn(producer); KafkaTemplate<String, String> template = new KafkaTemplate<>(pf); template.setDefaultTopic(STRING_KEY_TOPIC); assertThatThrownBy(() -> template.executeInTransaction(t -> { producer.fenceProducer(); return null; })).isInstanceOf(ProducerFencedException.class); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.transactionAborted()).isFalse(); assertThat(producer.closed()).isTrue(); verify(producer, never()).abortTransaction(); }