@Test(expected = IllegalStateException.class) public void shouldThrowFenceProducerIfTransactionsNotInitialized() { buildMockProducer(true); producer.fenceProducer(); }
@Test public void shouldThrowOnFenceProducerIfProducerIsClosed() { buildMockProducer(true); producer.close(); try { producer.fenceProducer(); fail("Should have thrown as producer is already closed"); } catch (IllegalStateException e) { } }
@Test public void shouldThrowOnCommitTransactionIfProducerGotFenced() { buildMockProducer(true); producer.initTransactions(); producer.fenceProducer(); try { producer.commitTransaction(); fail("Should have thrown as producer is fenced off"); } catch (ProducerFencedException e) { } }
@Test public void shouldThrowOnSendOffsetsToTransactionIfProducerGotFenced() { buildMockProducer(true); producer.initTransactions(); producer.fenceProducer(); try { producer.sendOffsetsToTransaction(null, null); fail("Should have thrown as producer is fenced off"); } catch (ProducerFencedException e) { } }
@Test public void shouldThrowOnBeginTransactionsIfProducerGotFenced() { buildMockProducer(true); producer.initTransactions(); producer.fenceProducer(); try { producer.beginTransaction(); fail("Should have thrown as producer is fenced off"); } catch (ProducerFencedException e) { } }
@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 shouldThrowOnSendIfProducerGotFenced() { buildMockProducer(true); producer.initTransactions(); producer.fenceProducer(); try { producer.send(null); fail("Should have thrown as producer is fenced off"); } catch (KafkaException e) { assertTrue("The root cause of the exception should be ProducerFenced", e.getCause() instanceof ProducerFencedException); } }
@Test public void testFencedOnBegin() { MockProducer<String, String> producer = spy(new MockProducer<>()); producer.initTransactions(); producer.fenceProducer(); @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 -> { return null; })).isInstanceOf(ProducerFencedException.class); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.transactionAborted()).isFalse(); assertThat(producer.closed()).isTrue(); verify(producer, never()).commitTransaction(); }
@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(); }
@Test public void testTransactionSynchronizationExceptionOnCommit() { MockProducer<String, String> producer = 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); ResourcelessTransactionManager tm = new ResourcelessTransactionManager(); new TransactionTemplate(tm).execute(s -> { template.sendDefault("foo", "bar"); // Mark the mock producer as fenced so it throws when committing the transaction producer.fenceProducer(); return null; }); assertThat(producer.transactionCommitted()).isFalse(); assertThat(producer.closed()).isTrue(); }