/*
* #!
* %
* 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.sinks;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.LinkedList;
import java.util.Random;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import backtype.storm.Config;
import backtype.storm.task.GeneralTopologyContext;
import backtype.storm.task.OutputCollector;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.TupleImpl;
import backtype.storm.tuple.Values;
import de.hub.cs.dbis.aeolus.testUtils.TestOutputCollector;
/**
* @author mjsax
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(TestFileOutputBolt.class)
public class FileOutputBoltTest {
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 testExecute() throws Exception {
final LinkedList<String> expectedResult = new LinkedList<String>();
final LinkedList<String> result = new LinkedList<String>();
final LinkedList<Tuple> input = new LinkedList<Tuple>();
Config conf = new Config();
String dummyDir = "dummyDir";
String dummyFile = "dummyFile";
String usedDir = ".";
String usedFile = "result.dat";
switch(this.r.nextInt(4)) {
case 0:
conf.put(TestFileOutputBolt.OUTPUT_DIR_NAME, dummyDir);
usedDir = dummyDir;
break;
case 1:
conf.put(TestFileOutputBolt.OUTPUT_FILE_NAME, dummyFile);
usedFile = dummyFile;
break;
case 2:
conf.put(TestFileOutputBolt.OUTPUT_DIR_NAME, dummyDir);
conf.put(TestFileOutputBolt.OUTPUT_FILE_NAME, dummyFile);
usedDir = dummyDir;
usedFile = dummyFile;
break;
default:
}
FileWriter fileWriterMock = PowerMockito.mock(FileWriter.class);
PowerMockito.whenNew(FileWriter.class).withArguments(usedDir + File.separator + usedFile)
.thenReturn(fileWriterMock);
BufferedWriter dummyWriter = new BufferedWriter(fileWriterMock) {
@Override
public void write(String s) {
result.add(s);
}
};
PowerMockito.whenNew(BufferedWriter.class).withArguments(fileWriterMock).thenReturn(dummyWriter);
TestFileOutputBolt bolt = new TestFileOutputBolt();
TestOutputCollector collector = new TestOutputCollector();
bolt.prepare(conf, null, new OutputCollector(collector));
GeneralTopologyContext context = mock(GeneralTopologyContext.class);
when(context.getComponentOutputFields(anyString(), anyString())).thenReturn(new Fields("dummy"));
when(context.getComponentId(anyInt())).thenReturn("componentID");
final int numberOfLines = 20;
for(int i = 0; i < numberOfLines; ++i) {
TupleImpl t = new TupleImpl(context, new Values(new Integer(this.r.nextInt())), 0, null);
input.add(t);
expectedResult.add(t.toString());
bolt.execute(t);
}
Assert.assertEquals(expectedResult, result);
Assert.assertEquals(input, collector.acked);
}
}