Java tutorial
/* * Copyright 2018, Yahoo Inc. * Licensed under the terms of the Apache License, Version 2.0. * See the LICENSE file associated with the project for terms. */ package com.yahoo.bullet.storm; import com.yahoo.bullet.storm.testing.CustomBoltDeclarer; import com.yahoo.bullet.storm.testing.CustomIMetricsConsumer; import com.yahoo.bullet.storm.testing.CustomIRichSpout; import com.yahoo.bullet.storm.testing.CustomSpoutDeclarer; import com.yahoo.bullet.storm.testing.CustomTopologyBuilder; import org.apache.commons.lang3.tuple.Pair; import org.apache.storm.tuple.Fields; import org.apache.storm.utils.Utils; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.Arrays; import java.util.List; import java.util.Map; import static com.yahoo.bullet.storm.TopologyConstants.DATA_STREAM; import static com.yahoo.bullet.storm.TopologyConstants.FEEDBACK_STREAM; import static com.yahoo.bullet.storm.TopologyConstants.FILTER_COMPONENT; import static com.yahoo.bullet.storm.TopologyConstants.ID_FIELD; import static com.yahoo.bullet.storm.TopologyConstants.JOIN_COMPONENT; import static com.yahoo.bullet.storm.TopologyConstants.LOOP_COMPONENT; import static com.yahoo.bullet.storm.TopologyConstants.METADATA_STREAM; import static com.yahoo.bullet.storm.TopologyConstants.QUERY_COMPONENT; import static com.yahoo.bullet.storm.TopologyConstants.QUERY_STREAM; import static com.yahoo.bullet.storm.TopologyConstants.RESULT_COMPONENT; import static com.yahoo.bullet.storm.TopologyConstants.RESULT_STREAM; import static com.yahoo.bullet.storm.TopologyConstants.TICK_COMPONENT; import static com.yahoo.bullet.storm.TopologyConstants.TICK_STREAM; import static java.util.Collections.singletonList; public class StormUtilsTest { private CustomTopologyBuilder builder; private BulletStormConfig config; private void submitWithTopology(String recordComponent) { try { StormUtils.submit(config, recordComponent, builder); } catch (Exception ignored) { } } private void submitWithSpout(String name, List<String> args, Number parallelism, Number cpu, Number on, Number off) { try { StormUtils.submit(builder, name, args, config, parallelism, cpu, on, off); } catch (Exception ignored) { } } private CustomBoltDeclarer getBolt(String name) { return builder.getCreatedBolts().stream().filter(b -> name.equals(b.getId())).findFirst().get(); } private CustomSpoutDeclarer getSpout(String name) { return builder.getCreatedSpouts().stream().filter(s -> name.equals(s.getId())).findFirst().get(); } private void assertContains(List<Pair<String, String>> componentStreams, String component, String stream) { Pair<String, String> pair = Pair.of(component, stream); Assert.assertTrue(componentStreams.stream().anyMatch(pair::equals)); } private void assertContains(Map<Pair<String, String>, List<Fields>> groupings, String component, String stream, Fields... fields) { List<Fields> actuals = groupings.get(Pair.of(component, stream)); Assert.assertNotNull(actuals); List<Fields> expecteds = Arrays.asList(fields); Assert.assertEquals(actuals.size(), expecteds.size()); for (int i = 0; i < actuals.size(); ++i) { Assert.assertEquals(actuals.get(i).toList(), expecteds.get(i).toList()); } } @BeforeMethod public void setup() { builder = new CustomTopologyBuilder(); builder.setThrowExceptionOnCreate(false); config = new BulletStormConfig(); } @Test(expectedExceptions = ClassNotFoundException.class) public void testFailingSubmitOnMissingSpout() throws Exception { StormUtils utils = new StormUtils(); utils.submit("non.existant.spout", null, new BulletStormConfig(), null, null, null, null); } @Test public void testHookingIntoExistingRecordSource() { builder.setSpout("source", new CustomIRichSpout(), 10); Assert.assertFalse(builder.isTopologyCreated()); submitWithTopology("source"); Assert.assertTrue(builder.isTopologyCreated()); Assert.assertEquals(builder.getCreatedSpouts().size(), 3); Assert.assertEquals(builder.getCreatedBolts().size(), 4); CustomSpoutDeclarer sourceSpout = getSpout("source"); Assert.assertNotNull(sourceSpout); Assert.assertEquals(sourceSpout.getSpout().getClass(), CustomIRichSpout.class); Assert.assertEquals(sourceSpout.getParallelism(), 10); Assert.assertNull(sourceSpout.getCpuLoad()); Assert.assertNull(sourceSpout.getOnHeap()); Assert.assertNull(sourceSpout.getOffHeap()); CustomSpoutDeclarer tickSpout = getSpout(TopologyConstants.TICK_COMPONENT); Assert.assertNotNull(tickSpout); Assert.assertEquals(tickSpout.getSpout().getClass(), TickSpout.class); Assert.assertEquals(tickSpout.getParallelism(), BulletStormConfig.TICK_SPOUT_PARALLELISM); Assert.assertEquals(tickSpout.getCpuLoad(), BulletStormConfig.DEFAULT_TICK_SPOUT_CPU_LOAD); Assert.assertEquals(tickSpout.getOnHeap(), BulletStormConfig.DEFAULT_TICK_SPOUT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(tickSpout.getOffHeap(), BulletStormConfig.DEFAULT_TICK_SPOUT_MEMORY_OFF_HEAP_LOAD); CustomSpoutDeclarer querySpout = getSpout(TopologyConstants.QUERY_COMPONENT); Assert.assertNotNull(querySpout); Assert.assertEquals(querySpout.getSpout().getClass(), QuerySpout.class); Assert.assertEquals(querySpout.getParallelism(), BulletStormConfig.DEFAULT_QUERY_SPOUT_PARALLELISM); Assert.assertEquals(querySpout.getCpuLoad(), BulletStormConfig.DEFAULT_QUERY_SPOUT_CPU_LOAD); Assert.assertEquals(querySpout.getOnHeap(), BulletStormConfig.DEFAULT_QUERY_SPOUT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(querySpout.getOffHeap(), BulletStormConfig.DEFAULT_QUERY_SPOUT_MEMORY_OFF_HEAP_LOAD); CustomBoltDeclarer filterBolt = getBolt(FILTER_COMPONENT); Assert.assertNotNull(filterBolt); Assert.assertEquals(filterBolt.getBolt().getClass(), FilterBolt.class); Assert.assertEquals(filterBolt.getParallelism(), BulletStormConfig.DEFAULT_FILTER_BOLT_PARALLELISM); Assert.assertEquals(filterBolt.getCpuLoad(), BulletStormConfig.DEFAULT_FILTER_BOLT_CPU_LOAD); Assert.assertEquals(filterBolt.getOnHeap(), BulletStormConfig.DEFAULT_FILTER_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(filterBolt.getOffHeap(), BulletStormConfig.DEFAULT_FILTER_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> filterAllGroupings = filterBolt.getAllGroupings(); Assert.assertEquals(filterAllGroupings.size(), 3); assertContains(filterAllGroupings, TICK_COMPONENT, TICK_STREAM); assertContains(filterAllGroupings, QUERY_COMPONENT, QUERY_STREAM); assertContains(filterAllGroupings, QUERY_COMPONENT, METADATA_STREAM); List<Pair<String, String>> filterShuffleGroupings = filterBolt.getShuffleGroupings(); assertContains(filterShuffleGroupings, "source", Utils.DEFAULT_STREAM_ID); Map<Pair<String, String>, List<Fields>> filterFieldGroupings = filterBolt.getFieldsGroupings(); Assert.assertTrue(filterFieldGroupings.isEmpty()); CustomBoltDeclarer joinBolt = getBolt(JOIN_COMPONENT); Assert.assertNotNull(joinBolt); Assert.assertEquals(joinBolt.getBolt().getClass(), JoinBolt.class); Assert.assertEquals(joinBolt.getParallelism(), BulletStormConfig.DEFAULT_JOIN_BOLT_PARALLELISM); Assert.assertEquals(joinBolt.getCpuLoad(), BulletStormConfig.DEFAULT_JOIN_BOLT_CPU_LOAD); Assert.assertEquals(joinBolt.getOnHeap(), BulletStormConfig.DEFAULT_JOIN_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(joinBolt.getOffHeap(), BulletStormConfig.DEFAULT_JOIN_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> joinAllGroupings = joinBolt.getAllGroupings(); Assert.assertEquals(joinAllGroupings.size(), 1); assertContains(joinAllGroupings, TICK_COMPONENT, TICK_STREAM); List<Pair<String, String>> joinShuffleGroupings = joinBolt.getShuffleGroupings(); Assert.assertTrue(joinShuffleGroupings.isEmpty()); Map<Pair<String, String>, List<Fields>> joinFieldGroupings = joinBolt.getFieldsGroupings(); Assert.assertEquals(joinFieldGroupings.size(), 3); assertContains(joinFieldGroupings, QUERY_COMPONENT, QUERY_STREAM, new Fields(ID_FIELD)); assertContains(joinFieldGroupings, QUERY_COMPONENT, METADATA_STREAM, new Fields(ID_FIELD)); assertContains(joinFieldGroupings, FILTER_COMPONENT, DATA_STREAM, new Fields(ID_FIELD)); CustomBoltDeclarer resultBolt = getBolt(RESULT_COMPONENT); Assert.assertNotNull(resultBolt); Assert.assertEquals(resultBolt.getBolt().getClass(), ResultBolt.class); Assert.assertEquals(resultBolt.getParallelism(), BulletStormConfig.DEFAULT_RESULT_BOLT_PARALLELISM); Assert.assertEquals(resultBolt.getCpuLoad(), BulletStormConfig.DEFAULT_RESULT_BOLT_CPU_LOAD); Assert.assertEquals(resultBolt.getOnHeap(), BulletStormConfig.DEFAULT_RESULT_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(resultBolt.getOffHeap(), BulletStormConfig.DEFAULT_RESULT_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> resultAllGroupings = resultBolt.getAllGroupings(); Assert.assertTrue(resultAllGroupings.isEmpty()); List<Pair<String, String>> resultShuffleGroupings = resultBolt.getShuffleGroupings(); Assert.assertEquals(resultShuffleGroupings.size(), 1); assertContains(resultShuffleGroupings, JOIN_COMPONENT, RESULT_STREAM); Map<Pair<String, String>, List<Fields>> resultFieldGroupings = resultBolt.getFieldsGroupings(); Assert.assertTrue(resultFieldGroupings.isEmpty()); CustomBoltDeclarer loopBolt = getBolt(LOOP_COMPONENT); Assert.assertNotNull(loopBolt); Assert.assertEquals(loopBolt.getBolt().getClass(), LoopBolt.class); Assert.assertEquals(loopBolt.getParallelism(), BulletStormConfig.DEFAULT_LOOP_BOLT_PARALLELISM); Assert.assertEquals(loopBolt.getCpuLoad(), BulletStormConfig.DEFAULT_LOOP_BOLT_CPU_LOAD); Assert.assertEquals(loopBolt.getOnHeap(), BulletStormConfig.DEFAULT_LOOP_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(loopBolt.getOffHeap(), BulletStormConfig.DEFAULT_LOOP_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> loopAllGroupings = loopBolt.getAllGroupings(); Assert.assertTrue(loopAllGroupings.isEmpty()); List<Pair<String, String>> loopShuffleGroupings = loopBolt.getShuffleGroupings(); Assert.assertEquals(loopShuffleGroupings.size(), 1); assertContains(loopShuffleGroupings, JOIN_COMPONENT, FEEDBACK_STREAM); Map<Pair<String, String>, List<Fields>> loopFieldGroupings = loopBolt.getFieldsGroupings(); Assert.assertTrue(loopFieldGroupings.isEmpty()); } @Test public void testHookingInSpout() { Assert.assertFalse(builder.isTopologyCreated()); submitWithSpout(CustomIRichSpout.class.getName(), null, 2, 100.0, 96.0, 0.0); Assert.assertTrue(builder.isTopologyCreated()); Assert.assertEquals(builder.getCreatedSpouts().size(), 3); Assert.assertEquals(builder.getCreatedBolts().size(), 4); CustomSpoutDeclarer source = getSpout(TopologyConstants.RECORD_COMPONENT); Assert.assertNotNull(source); Assert.assertEquals(source.getSpout().getClass(), CustomIRichSpout.class); Assert.assertEquals(source.getParallelism(), 2); Assert.assertEquals(source.getCpuLoad(), 100.0); Assert.assertEquals(source.getOnHeap(), 96.0); Assert.assertEquals(source.getOffHeap(), 0.0); CustomSpoutDeclarer tickSpout = getSpout(TopologyConstants.TICK_COMPONENT); Assert.assertNotNull(tickSpout); Assert.assertEquals(tickSpout.getSpout().getClass(), TickSpout.class); Assert.assertEquals(tickSpout.getParallelism(), BulletStormConfig.TICK_SPOUT_PARALLELISM); Assert.assertEquals(tickSpout.getCpuLoad(), BulletStormConfig.DEFAULT_TICK_SPOUT_CPU_LOAD); Assert.assertEquals(tickSpout.getOnHeap(), BulletStormConfig.DEFAULT_TICK_SPOUT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(tickSpout.getOffHeap(), BulletStormConfig.DEFAULT_TICK_SPOUT_MEMORY_OFF_HEAP_LOAD); CustomSpoutDeclarer querySpout = getSpout(TopologyConstants.QUERY_COMPONENT); Assert.assertNotNull(querySpout); Assert.assertEquals(querySpout.getSpout().getClass(), QuerySpout.class); Assert.assertEquals(querySpout.getParallelism(), BulletStormConfig.DEFAULT_QUERY_SPOUT_PARALLELISM); Assert.assertEquals(querySpout.getCpuLoad(), BulletStormConfig.DEFAULT_QUERY_SPOUT_CPU_LOAD); Assert.assertEquals(querySpout.getOnHeap(), BulletStormConfig.DEFAULT_QUERY_SPOUT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(querySpout.getOffHeap(), BulletStormConfig.DEFAULT_QUERY_SPOUT_MEMORY_OFF_HEAP_LOAD); CustomBoltDeclarer filterBolt = getBolt(FILTER_COMPONENT); Assert.assertNotNull(filterBolt); Assert.assertEquals(filterBolt.getBolt().getClass(), FilterBolt.class); Assert.assertEquals(filterBolt.getParallelism(), BulletStormConfig.DEFAULT_FILTER_BOLT_PARALLELISM); Assert.assertEquals(filterBolt.getCpuLoad(), BulletStormConfig.DEFAULT_FILTER_BOLT_CPU_LOAD); Assert.assertEquals(filterBolt.getOnHeap(), BulletStormConfig.DEFAULT_FILTER_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(filterBolt.getOffHeap(), BulletStormConfig.DEFAULT_FILTER_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> filterAllGroupings = filterBolt.getAllGroupings(); Assert.assertEquals(filterAllGroupings.size(), 3); assertContains(filterAllGroupings, TICK_COMPONENT, TICK_STREAM); assertContains(filterAllGroupings, QUERY_COMPONENT, QUERY_STREAM); assertContains(filterAllGroupings, QUERY_COMPONENT, METADATA_STREAM); List<Pair<String, String>> filterShuffleGroupings = filterBolt.getShuffleGroupings(); assertContains(filterShuffleGroupings, TopologyConstants.RECORD_COMPONENT, Utils.DEFAULT_STREAM_ID); Map<Pair<String, String>, List<Fields>> filterFieldGroupings = filterBolt.getFieldsGroupings(); Assert.assertTrue(filterFieldGroupings.isEmpty()); CustomBoltDeclarer joinBolt = getBolt(JOIN_COMPONENT); Assert.assertNotNull(joinBolt); Assert.assertEquals(joinBolt.getBolt().getClass(), JoinBolt.class); Assert.assertEquals(joinBolt.getParallelism(), BulletStormConfig.DEFAULT_JOIN_BOLT_PARALLELISM); Assert.assertEquals(joinBolt.getCpuLoad(), BulletStormConfig.DEFAULT_JOIN_BOLT_CPU_LOAD); Assert.assertEquals(joinBolt.getOnHeap(), BulletStormConfig.DEFAULT_JOIN_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(joinBolt.getOffHeap(), BulletStormConfig.DEFAULT_JOIN_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> joinAllGroupings = joinBolt.getAllGroupings(); Assert.assertEquals(joinAllGroupings.size(), 1); assertContains(joinAllGroupings, TICK_COMPONENT, TICK_STREAM); List<Pair<String, String>> joinShuffleGroupings = joinBolt.getShuffleGroupings(); Assert.assertTrue(joinShuffleGroupings.isEmpty()); Map<Pair<String, String>, List<Fields>> joinFieldGroupings = joinBolt.getFieldsGroupings(); Assert.assertEquals(joinFieldGroupings.size(), 3); assertContains(joinFieldGroupings, QUERY_COMPONENT, QUERY_STREAM, new Fields(ID_FIELD)); assertContains(joinFieldGroupings, QUERY_COMPONENT, METADATA_STREAM, new Fields(ID_FIELD)); assertContains(joinFieldGroupings, FILTER_COMPONENT, DATA_STREAM, new Fields(ID_FIELD)); CustomBoltDeclarer resultBolt = getBolt(RESULT_COMPONENT); Assert.assertNotNull(resultBolt); Assert.assertEquals(resultBolt.getBolt().getClass(), ResultBolt.class); Assert.assertEquals(resultBolt.getParallelism(), BulletStormConfig.DEFAULT_RESULT_BOLT_PARALLELISM); Assert.assertEquals(resultBolt.getCpuLoad(), BulletStormConfig.DEFAULT_RESULT_BOLT_CPU_LOAD); Assert.assertEquals(resultBolt.getOnHeap(), BulletStormConfig.DEFAULT_RESULT_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(resultBolt.getOffHeap(), BulletStormConfig.DEFAULT_RESULT_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> resultAllGroupings = resultBolt.getAllGroupings(); Assert.assertTrue(resultAllGroupings.isEmpty()); List<Pair<String, String>> resultShuffleGroupings = resultBolt.getShuffleGroupings(); Assert.assertEquals(resultShuffleGroupings.size(), 1); assertContains(resultShuffleGroupings, JOIN_COMPONENT, RESULT_STREAM); Map<Pair<String, String>, List<Fields>> resultFieldGroupings = resultBolt.getFieldsGroupings(); Assert.assertTrue(resultFieldGroupings.isEmpty()); CustomBoltDeclarer loopBolt = getBolt(LOOP_COMPONENT); Assert.assertNotNull(loopBolt); Assert.assertEquals(loopBolt.getBolt().getClass(), LoopBolt.class); Assert.assertEquals(loopBolt.getParallelism(), BulletStormConfig.DEFAULT_LOOP_BOLT_PARALLELISM); Assert.assertEquals(loopBolt.getCpuLoad(), BulletStormConfig.DEFAULT_LOOP_BOLT_CPU_LOAD); Assert.assertEquals(loopBolt.getOnHeap(), BulletStormConfig.DEFAULT_LOOP_BOLT_MEMORY_ON_HEAP_LOAD); Assert.assertEquals(loopBolt.getOffHeap(), BulletStormConfig.DEFAULT_LOOP_BOLT_MEMORY_OFF_HEAP_LOAD); List<Pair<String, String>> loopAllGroupings = loopBolt.getAllGroupings(); Assert.assertTrue(loopAllGroupings.isEmpty()); List<Pair<String, String>> loopShuffleGroupings = loopBolt.getShuffleGroupings(); Assert.assertEquals(loopShuffleGroupings.size(), 1); assertContains(loopShuffleGroupings, JOIN_COMPONENT, FEEDBACK_STREAM); Map<Pair<String, String>, List<Fields>> loopFieldGroupings = loopBolt.getFieldsGroupings(); Assert.assertTrue(loopFieldGroupings.isEmpty()); } @Test public void testDisabledLoopBoltOnNoWindowing() { builder.setSpout("source", new CustomIRichSpout(), 10); config.set(BulletStormConfig.WINDOW_DISABLE, true); Assert.assertFalse(builder.isTopologyCreated()); submitWithTopology("source"); Assert.assertTrue(builder.isTopologyCreated()); Assert.assertEquals(builder.getCreatedSpouts().size(), 3); Assert.assertEquals(builder.getCreatedBolts().size(), 3); Assert.assertNotNull(getSpout("source")); Assert.assertNotNull(getSpout(TICK_COMPONENT)); Assert.assertNotNull(getSpout(QUERY_COMPONENT)); Assert.assertNotNull(getBolt(FILTER_COMPONENT)); Assert.assertNotNull(getBolt(JOIN_COMPONENT)); Assert.assertNotNull(getBolt(RESULT_COMPONENT)); } @Test public void testHookingInCustomMetricsConsumer() { builder.setSpout("source", new CustomIRichSpout(), 10); config.set(BulletStormConfig.TOPOLOGY_METRICS_ENABLE, true); config.set(BulletStormConfig.TOPOLOGY_METRICS_CLASSES, singletonList(CustomIMetricsConsumer.class.getName())); Assert.assertNull(config.get(CustomIMetricsConsumer.CUSTOM_METRICS_REGISTERED)); Assert.assertFalse(builder.isTopologyCreated()); submitWithTopology("source"); Assert.assertTrue(builder.isTopologyCreated()); Assert.assertTrue((Boolean) config.get(CustomIMetricsConsumer.CUSTOM_METRICS_REGISTERED)); } @Test public void testCustomComponentConfigurations() { Assert.assertFalse(builder.isTopologyCreated()); config.set(BulletStormConfig.TICK_SPOUT_CPU_LOAD, 10.0); config.set(BulletStormConfig.TICK_SPOUT_MEMORY_ON_HEAP_LOAD, 32.0); config.set(BulletStormConfig.TICK_SPOUT_MEMORY_OFF_HEAP_LOAD, 16.0); config.set(BulletStormConfig.QUERY_SPOUT_PARALLELISM, 10); config.set(BulletStormConfig.QUERY_SPOUT_CPU_LOAD, 11.0); config.set(BulletStormConfig.QUERY_SPOUT_MEMORY_ON_HEAP_LOAD, 33.0); config.set(BulletStormConfig.QUERY_SPOUT_MEMORY_OFF_HEAP_LOAD, 17.0); config.set(BulletStormConfig.FILTER_BOLT_PARALLELISM, 11); config.set(BulletStormConfig.FILTER_BOLT_CPU_LOAD, 12.0); config.set(BulletStormConfig.FILTER_BOLT_MEMORY_ON_HEAP_LOAD, 34.0); config.set(BulletStormConfig.FILTER_BOLT_MEMORY_OFF_HEAP_LOAD, 18.0); config.set(BulletStormConfig.JOIN_BOLT_PARALLELISM, 12); config.set(BulletStormConfig.JOIN_BOLT_CPU_LOAD, 13.0); config.set(BulletStormConfig.JOIN_BOLT_MEMORY_ON_HEAP_LOAD, 35.0); config.set(BulletStormConfig.JOIN_BOLT_MEMORY_OFF_HEAP_LOAD, 19.0); config.set(BulletStormConfig.RESULT_BOLT_PARALLELISM, 13); config.set(BulletStormConfig.RESULT_BOLT_CPU_LOAD, 14.0); config.set(BulletStormConfig.RESULT_BOLT_MEMORY_ON_HEAP_LOAD, 36.0); config.set(BulletStormConfig.RESULT_BOLT_MEMORY_OFF_HEAP_LOAD, 20.0); config.set(BulletStormConfig.LOOP_BOLT_PARALLELISM, 14); config.set(BulletStormConfig.LOOP_BOLT_CPU_LOAD, 15.0); config.set(BulletStormConfig.LOOP_BOLT_MEMORY_ON_HEAP_LOAD, 37.0); config.set(BulletStormConfig.LOOP_BOLT_MEMORY_OFF_HEAP_LOAD, 21.0); submitWithSpout(CustomIRichSpout.class.getName(), null, 2, 100.0, 96.0, 0.0); Assert.assertTrue(builder.isTopologyCreated()); Assert.assertEquals(builder.getCreatedSpouts().size(), 3); Assert.assertEquals(builder.getCreatedBolts().size(), 4); CustomSpoutDeclarer source = getSpout(TopologyConstants.RECORD_COMPONENT); Assert.assertNotNull(source); Assert.assertEquals(source.getSpout().getClass(), CustomIRichSpout.class); Assert.assertEquals(source.getParallelism(), 2); Assert.assertEquals(source.getCpuLoad(), 100.0); Assert.assertEquals(source.getOnHeap(), 96.0); Assert.assertEquals(source.getOffHeap(), 0.0); CustomSpoutDeclarer tickSpout = getSpout(TopologyConstants.TICK_COMPONENT); Assert.assertNotNull(tickSpout); Assert.assertEquals(tickSpout.getSpout().getClass(), TickSpout.class); Assert.assertEquals(tickSpout.getParallelism(), BulletStormConfig.TICK_SPOUT_PARALLELISM); Assert.assertEquals(tickSpout.getCpuLoad(), 10.0); Assert.assertEquals(tickSpout.getOnHeap(), 32.0); Assert.assertEquals(tickSpout.getOffHeap(), 16.0); CustomSpoutDeclarer querySpout = getSpout(TopologyConstants.QUERY_COMPONENT); Assert.assertNotNull(querySpout); Assert.assertEquals(querySpout.getSpout().getClass(), QuerySpout.class); Assert.assertEquals(querySpout.getParallelism(), 10); Assert.assertEquals(querySpout.getCpuLoad(), 11.0); Assert.assertEquals(querySpout.getOnHeap(), 33.0); Assert.assertEquals(querySpout.getOffHeap(), 17.0); CustomBoltDeclarer filterBolt = getBolt(FILTER_COMPONENT); Assert.assertNotNull(filterBolt); Assert.assertEquals(filterBolt.getBolt().getClass(), FilterBolt.class); Assert.assertEquals(filterBolt.getParallelism(), 11); Assert.assertEquals(filterBolt.getCpuLoad(), 12.0); Assert.assertEquals(filterBolt.getOnHeap(), 34.0); Assert.assertEquals(filterBolt.getOffHeap(), 18.0); List<Pair<String, String>> filterAllGroupings = filterBolt.getAllGroupings(); Assert.assertEquals(filterAllGroupings.size(), 3); assertContains(filterAllGroupings, TICK_COMPONENT, TICK_STREAM); assertContains(filterAllGroupings, QUERY_COMPONENT, QUERY_STREAM); assertContains(filterAllGroupings, QUERY_COMPONENT, METADATA_STREAM); List<Pair<String, String>> filterShuffleGroupings = filterBolt.getShuffleGroupings(); assertContains(filterShuffleGroupings, TopologyConstants.RECORD_COMPONENT, Utils.DEFAULT_STREAM_ID); Map<Pair<String, String>, List<Fields>> filterFieldGroupings = filterBolt.getFieldsGroupings(); Assert.assertTrue(filterFieldGroupings.isEmpty()); CustomBoltDeclarer joinBolt = getBolt(JOIN_COMPONENT); Assert.assertNotNull(joinBolt); Assert.assertEquals(joinBolt.getBolt().getClass(), JoinBolt.class); Assert.assertEquals(joinBolt.getParallelism(), 12); Assert.assertEquals(joinBolt.getCpuLoad(), 13.0); Assert.assertEquals(joinBolt.getOnHeap(), 35.0); Assert.assertEquals(joinBolt.getOffHeap(), 19.0); List<Pair<String, String>> joinAllGroupings = joinBolt.getAllGroupings(); Assert.assertEquals(joinAllGroupings.size(), 1); assertContains(joinAllGroupings, TICK_COMPONENT, TICK_STREAM); List<Pair<String, String>> joinShuffleGroupings = joinBolt.getShuffleGroupings(); Assert.assertTrue(joinShuffleGroupings.isEmpty()); Map<Pair<String, String>, List<Fields>> joinFieldGroupings = joinBolt.getFieldsGroupings(); Assert.assertEquals(joinFieldGroupings.size(), 3); assertContains(joinFieldGroupings, QUERY_COMPONENT, QUERY_STREAM, new Fields(ID_FIELD)); assertContains(joinFieldGroupings, QUERY_COMPONENT, METADATA_STREAM, new Fields(ID_FIELD)); assertContains(joinFieldGroupings, FILTER_COMPONENT, DATA_STREAM, new Fields(ID_FIELD)); CustomBoltDeclarer resultBolt = getBolt(RESULT_COMPONENT); Assert.assertNotNull(resultBolt); Assert.assertEquals(resultBolt.getBolt().getClass(), ResultBolt.class); Assert.assertEquals(resultBolt.getParallelism(), 13); Assert.assertEquals(resultBolt.getCpuLoad(), 14.0); Assert.assertEquals(resultBolt.getOnHeap(), 36.0); Assert.assertEquals(resultBolt.getOffHeap(), 20.0); List<Pair<String, String>> resultAllGroupings = resultBolt.getAllGroupings(); Assert.assertTrue(resultAllGroupings.isEmpty()); List<Pair<String, String>> resultShuffleGroupings = resultBolt.getShuffleGroupings(); Assert.assertEquals(resultShuffleGroupings.size(), 1); assertContains(resultShuffleGroupings, JOIN_COMPONENT, RESULT_STREAM); Map<Pair<String, String>, List<Fields>> resultFieldGroupings = resultBolt.getFieldsGroupings(); Assert.assertTrue(resultFieldGroupings.isEmpty()); CustomBoltDeclarer loopBolt = getBolt(LOOP_COMPONENT); Assert.assertNotNull(loopBolt); Assert.assertEquals(loopBolt.getBolt().getClass(), LoopBolt.class); Assert.assertEquals(loopBolt.getParallelism(), 14); Assert.assertEquals(loopBolt.getCpuLoad(), 15.0); Assert.assertEquals(loopBolt.getOnHeap(), 37.0); Assert.assertEquals(loopBolt.getOffHeap(), 21.0); List<Pair<String, String>> loopAllGroupings = loopBolt.getAllGroupings(); Assert.assertTrue(loopAllGroupings.isEmpty()); List<Pair<String, String>> loopShuffleGroupings = loopBolt.getShuffleGroupings(); Assert.assertEquals(loopShuffleGroupings.size(), 1); assertContains(loopShuffleGroupings, JOIN_COMPONENT, FEEDBACK_STREAM); Map<Pair<String, String>, List<Fields>> loopFieldGroupings = loopBolt.getFieldsGroupings(); Assert.assertTrue(loopFieldGroupings.isEmpty()); } }