diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorRequestTest2.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorRequestTest2.java | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorRequestTest2.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorRequestTest2.java new file mode 100644 index 000000000..0c9d67cbe --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorRequestTest2.java @@ -0,0 +1,157 @@ +package org.eclipse.equinox.p2.tests.artifact.repository; + +import java.io.File; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.internal.p2.artifact.repository.MirrorRequest; +import org.eclipse.equinox.internal.p2.artifact.repository.MirrorSelector; +import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository; +import org.eclipse.equinox.internal.p2.metadata.ArtifactKey; +import org.eclipse.equinox.internal.p2.repository.Transport; +import org.eclipse.equinox.internal.p2.transport.ecf.RepositoryTransport; +import org.eclipse.equinox.p2.core.ProvisionException; +import org.eclipse.equinox.p2.metadata.IArtifactKey; +import org.eclipse.equinox.p2.metadata.Version; +import org.eclipse.equinox.p2.query.*; +import org.eclipse.equinox.p2.repository.IRepository; +import org.eclipse.equinox.p2.repository.artifact.*; +import org.eclipse.equinox.p2.repository.artifact.spi.AbstractArtifactRepository; +import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; +import org.eclipse.equinox.p2.tests.testserver.helper.AbstractTestServerClientCase; + +public class MirrorRequestTest2 extends AbstractTestServerClientCase { + + private SimpleArtifactRepository sourceRepository; + private File targetLocation; + private SimpleArtifactRepository targetRepository; + + @Override + public void setUp() throws Exception { + super.setUp(); + targetLocation = File.createTempFile("target", ".repo"); + targetLocation.delete(); + targetLocation.mkdirs(); + targetRepository = new SimpleArtifactRepository(getAgent(), "TargetRepo", targetLocation.toURI(), null); + + URI location = URI.create(getBaseURL() + "/mirrorrequest"); + + IArtifactRepositoryManager mgr = (IArtifactRepositoryManager) getAgent().getService(IArtifactRepositoryManager.SERVICE_NAME); + sourceRepository = (SimpleArtifactRepository) mgr.loadRepository(location, null); + } + + public void tearDown() throws Exception { + IArtifactRepositoryManager mgr = (IArtifactRepositoryManager) getAgent().getService(IArtifactRepositoryManager.SERVICE_NAME); + mgr.removeRepository(targetLocation.toURI()); + AbstractProvisioningTest.delete(targetLocation); + super.tearDown(); + } + + public void testRetryMirrorAfterTimeout() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { + // call test + IArtifactKey key = new ArtifactKey("test.txt", "HelloWorldText", Version.parseVersion("1.0.0")); + MirrorRequest request = new MirrorRequest(key, targetRepository, null, null, (Transport) getAgent().getService(Transport.SERVICE_NAME)); + MirrorRepo mirrorRepo = new MirrorRepo(sourceRepository); + Field field = sourceRepository.getClass().getDeclaredField("mirrors"); + field.setAccessible(true); + field.set(sourceRepository, new MirrorSelector(mirrorRepo, (Transport) getAgent().getService(Transport.SERVICE_NAME)) { + private int count = 0; + + @Override + public synchronized URI getMirrorLocation(URI inputLocation, IProgressMonitor monitor) { + if (count++ == 0) { + return inputLocation; + } + return URI.create(getBaseURL() + "/mirrorrequest/mirror-two/plugins/HelloWorldText_1.0.0.txt"); + } + + @Override + public synchronized boolean hasValidMirror() { + return true; + } + }); + + request.perform(mirrorRepo, new NullProgressMonitor()); + + // The download succeeded + assertTrue(request.getResult().toString(), request.getResult().isOK()); + } + + public void testTimeoutForgivableAfterTimeout() { + try { + System.setProperty(RepositoryTransport.TIMEOUT_RETRY, "4"); + // call test + IArtifactKey key = new ArtifactKey("test.txt", "HelloWorldText", Version.parseVersion("1.0.0")); + MirrorRequest request = new MirrorRequest(key, targetRepository, null, null, (Transport) getAgent().getService(Transport.SERVICE_NAME)); + request.perform(sourceRepository, new NullProgressMonitor()); + + // The download succeeded + assertTrue(request.getResult().toString(), request.getResult().isOK()); + } finally { + System.clearProperty(RepositoryTransport.TIMEOUT_RETRY); + } + } + + protected class MirrorRepo extends AbstractArtifactRepository { + SimpleArtifactRepository delegate; + int downloadCount = 0; + + MirrorRepo(SimpleArtifactRepository repo) { + super(getAgent(), repo.getName(), repo.getType(), repo.getVersion(), repo.getLocation(), repo.getDescription(), repo.getProvider(), repo.getProperties()); + delegate = repo; + } + + @Override + public String getProperty(String key) { + return getProperties().get(key); + } + + @Override + public synchronized Map<String, String> getProperties() { + Map<String, String> newProperties = new HashMap<String, String>(super.getProperties()); + newProperties.put(IRepository.PROP_MIRRORS_URL, getBaseURL() + "/mirrorrequest/mirrors.xml"); + newProperties.put(IRepository.PROP_MIRRORS_BASE_URL, getBaseURL() + "/mirrorrequest"); + return newProperties; + } + + public boolean contains(IArtifactDescriptor descriptor) { + return delegate.contains(descriptor); + } + + public boolean contains(IArtifactKey key) { + return delegate.contains(key); + } + + public IStatus getArtifact(IArtifactDescriptor descriptor, OutputStream destination, IProgressMonitor monitor) { + downloadCount++; + return delegate.getArtifact(descriptor, destination, monitor); + } + + public IArtifactDescriptor[] getArtifactDescriptors(IArtifactKey key) { + return delegate.getArtifactDescriptors(key); + } + + public IStatus getArtifacts(IArtifactRequest[] requests, IProgressMonitor monitor) { + return delegate.getArtifacts(requests, monitor); + } + + public OutputStream getOutputStream(IArtifactDescriptor descriptor) throws ProvisionException { + return delegate.getOutputStream(descriptor); + } + + public IStatus getRawArtifact(IArtifactDescriptor descriptor, OutputStream destination, IProgressMonitor monitor) { + return delegate.getRawArtifact(descriptor, destination, monitor); + } + + public IQueryable<IArtifactDescriptor> descriptorQueryable() { + return delegate.descriptorQueryable(); + } + + public IQueryResult<IArtifactKey> query(IQuery<IArtifactKey> query, IProgressMonitor monitor) { + return delegate.query(query, monitor); + } + } +} |