package org.eclipse.recommenders.models;
import static com.google.common.base.Optional.of;
import static org.eclipse.recommenders.models.ModelCoordinate.UNKNOWN;
import static org.eclipse.recommenders.utils.names.VmTypeName.OBJECT;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Map;
import java.util.zip.ZipFile;
import org.eclipse.recommenders.coordinates.ProjectCoordinate;
import org.eclipse.recommenders.utils.Zips;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.base.Optional;
public class PoolingModelProviderTest {
private static File zip;
UniqueTypeName someName = new UniqueTypeName(ProjectCoordinate.UNKNOWN, OBJECT);
@BeforeClass
public static void beforeClass() throws IOException {
zip = new File(Zips.NULL().getName());
zip.deleteOnExit();
}
PoolingModelProvider<UniqueTypeName, String> sut = create();
@Test
public void testAcquireRelease() throws Exception {
Optional<String> last = Optional.absent();
for (int i = 0; i < 200; i++) {
last = sut.acquireModel(someName);
sut.releaseModel(last.get());
}
assertTrue("pool exhausted but returned all models properly", last.isPresent());
}
@Test
public void testNoReleaseExhaustsPool() {
Optional<String> last = Optional.absent();
for (int i = 0; i < 10; i++) {
last = sut.acquireModel(someName);
}
assertFalse("pool did not get exhausted", last.isPresent());
}
@Test
public void testRepeatedCallsReturnSameModel() {
String model1 = sut.acquireModel(someName).orNull();
String model2 = sut.acquireModel(someName).orNull();
// two different models because model1 wasn't release yet
assertNotSame(model1, model2);
sut.releaseModel(model1);
String model3 = sut.acquireModel(someName).orNull();
// model1 was release and should be reused by the pool, thus should be the same as model1
assertSame(model1, model3);
}
private PoolingModelProvider<UniqueTypeName, String> create() {
IModelRepository repository = mock(IModelRepository.class);
when(repository.getLocation(any(ModelCoordinate.class), anyBoolean())).thenReturn(of(zip));
IModelArchiveCoordinateAdvisor models = mock(IModelArchiveCoordinateAdvisor.class);
when(models.suggest(any(ProjectCoordinate.class), anyString())).thenReturn(of(UNKNOWN));
return new PoolingModelProviderStub(repository, models, "calls",
Collections.<String, IInputStreamTransformer>emptyMap());
}
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 a "simple" model
return new String("");
}
@Override
protected Optional<InputStream> getInputStream(ZipFile zip, String path) throws IOException {
return Optional.of(mock(InputStream.class));
}
@Override
protected String getBasePath(UniqueTypeName key) {
return "";
}
}
}