/*
* #!
* %
* 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.testUtils;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.utils.Utils;
/**
* @author mjsax
*/
@RunWith(PowerMockRunner.class)
public class IncSpoutTest {
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 testDeclareOutputFields() {
IncSpout spout = new IncSpout();
TestDeclarer declarer = new TestDeclarer();
spout.declareOutputFields(declarer);
Assert.assertEquals(1, declarer.schemaBuffer.size());
Assert.assertEquals(1, declarer.schemaBuffer.get(0).size());
Assert.assertEquals("id", declarer.schemaBuffer.get(0).get(0));
Assert.assertEquals(1, declarer.streamIdBuffer.size());
Assert.assertEquals(Utils.DEFAULT_STREAM_ID, declarer.streamIdBuffer.get(0));
Assert.assertEquals(1, declarer.directBuffer.size());
Assert.assertFalse(declarer.directBuffer.get(0).booleanValue());
}
@Test
public void testDeclareOutputFieldsMultipleStreams() {
String[] streamIds = new String[] {Utils.DEFAULT_STREAM_ID, "myStreamId"};
IncSpout spout = new IncSpout(streamIds);
TestDeclarer declarer = new TestDeclarer();
spout.declareOutputFields(declarer);
Assert.assertEquals(streamIds.length, declarer.schemaBuffer.size());
Assert.assertEquals(streamIds.length, declarer.streamIdBuffer.size());
Assert.assertEquals(streamIds.length, declarer.directBuffer.size());
for(int i = 0; i < streamIds.length; ++i) {
Assert.assertEquals(1, declarer.schemaBuffer.get(i).size());
Assert.assertEquals("id", declarer.schemaBuffer.get(i).get(0));
Assert.assertEquals(streamIds[i], declarer.streamIdBuffer.get(i));
Assert.assertFalse(declarer.directBuffer.get(i).booleanValue());
}
}
@Test
public void testExecuteUnique() {
IncSpout spout = new IncSpout(1);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
List<List<Object>> result = new LinkedList<List<Object>>();
for(int i = 0; i < 5; ++i) {
ArrayList<Object> attributes = new ArrayList<Object>();
attributes.add(new Long(i));
result.add(attributes);
spout.nextTuple();
}
Assert.assertEquals(result, collector.output.get(Utils.DEFAULT_STREAM_ID));
}
@Test
public void testExecuteSkip() {
final int skipInterval = 2 + this.r.nextInt(3);
IncSpout spout = new IncSpout(skipInterval);
System.err.println(skipInterval);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
List<List<Object>> result = new LinkedList<List<Object>>();
int value = -1;
for(int i = 0; i < 10; ++i) {
ArrayList<Object> attributes = new ArrayList<Object>();
attributes.add(new Long(++value));
if(i % skipInterval != skipInterval - 1) {
result.add(attributes);
} else {
--value;
}
spout.nextTuple();
}
Assert.assertEquals(result, collector.output.get(Utils.DEFAULT_STREAM_ID));
}
@Test
public void testExecuteStepSizeUnique() {
int stepSize = 1 + this.r.nextInt(5);
IncSpout spout = new IncSpout(0, stepSize);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
List<List<Object>> result = new LinkedList<List<Object>>();
for(int i = 0; i < 5; ++i) {
ArrayList<Object> attributes = new ArrayList<Object>();
attributes.add(new Long(i * stepSize));
result.add(attributes);
spout.nextTuple();
}
Assert.assertEquals(result, collector.output.get(Utils.DEFAULT_STREAM_ID));
}
@Test
public void testExecuteUniqueMultipleStreams() {
String[] streamIds = new String[] {Utils.DEFAULT_STREAM_ID, "myStreamId"};
IncSpout spout = new IncSpout(streamIds);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
List<List<Object>> result = new LinkedList<List<Object>>();
for(int i = 0; i < 5; ++i) {
ArrayList<Object> attributes = new ArrayList<Object>();
attributes.add(new Long(i));
result.add(attributes);
spout.nextTuple();
}
for(String stream : streamIds) {
Assert.assertEquals(result, collector.output.get(stream));
}
}
@Test
public void testExecuteAllEquals() {
IncSpout spout = new IncSpout(1.0, 1);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
List<List<Object>> result = new LinkedList<List<Object>>();
for(int i = 0; i < 5; ++i) {
ArrayList<Object> attributes = new ArrayList<Object>();
attributes.add(new Long(0));
result.add(attributes);
spout.nextTuple();
}
Assert.assertEquals(result, collector.output.get(Utils.DEFAULT_STREAM_ID));
}
@Test
public void testExecuteAllEqualsMultipleStreams() {
String[] streamIds = new String[] {Utils.DEFAULT_STREAM_ID, "myStreamId"};
IncSpout spout = new IncSpout(streamIds, 1.0, 1);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
List<List<Object>> result = new LinkedList<List<Object>>();
for(int i = 0; i < 5; ++i) {
ArrayList<Object> attributes = new ArrayList<Object>();
attributes.add(new Long(0));
result.add(attributes);
spout.nextTuple();
}
for(String stream : streamIds) {
Assert.assertEquals(result, collector.output.get(stream));
}
}
@Test
public void testExecute() {
IncSpout spout = new IncSpout(this.r.nextDouble(), 1);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
for(int i = 0; i < 50; ++i) {
spout.nextTuple();
}
List<Object> first = collector.output.get(Utils.DEFAULT_STREAM_ID).removeFirst();
for(List<Object> second : collector.output.get(Utils.DEFAULT_STREAM_ID)) {
Assert.assertTrue(((Long)first.get(0)).longValue() <= ((Long)second.get(0)).longValue());
first = second;
}
}
@Test
public void testExecuteMultipleStreams() {
String[] streamIds = new String[] {Utils.DEFAULT_STREAM_ID, "myStreamId"};
IncSpout spout = new IncSpout(streamIds, this.r.nextDouble(), 1);
TestSpoutOutputCollector collector = new TestSpoutOutputCollector();
spout.open(null, null, new SpoutOutputCollector(collector));
for(int i = 0; i < 50; ++i) {
spout.nextTuple();
}
for(String stream : streamIds) {
List<Object> first = collector.output.get(stream).removeFirst();
for(List<Object> second : collector.output.get(stream)) {
Assert.assertTrue(((Long)first.get(0)).longValue() <= ((Long)second.get(0)).longValue());
first = second;
}
}
}
}