package org.eclipse.recommenders.models;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Map;
import java.util.zip.ZipFile;
import org.apache.commons.io.IOUtils;
import org.eclipse.recommenders.coordinates.ProjectCoordinate;
import org.eclipse.recommenders.testing.JarFileMockBuilder;
import org.eclipse.recommenders.utils.Constants;
import org.eclipse.recommenders.utils.Zips;
import org.eclipse.recommenders.utils.names.VmTypeName;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
public class TransformingModelProviderTest {
private static final String TRANSFORM_EXTENSION = "transform";
private static final Map<String, IInputStreamTransformer> NO_TRANSFORMERS = Collections.emptyMap();
private static final UniqueTypeName ORG_EXAMPLE_FOO = new UniqueTypeName(ProjectCoordinate.UNKNOWN,
VmTypeName.get("Lorg/example/Foo"));
private static final UniqueTypeName ORG_EXAMPLE_BAR = new UniqueTypeName(ProjectCoordinate.UNKNOWN,
VmTypeName.get("Lorg/example/Bar"));
private static final UniqueTypeName ORG_EXAMPLE_BAZ = new UniqueTypeName(ProjectCoordinate.UNKNOWN,
VmTypeName.get("Lorg/example/Baz"));
private static final String ORG_EXAMPLE_FOO_JSON_TRANSFORM = "org/example/Foo.json.transform";
private static final String ORG_EXAMPLE_BAR_JSON = "org/example/Bar.json";
private static final String TRANSFORMED_DATA = "Transformed Data";
private static final String UNTRANSFORMED_DATA = "Untransformed Data";
@Test
public void testNoModel() throws Exception {
SimpleModelProvider<UniqueTypeName, String> sut = createModelProvider(NO_TRANSFORMERS);
ZipFile zip = mockZipFile();
Optional<String> transformedModel = sut.doAcquireModel(ORG_EXAMPLE_BAZ, zip);
assertThat(transformedModel.isPresent(), is(false));
}
@Test
public void testNoTransformers() throws Exception {
SimpleModelProvider<UniqueTypeName, String> sut = createModelProvider(NO_TRANSFORMERS);
ZipFile zip = mockZipFile();
Optional<String> transformedModel = sut.doAcquireModel(ORG_EXAMPLE_FOO, zip);
assertThat(transformedModel.isPresent(), is(false));
String untransformedModel = sut.doAcquireModel(ORG_EXAMPLE_BAR, zip).get();
assertThat(untransformedModel, is(equalTo(UNTRANSFORMED_DATA)));
}
@Test
public void testTransform() throws Exception {
Map<String, IInputStreamTransformer> transformers = ImmutableMap.<String, IInputStreamTransformer>of(
TRANSFORM_EXTENSION, new DummyTransformer());
SimpleModelProvider<UniqueTypeName, String> sut = createModelProvider(transformers);
ZipFile zip = mockZipFile();
String transformedModel = sut.doAcquireModel(ORG_EXAMPLE_FOO, zip).get();
Assert.assertThat(transformedModel, Matchers.is(Matchers.equalTo(TRANSFORMED_DATA)));
String untransformedModel = sut.doAcquireModel(ORG_EXAMPLE_BAR, zip).get();
Assert.assertThat(untransformedModel, Matchers.is(Matchers.equalTo(UNTRANSFORMED_DATA)));
}
private ZipFile mockZipFile() {
JarFileMockBuilder builder = new JarFileMockBuilder();
builder.addEntry(ORG_EXAMPLE_FOO_JSON_TRANSFORM, IOUtils.toInputStream(UNTRANSFORMED_DATA));
builder.addEntry(ORG_EXAMPLE_BAR_JSON, IOUtils.toInputStream(UNTRANSFORMED_DATA));
return builder.build();
}
private SimpleModelProvider<UniqueTypeName, String> createModelProvider(
Map<String, IInputStreamTransformer> transformers) {
IModelRepository repository = mock(IModelRepository.class);
IModelArchiveCoordinateAdvisor models = mock(IModelArchiveCoordinateAdvisor.class);
return new PoolingModelProviderStub(repository, models, "type", transformers);
}
private static final class PoolingModelProviderStub extends PoolingModelProvider<UniqueTypeName, String> {
private PoolingModelProviderStub(IModelRepository repository, IModelArchiveCoordinateAdvisor index,
String modelType, Map<String, IInputStreamTransformer> transformers) {
super(repository, index, modelType, transformers);
}
@Override
protected String loadModel(InputStream in, UniqueTypeName key) throws IOException {
return IOUtils.toString(in);
}
@Override
protected String getBasePath(UniqueTypeName key) {
return Zips.path(key.getName(), Constants.DOT_JSON);
}
}
private static final class DummyTransformer implements IInputStreamTransformer {
@Override
public InputStream transform(InputStream stream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(TRANSFORMED_DATA.getBytes());
return new ByteArrayInputStream(outputStream.toByteArray());
}
}
}