blob: 918abfec1c9d9e4ab1c218fb3097da0976966d86 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 compeople AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* compeople AG (Stefan Liebig) - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.tests.artifact.repository;
import java.io.*;
import java.lang.reflect.Method;
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.simple.SimpleArtifactDescriptor;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
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.repository.artifact.IArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
/**
* Test code that is affected by bug 252308 within {@code MirrorRequest}.
*/
public class Bug252308 extends AbstractProvisioningTest {
private Method transferSingle;
private Method extractRootCause;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
extractRootCause = MirrorRequest.class.getDeclaredMethod("extractRootCause", new Class[] {IStatus.class});
extractRootCause.setAccessible(true);
transferSingle = MirrorRequest.class.getDeclaredMethod("transferSingle", new Class[] {IArtifactDescriptor.class, IArtifactDescriptor.class, IProgressMonitor.class});
transferSingle.setAccessible(true);
}
private IStatus extractRootCause(IStatus status) throws Exception {
return (IStatus) extractRootCause.invoke(null, new Object[] {status});
}
private IStatus transferSingle(MirrorRequest request, IArtifactDescriptor destinationDescriptor, IArtifactDescriptor sourceDescriptor, IProgressMonitor monitor) throws Exception {
return (IStatus) transferSingle.invoke(request, new Object[] {destinationDescriptor, sourceDescriptor, monitor});
}
public void testExtractRootCauseNullStatus() throws Exception {
IStatus status = extractRootCause(null);
assertNull(status);
}
public void testExtractRootCauseWarningStatus() throws Exception {
IStatus status = extractRootCause(new Status(IStatus.WARNING, "id1", "Test", new IOException("IO")));
assertNull(status);
}
public void testExtractRootCauseErrorStatusWithException() throws Exception {
IStatus status = extractRootCause(new Status(IStatus.ERROR, "id1", "Test", new IOException("IO")));
assertNotNull(status);
assertEquals("id1", status.getPlugin());
assertEquals("Test", status.getMessage());
assertEquals("IO", status.getException().getMessage());
}
public void testExtractRootCauseFromFlatMultiStatus() throws Exception {
MultiStatus multiStatus = new MultiStatus("id1", 0, "Message", new FileNotFoundException("FNFE"));
IStatus status = extractRootCause(multiStatus);
assertNull(status);
}
public void testExtractRootCauseFromNestedMultiStatus() throws Exception {
MultiStatus multiStatus = new MultiStatus("id0", 0, "Message", new FileNotFoundException("FNFE"));
Status status1 = new Status(IStatus.WARNING, "id1", "Test", new IOException("IO"));
Status status2 = new Status(IStatus.ERROR, "id2", "Test", new IOException("IO"));
Status status3 = new Status(IStatus.ERROR, "id3", "Test", null);
multiStatus.add(status1);
multiStatus.add(status2);
multiStatus.add(status3);
IStatus status = extractRootCause(multiStatus);
assertNotNull(status);
assertEquals("id2", status.getPlugin());
}
public void testExtractRootCauseFromNestedNestedMultiStatus() throws Exception {
MultiStatus multiStatus = new MultiStatus("id0", 0, "Message", new FileNotFoundException("FNFE"));
Status status1 = new Status(IStatus.WARNING, "id1", "Test", new IOException("IO"));
MultiStatus status2 = new MultiStatus("id2", 0, "Test", null);
Status status3 = new Status(IStatus.ERROR, "id3", "Test", new NullPointerException("NPE"));
multiStatus.add(status1);
multiStatus.add(status2);
multiStatus.add(status3);
Status status21 = new Status(IStatus.WARNING, "id21", "Test", new IOException("IO"));
Status status22 = new Status(IStatus.ERROR, "id22", "Test", new IOException("IO"));
Status status23 = new Status(IStatus.ERROR, "id23", "Test", new ProvisionException("PE"));
status2.add(status21);
status2.add(status22);
status2.add(status23);
IStatus status = extractRootCause(multiStatus);
assertNotNull(status);
assertEquals("id22", status.getPlugin());
}
public void testTransferError() throws Exception {
File simpleRepo = getTestData("simple repository", "testData/artifactRepo/transferTestRepo");
IArtifactRepository source = null;
IArtifactRepository target = null;
try {
source = getArtifactRepositoryManager().loadRepository(simpleRepo.toURI(), new NullProgressMonitor());
target = createArtifactRepository(new File(getTempFolder(), getName()).toURI(), null);
} catch (ProvisionException e) {
fail("failing setting up the tests", e);
}
IArtifactDescriptor sourceDescriptor = getArtifactKeyFor(source, "osgi.bundle", "missingFromFileSystem", Version.createOSGi(1, 0, 0))[0];
SimpleArtifactDescriptor targetDescriptor = new SimpleArtifactDescriptor(sourceDescriptor);
targetDescriptor.setRepositoryProperty("artifact.folder", "true");
class TestRequest extends MirrorRequest {
public TestRequest(IArtifactKey key, IArtifactRepository targetRepository, Map<String, String> targetDescriptorProperties, Map<String, String> targetRepositoryProperties) {
super(key, targetRepository, targetDescriptorProperties, targetRepositoryProperties, getTransport());
}
public void setSource(IArtifactRepository source) {
super.setSourceRepository(source);
}
}
TestRequest request = new TestRequest(new ArtifactKey("osgi.bundle", "missingFromFileSystem", Version.createOSGi(1, 0, 0)), target, null, null);
request.setSource(source);
IStatus s = transferSingle(request, targetDescriptor, sourceDescriptor, new NullProgressMonitor());
assertTrue(s.toString(), s.getException().getClass() == FileNotFoundException.class);
}
private IArtifactDescriptor[] getArtifactKeyFor(IArtifactRepository repo, String classifier, String id, Version version) {
return repo.getArtifactDescriptors(new ArtifactKey(classifier, id, version));
}
}