package eu.europeana.cloud.service.dps.storm.topologies.ic.topology.api;
import eu.europeana.cloud.service.dps.PluginParameterKeys;
import eu.europeana.cloud.service.dps.storm.StormTaskTuple;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.converter.ConverterContext;
import eu.europeana.cloud.service.dps.storm.topologies.ic.converter.converter.KakaduConverterTiffToJP2;
import eu.europeana.cloud.service.dps.storm.topologies.ic.topology.util.ImageConverterUtil;
import eu.europeana.cloud.service.dps.storm.utils.TestConstantsHelper;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import java.io.InputStream;
import static org.mockito.Matchers.anyList;
import static org.mockito.Mockito.*;
public class ImageConverterServiceImplTest implements TestConstantsHelper {
private ImageConverterServiceImpl imageConverterService;
private ConverterContext converterContext;
private ImageConverterUtil imageConverterUtil;
InputStream sourceStream;
InputStream convertedStream;
private final static String JP2_EXTENSION = "jp2";
@Before
public void init() {
sourceStream = IOUtils.toInputStream("stream of the source image");
convertedStream = IOUtils.toInputStream("stream of the converted image");
converterContext = mock(ConverterContext.class);
imageConverterUtil = mock(ImageConverterUtil.class);
imageConverterService = new ImageConverterServiceImpl(converterContext, imageConverterUtil);
}
@Test
public void testConvertTiffToJp2() throws Exception {
doNothing().when(converterContext).setConverter(new KakaduConverterTiffToJP2());
doNothing().when(converterContext).convert(anyString(), anyString(), anyList());
StormTaskTuple stormTaskTuple = prepareStormTaskTuple("image/tiff");
when(imageConverterUtil.getStream(anyString())).thenReturn(convertedStream);
imageConverterService.convertFile(stormTaskTuple);
assertResultedStormTaskTuple(stormTaskTuple);
}
@Test(expected = AssertionError.class)
public void testUnrecognizedMimeType() throws Exception {
doNothing().when(converterContext).setConverter(new KakaduConverterTiffToJP2());
doNothing().when(converterContext).convert(anyString(), anyString(), anyList());
StormTaskTuple stormTaskTuple = prepareStormTaskTuple("Undefined");
when(imageConverterUtil.getStream(anyString())).thenReturn(convertedStream);
imageConverterService.convertFile(stormTaskTuple);
}
@Test
public void testConvertJpegToJp2() throws Exception {
doNothing().when(converterContext).setConverter(new KakaduConverterTiffToJP2());
doNothing().when(converterContext).convert(anyString(), anyString(), anyList());
StormTaskTuple stormTaskTuple = prepareStormTaskTuple("image/jpeg");
when(imageConverterUtil.getStream(anyString())).thenReturn(convertedStream);
imageConverterService.convertFile(stormTaskTuple);
assertResultedStormTaskTuple(stormTaskTuple);
}
private StormTaskTuple prepareStormTaskTuple(String mimeType) throws Exception {
StormTaskTuple stormTaskTuple = new StormTaskTuple();
stormTaskTuple.addParameter(PluginParameterKeys.MIME_TYPE, mimeType);
stormTaskTuple.addParameter(PluginParameterKeys.OUTPUT_MIME_TYPE, "image/jp2");
stormTaskTuple.setFileUrl(SOURCE_VERSION_URL);
stormTaskTuple.setFileData(sourceStream);
return stormTaskTuple;
}
private void assertResultedStormTaskTuple(StormTaskTuple stormTaskTuple) {
String outputFileName = stormTaskTuple.getParameter(PluginParameterKeys.OUTPUT_FILE_NAME);
assertNotNull(outputFileName);
assertEquals(FilenameUtils.getExtension(outputFileName), JP2_EXTENSION);
assertNotNull(stormTaskTuple.getFileByteDataAsStream());
assertNotNull(stormTaskTuple.getFileData());
}
}