private StreamBolt addBolt(TopologyBuilder topologyBuilder, String boltId, Set<ProcessorNode> initialProcessors, List<ProcessorNode> group) { ProcessorBolt bolt = new ProcessorBolt(boltId, graph, group); BoltDeclarer boltDeclarer = topologyBuilder.setBolt(boltId, bolt, getParallelism(group)); bolt.setStreamToInitialProcessors(wireBolt(group, boltDeclarer, initialProcessors)); streamBolts.put(bolt, boltDeclarer); return bolt; }
private void setUpProcessorBolt(Processor<?> processor, Set<String> windowedParentStreams, boolean isWindowed, String tsFieldName) { ProcessorNode node = new ProcessorNode(processor, "outputstream", new Fields("value")); node.setWindowedParentStreams(windowedParentStreams); node.setWindowed(isWindowed); Mockito.when(mockStreamToProcessors.get(Mockito.anyString())).thenReturn(Collections.singletonList(node)); Mockito.when(mockStreamToProcessors.keySet()).thenReturn(Collections.singleton("inputstream")); Map<GlobalStreamId, Grouping> mockSources = Mockito.mock(Map.class); GlobalStreamId mockGlobalStreamId = Mockito.mock(GlobalStreamId.class); Mockito.when(mockTopologyContext.getThisSources()).thenReturn(mockSources); Mockito.when(mockSources.keySet()).thenReturn(Collections.singleton(mockGlobalStreamId)); Mockito.when(mockGlobalStreamId.get_streamId()).thenReturn("inputstream"); Mockito.when(mockGlobalStreamId.get_componentId()).thenReturn("bolt0"); Mockito.when(mockTopologyContext.getComponentTasks(Mockito.anyString())).thenReturn(Collections.singletonList(1)); graph.addVertex(node); bolt = new ProcessorBolt("bolt1", graph, Collections.singletonList(node)); if (tsFieldName != null && !tsFieldName.isEmpty()) { bolt.setTimestampField(tsFieldName); } bolt.setStreamToInitialProcessors(mockStreamToProcessors); bolt.prepare(new HashMap<>(), mockTopologyContext, mockOutputCollector); }
@Test public void testEmitAndAck() throws Exception { setUpProcessorBolt(new FilterProcessor<Integer>(x -> true)); bolt.execute(mockTuple1); ArgumentCaptor<Collection> anchor = ArgumentCaptor.forClass(Collection.class); ArgumentCaptor<Values> values = ArgumentCaptor.forClass(Values.class); ArgumentCaptor<String> os = ArgumentCaptor.forClass(String.class); Mockito.verify(mockOutputCollector).emit(os.capture(), anchor.capture(), values.capture()); assertEquals("outputstream", os.getValue()); assertArrayEquals(new Object[]{ mockTuple1 }, anchor.getValue().toArray()); assertEquals(new Values(100), values.getValue()); Mockito.verify(mockOutputCollector, Mockito.times(1)).ack(mockTuple1); }
@Test public void testAggResultAndAck() throws Exception { setUpProcessorBolt(new AggregateProcessor<>(new LongSum()), Collections.singleton("inputstream"), true, null); bolt.execute(mockTuple2); bolt.execute(mockTuple3); bolt.execute(punctuation); ArgumentCaptor<Collection> anchor = ArgumentCaptor.forClass(Collection.class); ArgumentCaptor<Values> values = ArgumentCaptor.forClass(Values.class); ArgumentCaptor<String> os = ArgumentCaptor.forClass(String.class); Mockito.verify(mockOutputCollector, Mockito.times(2)).emit(os.capture(), anchor.capture(), values.capture()); assertArrayEquals(new Object[]{ mockTuple2, mockTuple3, punctuation }, anchor.getAllValues().get(0).toArray()); assertArrayEquals(new Object[]{ mockTuple2, mockTuple3, punctuation }, anchor.getAllValues().get(1).toArray()); assertArrayEquals(new Object[]{ new Values(200L), new Values("__punctuation") }, values.getAllValues().toArray()); assertArrayEquals(new Object[]{ "outputstream", "outputstream__punctuation" }, os.getAllValues().toArray()); Mockito.verify(mockOutputCollector).ack(mockTuple2); Mockito.verify(mockOutputCollector).ack(mockTuple3); Mockito.verify(mockOutputCollector).ack(punctuation); }
@Test public void testEmitTs() throws Exception { Tuple tupleWithTs = Mockito.mock(Tuple.class); setUpMockTuples(tupleWithTs); Mockito.when(tupleWithTs.getLongByField("ts")).thenReturn(12345L); setUpProcessorBolt(new FilterProcessor(x -> true), "ts"); bolt.execute(tupleWithTs); ArgumentCaptor<Collection> anchor = ArgumentCaptor.forClass(Collection.class); ArgumentCaptor<Values> values = ArgumentCaptor.forClass(Values.class); ArgumentCaptor<String> os = ArgumentCaptor.forClass(String.class); Mockito.verify(mockOutputCollector).emit(os.capture(), anchor.capture(), values.capture()); assertEquals("outputstream", os.getValue()); assertArrayEquals(new Object[]{ tupleWithTs }, anchor.getValue().toArray()); assertEquals(new Values(100, 12345L), values.getValue()); Mockito.verify(mockOutputCollector, Mockito.times(1)).ack(tupleWithTs); }