/*******************************************************************************
* Copyright (c) 2013 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.tests.mirror;
import static org.eclipse.equinox.p2.tests.AbstractProvisioningTest.getTestData;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.PrintStream;
import java.net.URI;
import java.util.*;
import junit.framework.AssertionFailedError;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.internal.repository.tools.MirrorApplication;
import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.tests.StringBufferStream;
import org.eclipse.equinox.p2.tests.TestAgentProvider;
import org.junit.*;
import org.junit.rules.TemporaryFolder;
/**
* Tests for joint mirroring of units and artifacts. See other test classes for unit-only and artifact-only mirroring tests.
*/
public class MirrorApplicationTest {
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
@Rule
public TestAgentProvider agentProvider = new TestAgentProvider();
private File sourceRepoLocation;
private File destRepoLocation;
private MirrorApplication subject;
@Before
public void initRepositories() throws Exception {
sourceRepoLocation = getTestData("0.0", "/testData/mirror/mirrorSourceRepo1 with space");
destRepoLocation = tempFolder.newFolder("destRepo");
}
@Test
public void testMirrorUnitWithArtifact() throws Exception {
IInstallableUnit unit = getUnitFromSourceRepo("helloworld");
subject = createApplication(sourceRepoLocation, destRepoLocation, true);
subject.setSourceIUs(Arrays.asList(unit));
runApplication(subject);
assertThat(artifactsIn(destRepoLocation), is(Collections.singleton("helloworld")));
}
@Test
public void testMirrorUnitWithoutArtifacts() throws Exception {
IInstallableUnit unitWithoutArtifact = getUnitFromSourceRepo("a.jre");
assertThat(unitWithoutArtifact.getArtifacts(), not(hasItem(any(IArtifactKey.class)))); // self-test // TODO use is(empty()) once Hamcrest 1.3 is available
subject = createApplication(sourceRepoLocation, destRepoLocation, true);
subject.setSourceIUs(Arrays.asList(unitWithoutArtifact));
runApplication(subject);
assertThat(artifactsIn(destRepoLocation), not(hasItem(any(String.class)))); // TODO use is(empty()) once Hamcrest 1.3 is available
}
private IInstallableUnit getUnitFromSourceRepo(String id) throws Exception {
IMetadataRepository repository = agentProvider.getService(IMetadataRepositoryManager.class).loadRepository(sourceRepoLocation.toURI(), null);
IQueryResult<IInstallableUnit> queryResult = repository.query(QueryUtil.createIUQuery(id), null);
if (queryResult.isEmpty())
throw new AssertionFailedError("No unit with ID '" + id + "' found in repository " + sourceRepoLocation);
return queryResult.iterator().next();
}
private Set<String> artifactsIn(File repositoryLocation) throws Exception {
IArtifactRepository repository = agentProvider.getService(IArtifactRepositoryManager.class).loadRepository(repositoryLocation.toURI(), null);
return artifactsIn(repository);
}
private static Set<String> artifactsIn(IArtifactRepository repository) {
Set<String> result = new HashSet<String>();
for (IArtifactKey artifactKey : repository.query(QueryUtil.createMatchQuery(IArtifactKey.class, "true"), null).toUnmodifiableSet()) {
result.add(artifactKey.getId());
}
return result;
}
private static MirrorApplication createApplication(File sourceLocation, File destLocation, Boolean append) {
MirrorApplication app = new MirrorApplication();
if (destLocation != null) {
RepositoryDescriptor dest = createRepositoryDescriptor(destLocation.toURI(), append);
app.addDestination(dest);
}
if (sourceLocation != null) {
RepositoryDescriptor src = createRepositoryDescriptor(sourceLocation.toURI(), null);
app.addSource(src);
}
return app;
}
private static RepositoryDescriptor createRepositoryDescriptor(URI location, Boolean append) {
RepositoryDescriptor descriptor = new RepositoryDescriptor();
descriptor.setLocation(location);
if (append != null)
descriptor.setAppend(append);
return descriptor;
}
private static StringBuffer runApplication(MirrorApplication app) throws ProvisionException {
StringBuffer buffer = new StringBuffer();
PrintStream out = System.out;
try {
System.setOut(new PrintStream(new StringBufferStream(buffer)));
app.run(null);
} finally {
System.setOut(out);
}
return buffer;
}
}