/*
* #!
* %
* Copyright (C) 2014 - 2016 Humboldt-Universität zu Berlin
* %
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #_
*/
package de.hub.cs.dbis.aeolus.spouts;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import java.util.Map;
import java.util.Random;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.powermock.modules.junit4.PowerMockRunner;
import backtype.storm.Config;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichSpout;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.utils.Utils;
import de.hub.cs.dbis.aeolus.spouts.DataDrivenStreamRateDriverSpout.TimeUnit;
import de.hub.cs.dbis.aeolus.testUtils.IncSpout;
import de.hub.cs.dbis.aeolus.testUtils.TestSpoutOutputCollector;
/**
* @author mjsax
*/
@RunWith(PowerMockRunner.class)
public class SpoutDataDrivenStreamRateDriverTest {
private long seed;
private Random r;
@Before
public void prepare() {
this.seed = System.currentTimeMillis();
this.r = new Random(this.seed);
System.out.println("Test seed: " + this.seed);
}
@Test
public void testForwardCalls() {
IRichSpout worker = mock(IRichSpout.class);
@SuppressWarnings("rawtypes")
DataDrivenStreamRateDriverSpout driver = new DataDrivenStreamRateDriverSpout(worker, 0, TimeUnit.SECONDS);
Config cfg = mock(Config.class);
TopologyContext c = mock(TopologyContext.class);
SpoutOutputCollector col = mock(SpoutOutputCollector.class);
driver.open(cfg, c, col);
verify(worker).open(Matchers.eq(cfg), Matchers.eq(c), Matchers.isA(DataDrivenStreamRateDriverCollector.class));
driver.close();
verify(worker).close();
driver.activate();
verify(worker).activate();
driver.deactivate();
verify(worker).deactivate();
driver.nextTuple();
verify(worker).nextTuple();
Object messageId = new Object();
driver.ack(messageId);
verify(worker).ack(messageId);
driver.fail(messageId);
verify(worker).fail(messageId);
OutputFieldsDeclarer declarer = mock(OutputFieldsDeclarer.class);
driver.declareOutputFields(declarer);
verify(worker).declareOutputFields(declarer);
Map<String, Object> config = worker.getComponentConfiguration();
Assert.assertEquals(config, driver.getComponentConfiguration());
}
@Test
public void testNextTupleFixedSecond() {
IRichSpout worker = new IncSpout();
DataDrivenStreamRateDriverSpout<Integer> driver = new DataDrivenStreamRateDriverSpout<Integer>(worker, 0,
TimeUnit.SECONDS);
Config cfg = mock(Config.class);
TopologyContext c = mock(TopologyContext.class);
SpoutOutputCollector col = mock(SpoutOutputCollector.class);
driver.open(cfg, c, col);
long start = System.nanoTime();
driver.activate();
for(int i = 0; i < 5; ++i) {
driver.nextTuple();
}
long stop = System.nanoTime();
Assert.assertEquals(5, (stop - start) / 1000 / 1000 / 1000, 1);
}
@Test
public void testNextTuple() {
TimeUnit units = null;
switch(this.r.nextInt(4)) {
case 0:
units = TimeUnit.SECONDS;
break;
case 1:
units = TimeUnit.MICROSECONDS;
break;
case 2:
units = TimeUnit.MILLISECONDS;
break;
case 3:
units = TimeUnit.NANOSECONDS;
break;
}
double prob = this.r.nextDouble();
int stepSize = 1;
int numberOfTuples = (int)(1000000000 / units.factor() / (1 - prob));
final int maxNumberOfTuplesPerSecond = 100000;
if(numberOfTuples > maxNumberOfTuplesPerSecond) {
stepSize = numberOfTuples / maxNumberOfTuplesPerSecond;
numberOfTuples /= stepSize;
}
numberOfTuples *= 5; // run for 5 seconds
IRichSpout worker = new IncSpout(prob, stepSize);
DataDrivenStreamRateDriverSpout<Integer> driver = new DataDrivenStreamRateDriverSpout<Integer>(worker, 0, units);
Config cfg = mock(Config.class);
TopologyContext c = mock(TopologyContext.class);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
SpoutOutputCollector col = new SpoutOutputCollector(collector);
driver.open(cfg, c, col);
driver.activate();
long start = System.nanoTime();
for(int i = 0; i < numberOfTuples; ++i) {
driver.nextTuple();
}
long stop = System.nanoTime();
long lastTS = ((Long)collector.output.get(Utils.DEFAULT_STREAM_ID).getLast().get(0)).longValue();
Assert.assertEquals(lastTS / (1000000000 / units.factor()), (stop - start) / units.factor()
/ (1000000000 / units.factor()), 1);
}
}