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.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import main.java.utils.WorkberchTuple;
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.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.stubbing.OngoingStubbing;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ RedisHandeler.class })
public class WorkberchOrderBoltTest {
private static final String DUMMY_FIELD = "dummy-field";
private static final String DUMMY_VALUE = "dummy-value";
@Before
public void before() {
mockStatic(RedisHandeler.class);
}
@Test
public void testAlreadyOrderedFlowReceived() {
final WorkberchOrderBolt orderedBolt = spy(new WorkberchOrderBolt("mockGuid", new ArrayList<String>(), true) {
private static final long serialVersionUID = 1L;
@Override
public void executeOrdered(final WorkberchTuple input, final BasicOutputCollector collector, final boolean lastValues, final String uuid) {}
});
final BasicOutputCollector mockCollector = mock(BasicOutputCollector.class);
final Fields fields = new Fields(INDEX_FIELD, DUMMY_FIELD);
final Tuple stormTuple1 = mock(Tuple.class);
final Tuple stormTuple2 = mock(Tuple.class);
final Tuple stormTuple3 = mock(Tuple.class);
final Tuple stormTuple4 = mock(Tuple.class);
final Tuple stormTuple5 = mock(Tuple.class);
given(stormTuple1.getFields()).willReturn(fields);
given(stormTuple2.getFields()).willReturn(fields);
given(stormTuple3.getFields()).willReturn(fields);
given(stormTuple4.getFields()).willReturn(fields);
given(stormTuple5.getFields()).willReturn(fields);
given(stormTuple1.getValueByField(INDEX_FIELD)).willReturn(0L);
given(stormTuple2.getValueByField(INDEX_FIELD)).willReturn(1L);
given(stormTuple3.getValueByField(INDEX_FIELD)).willReturn(2L);
given(stormTuple4.getValueByField(INDEX_FIELD)).willReturn(3L);
given(stormTuple5.getValueByField(INDEX_FIELD)).willReturn(4L);
given(stormTuple1.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple2.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple3.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple4.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple5.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
final WorkberchTuple workberchTuple1 = new WorkberchTuple(stormTuple1);
final WorkberchTuple workberchTuple2 = new WorkberchTuple(stormTuple2);
final WorkberchTuple workberchTuple3 = new WorkberchTuple(stormTuple3);
final WorkberchTuple workberchTuple4 = new WorkberchTuple(stormTuple4);
final WorkberchTuple workberchTuple5 = new WorkberchTuple(stormTuple5);
orderedBolt.executeProvenance(workberchTuple5, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple3, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple2, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple4, mockCollector, false);
verify(orderedBolt, never()).executeOrdered(any(WorkberchTuple.class), any(BasicOutputCollector.class), anyBoolean(), anyString());
orderedBolt.executeProvenance(workberchTuple1, mockCollector, false);
final InOrder inOrder = inOrder(orderedBolt);
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple1), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple2), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple3), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple4), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple5), any(BasicOutputCollector.class), anyBoolean(), anyString());
}
@Test
public void testNotOrderedButPlainTreeIndexOfTwoSourcesFromCartesian() throws IOException {
final WorkberchOrderBolt orderedBolt = spy(new WorkberchOrderBolt("mockGuid", new ArrayList<String>(), false) {
private static final long serialVersionUID = 1L;
@Override
public void executeOrdered(final WorkberchTuple input, final BasicOutputCollector collector, final boolean lastValues, final String uuid) {}
});
final OngoingStubbing<Boolean> returnChainCall = PowerMockito.when(RedisHandeler.getFinishedState(anyString()));
returnChainCall.thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE)
.thenReturn(Boolean.FALSE).thenReturn(Boolean.TRUE);
final BasicOutputCollector mockCollector = mock(BasicOutputCollector.class);
final Fields fields = new Fields(INDEX_FIELD, DUMMY_FIELD);
final Tuple stormTuple1 = mock(Tuple.class);
final Tuple stormTuple2 = mock(Tuple.class);
final Tuple stormTuple3 = mock(Tuple.class);
final Tuple stormTuple4 = mock(Tuple.class);
final Tuple stormTuple5 = mock(Tuple.class);
final Tuple stormTuple6 = mock(Tuple.class);
final CartesianIndex index11 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(0L))));
final CartesianIndex index12 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(1L))));
final CartesianIndex index13 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(2L))));
final CartesianIndex index21 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(1L), new CartesianLeaf(0L))));
final CartesianIndex index22 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(1L), new CartesianLeaf(1L))));
final CartesianIndex index23 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(1L), new CartesianLeaf(2L))));
given(stormTuple1.getFields()).willReturn(fields);
given(stormTuple2.getFields()).willReturn(fields);
given(stormTuple3.getFields()).willReturn(fields);
given(stormTuple4.getFields()).willReturn(fields);
given(stormTuple5.getFields()).willReturn(fields);
given(stormTuple6.getFields()).willReturn(fields);
given(stormTuple1.getValueByField(INDEX_FIELD)).willReturn(index11);
given(stormTuple2.getValueByField(INDEX_FIELD)).willReturn(index12);
given(stormTuple3.getValueByField(INDEX_FIELD)).willReturn(index13);
given(stormTuple4.getValueByField(INDEX_FIELD)).willReturn(index21);
given(stormTuple5.getValueByField(INDEX_FIELD)).willReturn(index22);
given(stormTuple6.getValueByField(INDEX_FIELD)).willReturn(index23);
given(stormTuple1.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple2.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple3.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple4.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple5.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple6.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
final WorkberchTuple workberchTuple1 = new WorkberchTuple(stormTuple1);
final WorkberchTuple workberchTuple2 = new WorkberchTuple(stormTuple2);
final WorkberchTuple workberchTuple3 = new WorkberchTuple(stormTuple3);
final WorkberchTuple workberchTuple4 = new WorkberchTuple(stormTuple4);
final WorkberchTuple workberchTuple5 = new WorkberchTuple(stormTuple5);
final WorkberchTuple workberchTuple6 = new WorkberchTuple(stormTuple6);
final Map<CartesianIndex, WorkberchTuple> indexMap = new HashMap<CartesianIndex, WorkberchTuple>();
indexMap.put(index11, workberchTuple1);
indexMap.put(index12, workberchTuple2);
indexMap.put(index13, workberchTuple3);
indexMap.put(index21, workberchTuple4);
indexMap.put(index22, workberchTuple5);
indexMap.put(index23, workberchTuple6);
PowerMockito.when(RedisHandeler.loadCartesianIndexObjects(anyString())).thenReturn(indexMap);
orderedBolt.executeProvenance(workberchTuple5, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple3, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple2, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple4, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple6, mockCollector, false);
verify(orderedBolt, never()).executeOrdered(any(WorkberchTuple.class), any(BasicOutputCollector.class), anyBoolean(), anyString());
orderedBolt.executeProvenance(workberchTuple1, mockCollector, true);
final InOrder inOrder = inOrder(orderedBolt);
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple1), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple2), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple3), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple4), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple5), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple6), any(BasicOutputCollector.class), anyBoolean(), anyString());
}
@Ignore
public void testNotOrderedNotPlainIndexOfTwoSourcesFromCartesian() throws IOException {
final WorkberchOrderBolt orderedBolt = spy(new WorkberchOrderBolt("mockGuid", new ArrayList<String>(), false) {
private static final long serialVersionUID = 1L;
@Override
public void executeOrdered(final WorkberchTuple input, final BasicOutputCollector collector, final boolean lastValues, final String uuid) {}
});
final OngoingStubbing<Boolean> returnChainCall = PowerMockito.when(RedisHandeler.getFinishedState(anyString()));
returnChainCall.thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE)
.thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE).thenReturn(Boolean.FALSE).thenReturn(Boolean.TRUE);
final BasicOutputCollector mockCollector = mock(BasicOutputCollector.class);
final Fields fields = new Fields(INDEX_FIELD, DUMMY_FIELD);
final Tuple stormTuple1 = mock(Tuple.class);
final Tuple stormTuple2 = mock(Tuple.class);
final Tuple stormTuple3 = mock(Tuple.class);
final Tuple stormTuple4 = mock(Tuple.class);
final Tuple stormTuple5 = mock(Tuple.class);
final Tuple stormTuple6 = mock(Tuple.class);
final Tuple stormTuple7 = mock(Tuple.class);
final Tuple stormTuple8 = mock(Tuple.class);
final CartesianIndex index11 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(0L))));
final CartesianIndex index12 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(0L))));
final CartesianIndex index21 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(0L))));
final CartesianIndex index22 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(new CartesianLeaf(0L), new CartesianLeaf(0L))));
final CartesianIndex index111 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index11, new CartesianLeaf(0L))));
final CartesianIndex index112 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index11, new CartesianLeaf(1L))));
final CartesianIndex index121 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index12, new CartesianLeaf(0L))));
final CartesianIndex index122 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index12, new CartesianLeaf(1L))));
final CartesianIndex index211 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index21, new CartesianLeaf(0L))));
final CartesianIndex index212 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index21, new CartesianLeaf(1L))));
final CartesianIndex index221 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index22, new CartesianLeaf(0L))));
final CartesianIndex index222 = new CartesianNode(new ArrayList<CartesianIndex>(Arrays.asList(index22, new CartesianLeaf(1L))));
given(stormTuple1.getFields()).willReturn(fields);
given(stormTuple2.getFields()).willReturn(fields);
given(stormTuple3.getFields()).willReturn(fields);
given(stormTuple4.getFields()).willReturn(fields);
given(stormTuple5.getFields()).willReturn(fields);
given(stormTuple6.getFields()).willReturn(fields);
given(stormTuple7.getFields()).willReturn(fields);
given(stormTuple8.getFields()).willReturn(fields);
given(stormTuple1.getValueByField(INDEX_FIELD)).willReturn(index111);
given(stormTuple2.getValueByField(INDEX_FIELD)).willReturn(index112);
given(stormTuple3.getValueByField(INDEX_FIELD)).willReturn(index121);
given(stormTuple4.getValueByField(INDEX_FIELD)).willReturn(index122);
given(stormTuple5.getValueByField(INDEX_FIELD)).willReturn(index211);
given(stormTuple6.getValueByField(INDEX_FIELD)).willReturn(index212);
given(stormTuple7.getValueByField(INDEX_FIELD)).willReturn(index221);
given(stormTuple8.getValueByField(INDEX_FIELD)).willReturn(index222);
given(stormTuple1.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple2.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple3.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple4.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple5.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple6.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple7.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
given(stormTuple8.getValueByField(DUMMY_FIELD)).willReturn(DUMMY_VALUE);
final WorkberchTuple workberchTuple1 = new WorkberchTuple(stormTuple1);
final WorkberchTuple workberchTuple2 = new WorkberchTuple(stormTuple2);
final WorkberchTuple workberchTuple3 = new WorkberchTuple(stormTuple3);
final WorkberchTuple workberchTuple4 = new WorkberchTuple(stormTuple4);
final WorkberchTuple workberchTuple5 = new WorkberchTuple(stormTuple5);
final WorkberchTuple workberchTuple6 = new WorkberchTuple(stormTuple6);
final WorkberchTuple workberchTuple7 = new WorkberchTuple(stormTuple7);
final WorkberchTuple workberchTuple8 = new WorkberchTuple(stormTuple8);
final Map<CartesianIndex, WorkberchTuple> indexMap = new HashMap<CartesianIndex, WorkberchTuple>();
indexMap.put(index111, workberchTuple1);
indexMap.put(index112, workberchTuple2);
indexMap.put(index121, workberchTuple3);
indexMap.put(index122, workberchTuple4);
indexMap.put(index211, workberchTuple5);
indexMap.put(index212, workberchTuple6);
indexMap.put(index221, workberchTuple7);
indexMap.put(index222, workberchTuple8);
PowerMockito.when(RedisHandeler.loadCartesianIndexObjects(anyString())).thenReturn(indexMap);
orderedBolt.executeProvenance(workberchTuple5, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple3, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple2, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple4, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple6, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple7, mockCollector, false);
orderedBolt.executeProvenance(workberchTuple8, mockCollector, false);
verify(orderedBolt, never()).executeOrdered(any(WorkberchTuple.class), any(BasicOutputCollector.class), anyBoolean(), anyString());
orderedBolt.executeProvenance(workberchTuple1, mockCollector, false);
final InOrder inOrder = inOrder(orderedBolt);
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple1), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple2), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple3), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple4), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple5), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple6), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple7), any(BasicOutputCollector.class), anyBoolean(), anyString());
inOrder.verify(orderedBolt).executeOrdered(eq(workberchTuple8), any(BasicOutputCollector.class), anyBoolean(), anyString());
}
}