package org.eclipse.recommenders.internal.models.rcp;
import static com.google.common.collect.ImmutableMap.of;
import static java.util.Arrays.asList;
import static org.eclipse.core.net.proxy.IProxyData.HTTP_PROXY_TYPE;
import static org.eclipse.recommenders.utils.Constants.EXT_ZIP;
import static org.eclipse.recommenders.utils.Pair.newPair;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.*;
import java.io.File;
import java.net.URI;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.net.proxy.IProxyData;
import org.eclipse.core.net.proxy.IProxyService;
import org.eclipse.recommenders.models.ModelCoordinate;
import org.eclipse.recommenders.models.ModelRepository;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.common.eventbus.EventBus;
@SuppressWarnings("unchecked")
@RunWith(MockitoJUnitRunner.class)
public class EclipseModelRepositoryTest {
private static final IProxyData[] NO_PROXY = new IProxyData[0];
private static final int PROXY_PORT = 80;
private static final String PROXY_HOST = "proxy.example.net";
private static final String FIRST_REPO = "http://www.example.org/repo1";
private static final String SECOND_REPO = "http://www.example.com/repo2";
private static final String THIRD_REPO = "http://www.example.net/repo3";
private static final ModelCoordinate COORDINATE = new ModelCoordinate("org.example", "artifact", "model", EXT_ZIP,
"1.0.0");
private static final File FIRST_MODEL_ZIP = new File("artifact-1.0.0-1-model.zip");
private static final File SECOND_MODEL_ZIP = new File("artifact-1.0.0-1-model.zip");
private static final ImmutableMap<ModelCoordinate, File> EMPTY_REPOSITORY = ImmutableMap.of();
@Rule
public TemporaryFolder temp = new TemporaryFolder();
@Mock
private EventBus bus;
@Mock
private IProxyService proxy;
@Mock
private ModelsRcpPreferences prefs;
@Test
public void testResolvePicksFirstMatch() {
ModelRepository firstRepo = mockModelRepository(of(COORDINATE, FIRST_MODEL_ZIP));
ModelRepository secondRepo = mockModelRepository(of(COORDINATE, SECOND_MODEL_ZIP));
when(prefs.getServerUsername(anyString())).thenReturn(Optional.<String>absent());
EclipseModelRepository sut = new EclipseModelRepository(temp.getRoot(), proxy, prefs, bus);
sut.openInternal(asList(newPair(FIRST_REPO, firstRepo), newPair(SECOND_REPO, secondRepo)));
Optional<File> result = sut.resolve(COORDINATE, true);
sut.close();
assertThat(result.get(), is(equalTo(FIRST_MODEL_ZIP)));
}
@Test
public void testResolveSearchesThroughAllRepositories() {
ModelRepository firstRepo = mockModelRepository(EMPTY_REPOSITORY);
ModelRepository secondRepo = mockModelRepository(of(COORDINATE, SECOND_MODEL_ZIP));
when(prefs.getServerUsername(anyString())).thenReturn(Optional.<String>absent());
EclipseModelRepository sut = new EclipseModelRepository(temp.getRoot(), proxy, prefs, bus);
sut.openInternal(asList(newPair(FIRST_REPO, firstRepo), newPair(SECOND_REPO, secondRepo)));
Optional<File> result = sut.resolve(COORDINATE, true);
sut.close();
assertThat(result.get(), is(equalTo(SECOND_MODEL_ZIP)));
}
/**
* @see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=441558">Bug 441558</a>
*/
@Test
public void testResolveUpdatesProxySettings() throws Exception {
ModelRepository firstRepo = mockModelRepository(EMPTY_REPOSITORY);
ModelRepository secondRepo = mockModelRepository(EMPTY_REPOSITORY);
ModelRepository thirdRepo = mockModelRepository(EMPTY_REPOSITORY);
when(prefs.getServerUsername(anyString())).thenReturn(Optional.<String>absent());
when(proxy.isProxiesEnabled()).thenReturn(true);
when(proxy.select(new URI(FIRST_REPO))).thenReturn(NO_PROXY);
IProxyData[] proxyData = mockProxyData(HTTP_PROXY_TYPE, PROXY_HOST, PROXY_PORT, null, null);
when(proxy.select(new URI(SECOND_REPO))).thenReturn(proxyData);
when(proxy.select(new URI(THIRD_REPO))).thenReturn(NO_PROXY);
EclipseModelRepository sut = new EclipseModelRepository(temp.getRoot(), proxy, prefs, bus);
sut.openInternal(asList(newPair(FIRST_REPO, firstRepo), newPair(SECOND_REPO, secondRepo),
newPair(THIRD_REPO, thirdRepo)));
Optional<File> result = sut.resolve(COORDINATE, true);
sut.close();
verify(firstRepo).unsetProxy();
verify(secondRepo).setProxy("http", PROXY_HOST, PROXY_PORT, null, null);
verify(thirdRepo).unsetProxy();
assertThat(result.isPresent(), is(false));
}
private ModelRepository mockModelRepository(Map<ModelCoordinate, File> contents) {
ModelRepository repo = Mockito.mock(ModelRepository.class);
when(repo.resolve(Mockito.any(ModelCoordinate.class), anyBoolean())).thenReturn(Optional.<File>absent());
for (Entry<ModelCoordinate, File> entry : contents.entrySet()) {
ModelCoordinate coordinate = entry.getKey();
File file = entry.getValue();
when(repo.resolve(Mockito.eq(coordinate), anyBoolean())).thenReturn(Optional.of(file));
}
return repo;
}
private IProxyData[] mockProxyData(String type, String host, int port, String userId, String password) {
IProxyData proxyData = mock(IProxyData.class);
when(proxyData.getType()).thenReturn(type);
when(proxyData.getHost()).thenReturn(host);
when(proxyData.getPort()).thenReturn(port);
when(proxyData.getUserId()).thenReturn(userId);
when(proxyData.getPassword()).thenReturn(password);
return new IProxyData[] { proxyData };
}
}