blob: 3e59a217b77cdef47f08b5facc509ace7946542c [file] [log] [blame]
/*
* Copyright (c) 2014, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.oomph.p2.tests;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import org.eclipse.oomph.p2.core.Agent;
import org.eclipse.oomph.p2.core.AgentManager;
import org.eclipse.oomph.p2.core.P2Util;
import org.eclipse.oomph.p2.core.P2Util.VersionedIdFilter;
import org.eclipse.oomph.p2.core.ProfileTransaction;
import org.eclipse.oomph.p2.internal.core.AgentManagerImpl;
import org.eclipse.oomph.p2.internal.core.P2CorePlugin;
import org.eclipse.oomph.tests.AbstractTest;
import org.eclipse.oomph.util.PropertiesUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.p2.internal.repository.mirroring.Mirroring;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.IVersionedId;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.IRepository;
import org.eclipse.equinox.p2.repository.artifact.ArtifactKeyQuery;
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.junit.BeforeClass;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
/**
* @author Eike Stepper
*/
@SuppressWarnings("restriction")
public abstract class AbstractP2Test extends AbstractTest
{
private static final String TMP = PropertiesUtil.getProperty("java.io.tmpdir");
private static final String CDO = "p2-test-mirror-001-cdo";
private static final String PLATFORM = "p2-test-mirror-001-platform";
private static final String SIMPLE_METADATA_REPOSITORY = IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY;
private static final String SIMPLE_ARTIFACT_REPOSITORY = IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY;
public static void mirrorArtifactRepository(URI sourceURI, URI targetURI, VersionedIdFilter filter, IProgressMonitor monitor) throws CoreException
{
List<URI> repositoriesToRemove = new ArrayList<URI>();
repositoriesToRemove.add(targetURI);
Agent agent = P2Util.getAgentManager().getCurrentAgent();
IArtifactRepositoryManager manager = agent.getArtifactRepositoryManager();
if (!manager.contains(sourceURI))
{
repositoriesToRemove.add(sourceURI);
}
try
{
IArtifactRepository sourceRepository = manager.loadRepository(sourceURI, 0, monitor);
String name = sourceRepository.getName();
if (name == null)
{
name = sourceURI.toString();
}
IArtifactRepository targetRepository = manager.createRepository(targetURI, name, SIMPLE_ARTIFACT_REPOSITORY, sourceRepository.getProperties());
targetRepository.setProperty(IRepository.PROP_COMPRESSED, "true");
List<IArtifactKey> keys = new ArrayList<IArtifactKey>();
for (IArtifactKey key : P2Util.asIterable(sourceRepository.query(ArtifactKeyQuery.ALL_KEYS, null)))
{
if (filter == null || filter.matches(key))
{
keys.add(key);
}
}
Transport transport = (Transport)agent.getProvisioningAgent().getService(Transport.SERVICE_NAME);
Mirroring mirror = new Mirroring(sourceRepository, targetRepository, true);
mirror.setCompare(false);
mirror.setTransport(transport);
mirror.setArtifactKeys(keys.toArray(new IArtifactKey[keys.size()]));
IStatus result = mirror.run(true, false);
P2CorePlugin.INSTANCE.coreException(result);
}
finally
{
for (URI uri : repositoriesToRemove)
{
manager.removeRepository(uri);
}
}
}
public static void mirrorRepository(URI sourceURI, URI targetURI, VersionedIdFilter filter, IProgressMonitor monitor) throws CoreException
{
mirrorMetadataRepository(sourceURI, targetURI, filter, monitor);
mirrorArtifactRepository(sourceURI, targetURI, filter, monitor);
}
public static void mirrorMetadataRepository(URI sourceURI, URI targetURI, VersionedIdFilter filter, IProgressMonitor monitor) throws CoreException
{
List<URI> repositoriesToRemove = new ArrayList<URI>();
repositoriesToRemove.add(targetURI);
IMetadataRepositoryManager manager = P2Util.getAgentManager().getCurrentAgent().getMetadataRepositoryManager();
if (!manager.contains(sourceURI))
{
repositoriesToRemove.add(sourceURI);
}
try
{
IMetadataRepository sourceRepository = manager.loadRepository(sourceURI, 0, monitor);
String name = sourceRepository.getName();
if (name == null)
{
name = sourceURI.toString();
}
IMetadataRepository targetRepository = manager.createRepository(targetURI, name, SIMPLE_METADATA_REPOSITORY, sourceRepository.getProperties());
targetRepository.setProperty(IRepository.PROP_COMPRESSED, "true");
List<IInstallableUnit> ius = new ArrayList<IInstallableUnit>();
for (IInstallableUnit iu : P2Util.asIterable(sourceRepository.query(QueryUtil.createIUAnyQuery(), null)))
{
if (filter == null || filter.matches(iu))
{
ius.add(iu);
}
}
targetRepository.addInstallableUnits(ius);
}
finally
{
for (URI uri : repositoriesToRemove)
{
manager.removeRepository(uri);
}
}
}
private static final VersionedIdFilter CDO_FILTER = new VersionedIdFilter()
{
public boolean matches(IVersionedId versionedId)
{
String id = versionedId.getId();
return id.startsWith("org.eclipse.net4j.util") || id.startsWith("org.apache");
}
};
private static final VersionedIdFilter PLATFORM_FILTER = new VersionedIdFilter()
{
public boolean matches(IVersionedId versionedId)
{
String id = versionedId.getId();
return id.startsWith("com.jcraft.jsch") || id.startsWith("org.apache") || id.startsWith("a.jre");
}
};
public static final File CDO_OLD = new File(TMP, CDO + "-old");
public static final File CDO_NEW = new File(TMP, CDO + "-new");
public static final File PLATFORM_OLD = new File(TMP, PLATFORM + "-old");
public static final File PLATFORM_NEW = new File(TMP, PLATFORM + "-new");
@BeforeClass
public static void setUpBeforeClass() throws Exception
{
mirror("http://download.eclipse.org/modeling/emf/cdo/drops/R20130918-0029", CDO_OLD, CDO_FILTER);
mirror("http://download.eclipse.org/modeling/emf/cdo/drops/R20140218-1655", CDO_NEW, CDO_FILTER);
mirror("http://download.eclipse.org/eclipse/updates/4.3/R-4.3.1-201309111000", PLATFORM_OLD, PLATFORM_FILTER);
mirror("http://download.eclipse.org/eclipse/updates/4.3/R-4.3.2-201402211700", PLATFORM_NEW, PLATFORM_FILTER);
}
private static void mirror(String repo, File local, VersionedIdFilter filter) throws Exception
{
if (!local.isDirectory())
{
LOGGER.setTaskName("Creating test mirror of " + repo + " under " + local);
mirrorRepository(new URI(repo), local.toURI(), filter, LOGGER);
LOGGER.setTaskName(null);
}
}
@Override
public void setUp() throws Exception
{
super.setUp();
AgentManagerImpl.instance = new AgentManagerImpl(getUserHome());
}
@Override
public void tearDown() throws Exception
{
AgentManagerImpl.instance = null;
super.tearDown();
}
protected Agent getAgent()
{
AgentManager agentManager = P2Util.getAgentManager();
return agentManager.getAgents().iterator().next();
}
protected Agent getFreshAgent()
{
AgentManagerImpl.instance = new AgentManagerImpl(getUserHome());
return getAgent();
}
protected void commitProfileTransaction(ProfileTransaction transaction, boolean expectedChange) throws CoreException
{
boolean actualChange = transaction.commit(LOGGER);
assertThat(actualChange, is(expectedChange));
}
}