@Test(expected = IllegalStateException.class) public void shouldThrowOnSendOffsetsToTransactionIfTransactionsNotInitialized() { buildMockProducer(true); producer.sendOffsetsToTransaction(null, null); }
@Test public void shouldThrowOnNullConsumerGroupIdWhenSendOffsetsToTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); try { producer.sendOffsetsToTransaction(Collections.<TopicPartition, OffsetAndMetadata>emptyMap(), null); fail("Should have thrown NullPointerException"); } catch (NullPointerException e) { } }
@Test public void shouldThrowSendOffsetsToTransactionIfProducerIsClosed() { buildMockProducer(true); producer.close(); try { producer.sendOffsetsToTransaction(null, null); fail("Should have thrown as producer is already closed"); } catch (IllegalStateException e) { } }
@Test public void shouldThrowOnSendOffsetsToTransactionTransactionIfNoTransactionGotStarted() { buildMockProducer(true); producer.initTransactions(); try { producer.sendOffsetsToTransaction(null, null); fail("Should have thrown as producer has no open transaction"); } catch (IllegalStateException e) { } }
@Test public void shouldIgnoreEmptyOffsetsWhenSendOffsetsToTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); producer.sendOffsetsToTransaction(Collections.<TopicPartition, OffsetAndMetadata>emptyMap(), "groupId"); assertFalse(producer.sentOffsets()); }
@Test public void shouldPublishConsumerGroupOffsetsOnlyAfterCommitIfTransactionsAreEnabled() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); String group1 = "g1"; Map<TopicPartition, OffsetAndMetadata> group1Commit = new HashMap<TopicPartition, OffsetAndMetadata>() { { put(new TopicPartition(topic, 0), new OffsetAndMetadata(42L, null)); put(new TopicPartition(topic, 1), new OffsetAndMetadata(73L, null)); } }; String group2 = "g2"; Map<TopicPartition, OffsetAndMetadata> group2Commit = new HashMap<TopicPartition, OffsetAndMetadata>() { { put(new TopicPartition(topic, 0), new OffsetAndMetadata(101L, null)); put(new TopicPartition(topic, 1), new OffsetAndMetadata(21L, null)); } }; producer.sendOffsetsToTransaction(group1Commit, group1); producer.sendOffsetsToTransaction(group2Commit, group2); assertTrue(producer.consumerGroupOffsetsHistory().isEmpty()); Map<String, Map<TopicPartition, OffsetAndMetadata>> expectedResult = new HashMap<>(); expectedResult.put(group1, group1Commit); expectedResult.put(group2, group2Commit); producer.commitTransaction(); assertThat(producer.consumerGroupOffsetsHistory(), equalTo(Collections.singletonList(expectedResult))); }
@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 shouldThrowOnSendOffsetsToTransactionIfProducerGotFenced() { buildMockProducer(true); producer.initTransactions(); producer.fenceProducer(); try { producer.sendOffsetsToTransaction(null, null); fail("Should have thrown as producer is fenced off"); } catch (ProducerFencedException e) { } }
producer.sendOffsetsToTransaction(groupCommit1, group); producer.sendOffsetsToTransaction(groupCommit2, group);
@Test public void shouldAddOffsetsWhenSendOffsetsToTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); assertFalse(producer.sentOffsets()); Map<TopicPartition, OffsetAndMetadata> groupCommit = new HashMap<TopicPartition, OffsetAndMetadata>() { { put(new TopicPartition(topic, 0), new OffsetAndMetadata(42L, null)); } }; producer.sendOffsetsToTransaction(groupCommit, "groupId"); assertTrue(producer.sentOffsets()); }
@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 shouldResetSentOffsetsFlagOnlyWhenBeginningNewTransaction() { buildMockProducer(true); producer.initTransactions(); producer.beginTransaction(); assertFalse(producer.sentOffsets()); Map<TopicPartition, OffsetAndMetadata> groupCommit = new HashMap<TopicPartition, OffsetAndMetadata>() { { put(new TopicPartition(topic, 0), new OffsetAndMetadata(42L, null)); } }; producer.sendOffsetsToTransaction(groupCommit, "groupId"); producer.commitTransaction(); // commit should not reset "sentOffsets" flag assertTrue(producer.sentOffsets()); producer.beginTransaction(); assertFalse(producer.sentOffsets()); }