| package geode.kafka.source; |
| |
| import geode.kafka.GeodeContext; |
| import org.apache.geode.cache.client.ClientCache; |
| import org.apache.geode.cache.query.CqEvent; |
| import org.junit.Test; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.concurrent.BlockingQueue; |
| import java.util.concurrent.LinkedBlockingQueue; |
| |
| import static geode.kafka.source.GeodeSourceConnectorConfig.DEFAULT_CQ_PREFIX; |
| import static org.apache.geode.pdx.internal.PeerTypeRegistration.REGION_NAME; |
| import static org.hamcrest.CoreMatchers.is; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertThat; |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.ArgumentMatchers.anyBoolean; |
| import static org.mockito.ArgumentMatchers.anyString; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.times; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| |
| public class GeodeKafkaSourceTaskTest { |
| |
| |
| @Test |
| public void whenLoadingEntireRegionAbleToPutInitialResultsIntoEventBuffer() { |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| BlockingQueue<GeodeEvent> eventBuffer = new LinkedBlockingQueue(100); |
| boolean loadEntireRegion = true; |
| boolean isDurable = false; |
| List<CqEvent> fakeInitialResults = new LinkedList<>(); |
| for (int i = 0; i < 10; i++) { |
| fakeInitialResults.add(mock(CqEvent.class)); |
| } |
| |
| when(geodeContext.newCqWithInitialResults(anyString(), anyString(), any(), anyBoolean())).thenReturn(fakeInitialResults); |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| task.installListenersToRegion(geodeContext, 1, eventBuffer, "testRegion", DEFAULT_CQ_PREFIX, loadEntireRegion, isDurable); |
| assertEquals(10, eventBuffer.size()); |
| } |
| |
| @Test |
| public void whenNotLoadingEntireRegionShouldNotPutInitialResultsIntoEventBuffer() { |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| BlockingQueue<GeodeEvent> eventBuffer = new LinkedBlockingQueue(100); |
| boolean loadEntireRegion = false; |
| boolean isDurable = false; |
| List<CqEvent> fakeInitialResults = new LinkedList<>(); |
| for (int i = 0; i < 10; i++) { |
| fakeInitialResults.add(mock(CqEvent.class)); |
| } |
| |
| when(geodeContext.newCqWithInitialResults(anyString(), anyString(), any(), anyBoolean())).thenReturn(fakeInitialResults); |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| task.installListenersToRegion(geodeContext, 1, eventBuffer, "testRegion", DEFAULT_CQ_PREFIX, loadEntireRegion, isDurable); |
| assertEquals(0, eventBuffer.size()); |
| } |
| |
| @Test |
| public void cqListenerOnEventPopulatesEventsBuffer() { |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| BlockingQueue<GeodeEvent> eventBuffer = new LinkedBlockingQueue(100); |
| boolean loadEntireRegion = false; |
| boolean isDurable = false; |
| |
| when(geodeContext.newCqWithInitialResults(anyString(), anyString(), any(), anyBoolean())).thenReturn(new ArrayList()); |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| GeodeKafkaSourceListener listener = task.installListenersToRegion(geodeContext, 1, eventBuffer, "testRegion", DEFAULT_CQ_PREFIX, loadEntireRegion, isDurable); |
| |
| listener.onEvent(mock(CqEvent.class)); |
| assertEquals(1, eventBuffer.size()); |
| } |
| |
| @Test |
| public void readyForEventsIsCalledIfDurable() { |
| ClientCache clientCache = mock(ClientCache.class); |
| |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| when(geodeContext.getClientCache()).thenReturn(clientCache); |
| |
| GeodeSourceConnectorConfig config = mock(GeodeSourceConnectorConfig.class); |
| when (config.isDurable()).thenReturn(true); |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| task.installOnGeode(config, geodeContext, null, "", false); |
| verify(clientCache, times(1)).readyForEvents(); |
| } |
| |
| @Test |
| public void cqIsInvokedForEveryRegionWithATopic() { |
| ClientCache clientCache = mock(ClientCache.class); |
| |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| when(geodeContext.getClientCache()).thenReturn(clientCache); |
| |
| Map<String, List<String>> regionToTopicsMap = new HashMap<>(); |
| regionToTopicsMap.put("region1", new ArrayList()); |
| |
| GeodeSourceConnectorConfig config = mock(GeodeSourceConnectorConfig.class); |
| when (config.getRegionToTopics()).thenReturn(regionToTopicsMap); |
| |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| task.installOnGeode(config, geodeContext, null, "someCqPrefix", false); |
| verify(geodeContext, times(1)).newCq(anyString(), anyString(), any(), anyBoolean()); |
| } |
| |
| @Test |
| public void cqWithInitialResultsIsInvokedForEveryRegionWithATopicIfLoadEntireIsSet() { |
| ClientCache clientCache = mock(ClientCache.class); |
| |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| when(geodeContext.getClientCache()).thenReturn(clientCache); |
| |
| Map<String, List<String>> regionToTopicsMap = new HashMap<>(); |
| regionToTopicsMap.put("region1", new ArrayList()); |
| |
| GeodeSourceConnectorConfig config = mock(GeodeSourceConnectorConfig.class); |
| when (config.getRegionToTopics()).thenReturn(regionToTopicsMap); |
| |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| task.installOnGeode(config, geodeContext, new LinkedBlockingQueue(), "someCqPrefix", true); |
| verify(geodeContext, times(1)).newCqWithInitialResults(anyString(), anyString(), any(), anyBoolean()); |
| } |
| |
| @Test |
| public void readyForEventsIsNotCalledIfNotDurable() { |
| ClientCache clientCache = mock(ClientCache.class); |
| |
| GeodeContext geodeContext = mock(GeodeContext.class); |
| when(geodeContext.getClientCache()).thenReturn(clientCache); |
| |
| GeodeSourceConnectorConfig config = mock(GeodeSourceConnectorConfig.class); |
| when (config.isDurable()).thenReturn(false); |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| task.installOnGeode(config, geodeContext, null, "", false); |
| verify(clientCache, times(0)).readyForEvents(); |
| } |
| |
| @Test |
| public void pollReturnsEventsWhenEventBufferHasValues() throws Exception { |
| // BlockingQueue<GeodeEvent> eventBuffer = new LinkedBlockingQueue(100); |
| // CqEvent cqEvent = mock(CqEvent.class); |
| // when(cqEvent.getNewValue()).thenReturn("New Value"); |
| // GeodeEvent event = mock(GeodeEvent.class); |
| // when(event.getEvent()).thenReturn(cqEvent); |
| // eventBuffer.add(event); |
| // |
| // List<String> topics = new ArrayList<>(); |
| // topics.add("myTopic"); |
| // |
| // GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| // task.startForTesting(eventBuffer, topics, 1); |
| // List<SourceRecord> records = task.poll(); |
| // assertEquals(1, records.size()); |
| } |
| |
| @Test |
| public void installOnGeodeShouldCallCq() { |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| } |
| |
| |
| |
| |
| |
| @Test |
| public void createSourcePartitionsShouldReturnAMapOfSourcePartitions() { |
| GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| List<String> regionNames = Arrays.asList(new String[]{"region1", "region2", "region3"}); |
| Map<String, Map<String,String>> sourcePartitions = task.createSourcePartitionsMap(regionNames); |
| assertThat(3, is(sourcePartitions.size())); |
| assertThat(true, is(sourcePartitions.get("region1").get(REGION_NAME).equals("region1"))); |
| assertThat(true, is(sourcePartitions.get("region2").get(REGION_NAME).equals("region2"))); |
| assertThat(true, is(sourcePartitions.get("region3").get(REGION_NAME).equals("region3"))); |
| } |
| |
| @Test |
| public void listOfLocatorsShouldBeConfiguredIntoClientCache() { |
| |
| } |
| |
| @Test |
| public void shouldNotBeDurableIfDurableClientIdIsNull() { |
| |
| } |
| |
| @Test |
| public void shouldNotCallReadyForEventsIfDurableClientPrefixIsEmpty() { |
| |
| } |
| |
| |
| @Test |
| public void cqPrefixShouldBeProperlyCalculatedFromProps() { |
| // GeodeContext geodeContext = mock(GeodeContext.class); |
| // GeodeKafkaSourceTask task = new GeodeKafkaSourceTask(); |
| } |
| |
| } |