@BeforeMethod public void setup() { config = new BulletStormConfig("src/test/resources/test_config.yaml"); bolt = new LoopBolt(config); collector = new CustomCollector(); ComponentUtils.prepare(bolt, collector); publisher = (CustomPublisher) bolt.getPublisher(); }
@Test public void testCleanupClosesPublisher() { Assert.assertFalse(publisher.isClosed()); Assert.assertFalse(publisher.isThrown()); bolt.cleanup(); Assert.assertTrue(publisher.isClosed()); Assert.assertFalse(publisher.isThrown()); // bolt cleanup catches publisher throw bolt.cleanup(); Assert.assertTrue(publisher.isClosed()); Assert.assertTrue(publisher.isThrown()); }
@Test public void testDeclareOutputFields() { CustomOutputFieldsDeclarer declarer = new CustomOutputFieldsDeclarer(); bolt.declareOutputFields(declarer); Assert.assertTrue(!declarer.areFieldsDeclared()); } }
@Test(expectedExceptions = RuntimeException.class, expectedExceptionsMessageRegExp = ".*Cannot create PubSub.*") public void testFailingToCreatePubSub() { config.set(BulletConfig.PUBSUB_CLASS_NAME, "fake.class"); ComponentUtils.prepare(new LoopBolt(config), collector); }
@Override public void execute(Tuple tuple) { String id = tuple.getString(TopologyConstants.ID_POSITION); Metadata metadata = (Metadata) tuple.getValue(TopologyConstants.METADATA_POSITION); log.info("Looping back metadata with signal {} for {}", metadata.getSignal(), id); publish(new PubSubMessage(id, null, metadata), tuple); } }
@Test public void testAcksEvenOnException() throws Exception { publisher.close(); bolt.execute(makeTuple("42", new Metadata(Metadata.Signal.KILL, null))); bolt.execute(makeTuple("43", new Metadata(Metadata.Signal.FAIL, null))); Assert.assertTrue(publisher.getSent().isEmpty()); Assert.assertEquals(collector.getAckedCount(), 2); }
log.info("Windowing is disabled. Skipping hooking in the Loop Bolt..."); } else { builder.setBolt(LOOP_COMPONENT, new LoopBolt(config), loopBoltParallelism) .shuffleGrouping(JOIN_COMPONENT, FEEDBACK_STREAM) .setCPULoad(loopBoltCPULoad).setMemoryLoad(loopBoltMemoryOnHeapLoad, loopBoltMemoryOffHeapLoad);
@Override public void execute(Tuple tuple) { String id = tuple.getString(TopologyConstants.ID_POSITION); Metadata metadata = (Metadata) tuple.getValue(TopologyConstants.METADATA_POSITION); log.info("Looping back metadata with signal {} for {}", metadata.getSignal(), id); publish(new PubSubMessage(id, null, metadata), tuple); } }
@Test public void testMessagesAreLooped() { List<PubSubMessage> expected = asList(new PubSubMessage("42", Metadata.Signal.KILL), new PubSubMessage("43", Metadata.Signal.COMPLETE), new PubSubMessage("44", (Metadata.Signal) null)); List<Tuple> tuples = new ArrayList<>(); expected.forEach(m -> tuples.add(makeTuple(m.getId(), m.getMetadata()))); for (int i = 0; i < tuples.size(); i++) { bolt.execute(tuples.get(i)); Assert.assertEquals(publisher.getSent().get(i).getId(), expected.get(i).getId()); Assert.assertEquals(publisher.getSent().get(i).getMetadata(), expected.get(i).getMetadata()); Assert.assertTrue(collector.wasNthAcked(tuples.get(i), i + 1)); Assert.assertEquals(collector.getAckedCount(), i + 1); } }
log.info("Windowing is disabled. Skipping hooking in the Loop Bolt..."); } else { builder.setBolt(LOOP_COMPONENT, new LoopBolt(config), loopBoltParallelism) .shuffleGrouping(JOIN_COMPONENT, FEEDBACK_STREAM) .setCPULoad(loopBoltCPULoad).setMemoryLoad(loopBoltMemoryOnHeapLoad, loopBoltMemoryOffHeapLoad);