package main.java.bolts; import static main.java.utils.constants.WorkberchConstants.INDEX_FIELD; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.verifyStatic; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import main.java.utils.cartesianindex.CartesianIndex; import main.java.utils.cartesianindex.CartesianLeaf; import main.java.utils.cartesianindex.CartesianNode; import main.java.utils.redis.RedisHandeler; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import backtype.storm.generated.GlobalStreamId; import backtype.storm.generated.Grouping; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; @RunWith(PowerMockRunner.class) @PrepareForTest({ RedisHandeler.class }) public class WorkberchCartesianBoltTest { private class IndexMatcher extends ArgumentMatcher<List<Object>> { private final CartesianIndex templateIndex; public IndexMatcher(final CartesianIndex templateIndex) { this.templateIndex = templateIndex; } @Override public boolean matches(final Object argument) { @SuppressWarnings("unchecked") final List<Object> values = (List<Object>) argument; final Iterator<Object> iterV = values.iterator(); while (iterV.hasNext()) { final Object value = iterV.next(); if (value instanceof CartesianIndex) { return !iterV.hasNext() && ((CartesianIndex) value).equals(templateIndex); } } return false; } } @Before public void before() { mockStatic(RedisHandeler.class); } @Test public void testReceivedFieldsFromTwoDifferentSources() { final List<String> recivedFields = new ArrayList<String>(); recivedFields.add("dummyField1"); recivedFields.add("dummyField2"); final WorkberchCartesianBolt cartesianBolt = spy(new WorkberchCartesianBolt("mockGuid", recivedFields)); final Tuple stormTuple1 = mock(Tuple.class); final Tuple stormTuple2 = mock(Tuple.class); given(stormTuple1.getFields()).willReturn(new Fields("dummyField1", INDEX_FIELD)); given(stormTuple2.getFields()).willReturn(new Fields("dummyField2", INDEX_FIELD)); given(stormTuple1.getValueByField(INDEX_FIELD)).willReturn(0L); given(stormTuple2.getValueByField(INDEX_FIELD)).willReturn(0L); given(stormTuple1.getValueByField("dummyField1")).willReturn("dummyValue1"); given(stormTuple2.getValueByField("dummyField2")).willReturn("dummyValue2"); given(stormTuple1.getSourceComponent()).willReturn("dummySource1"); given(stormTuple2.getSourceComponent()).willReturn("dummySource2"); final CartesianIndex leaf1 = new CartesianLeaf(0L); final CartesianIndex leaf2 = new CartesianLeaf(0L); final List<CartesianIndex> leafs = new ArrayList<CartesianIndex>(); leafs.add(leaf1); leafs.add(leaf2); final CartesianIndex index = new CartesianNode(leafs); final GlobalStreamId stream1 = mock(GlobalStreamId.class); given(stream1.get_componentId()).willReturn("dummySource1"); final GlobalStreamId stream2 = mock(GlobalStreamId.class); given(stream2.get_componentId()).willReturn("dummySource2"); final Set<GlobalStreamId> keyStreams = new HashSet<GlobalStreamId>(); keyStreams.add(stream1); keyStreams.add(stream2); @SuppressWarnings("unchecked") final Map<GlobalStreamId, Grouping> contextMap = mock(Map.class); given(contextMap.keySet()).willReturn(keyStreams); final TopologyContext context = mock(TopologyContext.class); given(context.getThisComponentId()).willReturn("dummyComponent"); given(context.getThisSources()).willReturn(contextMap); cartesianBolt.prepare(mock(Map.class), context); given(RedisHandeler.getEmitedState("dummySource1")).willReturn(1L); given(RedisHandeler.getEmitedState("dummySource2")).willReturn(0L); cartesianBolt.execute(stormTuple1, mock(BasicOutputCollector.class)); verify(cartesianBolt, never()).emitTuple(anyListOf(Object.class), any(BasicOutputCollector.class), anyBoolean(), anyString()); verifyStatic(); RedisHandeler.increseRecivedState(anyString()); given(RedisHandeler.getEmitedState("dummySource2")).willReturn(1L); cartesianBolt.execute(stormTuple2, mock(BasicOutputCollector.class)); verifyStatic(times(2)); RedisHandeler.increseRecivedState(anyString()); verify(cartesianBolt).emitTuple(argThat(new IndexMatcher(index)), any(BasicOutputCollector.class), anyBoolean(), anyString()); } }