blob: d10a67600b72300f2c579355b06de4c9a48f76b6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.tests.planner;
import java.io.File;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest;
import org.eclipse.equinox.p2.core.*;
import org.eclipse.equinox.p2.engine.*;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.planner.IPlanner;
import org.eclipse.equinox.p2.planner.ProfileInclusionRules;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
public class Bug300104 extends AbstractProvisioningTest {
String profileLoadedId = "SDKProfile";
IMetadataRepository repo = null;
IProvisioningAgent agent = null;
private IProfileRegistry profileRegistry;
protected void setUp() throws Exception {
super.setUp();
File reporegistry1 = getTestData("test data bug 300104", "testData/bug300104/p2");
File tempFolder = new File(getTempFolder(), "p2");
copy("0.2", reporegistry1, tempFolder);
IProvisioningAgentProvider provider = getAgentProvider();
agent = provider.createAgent(tempFolder.toURI());
profileRegistry = ((IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME));
assertNotNull(profileRegistry.getProfile(profileLoadedId));
}
IInstallableUnit getIU(IMetadataRepository source, String id, String version) {
IQueryResult c = repo.query(QueryUtil.createIUQuery(id, Version.create(version)), new NullProgressMonitor());
assertEquals(1, queryResultSize(c));
return (IInstallableUnit) c.iterator().next();
}
public void testInstallPatchesInOrder() throws ProvisionException {
// generated metadata was massaged to remove artifact aspects which would require tests to also
// provide artifacts.
boolean optional = true;
installHello(optional);
applyHelloPatch1();
applyHelloPatch2();
}
public void testInstallPatchesInOrderStricy() throws ProvisionException {
// generated metadata was massaged to remove artifact aspects which would require tests to also
// provide artifacts.
boolean optional = false;
installHello(optional);
applyHelloPatch1();
applyHelloPatch2();
}
public void testInstallOnlyLaterPatch() throws ProvisionException {
boolean optional = true;
installHello(optional);
applyHelloPatch2();
}
private void installHello(boolean optional) throws ProvisionException {
// install hello 1.0 and related feature.
repo = loadMetadataRepository(getTestData("Repository for 300104", "testData/bug300104/hello1.0").toURI());
ProfileChangeRequest installFeature1 = new ProfileChangeRequest(profileRegistry.getProfile(profileLoadedId));
IInstallableUnit featureGroup = getIU(repo, "hellofeature.feature.group", "1.0.0.200911201237");
IInstallableUnit featureJar = getIU(repo, "hellofeature.feature.jar", "1.0.0.200911201237");
IInstallableUnit helloIU = getIU(repo, "hello", "1.0.0.200911201237");
installFeature1.addInstallableUnits(new IInstallableUnit[] {featureGroup, featureJar, helloIU});
installFeature1.setInstallableUnitInclusionRules(featureGroup, createInclusionRule(featureGroup, optional));
installFeature1.setInstallableUnitInclusionRules(featureJar, ProfileInclusionRules.createOptionalInclusionRule(featureJar));
installFeature1.setInstallableUnitInclusionRules(helloIU, ProfileInclusionRules.createOptionalInclusionRule(helloIU));
IProvisioningPlan feature1Plan = getPlannerService().getProvisioningPlan(installFeature1, new ProvisioningContext(getAgent()), null);
assertOK("installation of feature1", getEngineService().perform(feature1Plan, new NullProgressMonitor()));
assertEquals(1, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello", Version.create("1.0.0.200911201237")), new NullProgressMonitor())));
}
private IEngine getEngineService() {
return ((IEngine) agent.getService(IEngine.SERVICE_NAME));
}
private IPlanner getPlannerService() {
return ((IPlanner) agent.getService(IPlanner.SERVICE_NAME));
}
private String createInclusionRule(IInstallableUnit unit, boolean optional) {
return optional ? ProfileInclusionRules.createOptionalInclusionRule(unit) : ProfileInclusionRules.createStrictInclusionRule(unit);
}
private void applyHelloPatch1() throws ProvisionException {
// install first feature patch which updates hello to version 1.0.1
/*
<unit id='hellopatch.feature.group' version='1.0.0' singleton='false'>
<unit id='hellopatch.feature.jar' version='1.0.0'>
<unit id='hello' version='1.0.1.200911201237'>
*/
repo = loadMetadataRepository(getTestData("Repository for 300104", "testData/bug300104/hellopatch1").toURI());
ProfileChangeRequest installFeature1 = new ProfileChangeRequest(profileRegistry.getProfile(profileLoadedId));
IInstallableUnit featureGroup = getIU(repo, "hellopatch.feature.group", "1.0.0");
IInstallableUnit featureJar = getIU(repo, "hellopatch.feature.jar", "1.0.0");
IInstallableUnit helloIU = getIU(repo, "hello", "1.0.1.200911201237");
installFeature1.addInstallableUnits(new IInstallableUnit[] {featureGroup, featureJar, helloIU});
installFeature1.setInstallableUnitInclusionRules(featureGroup, ProfileInclusionRules.createOptionalInclusionRule(featureGroup));
installFeature1.setInstallableUnitInclusionRules(featureJar, ProfileInclusionRules.createOptionalInclusionRule(featureJar));
installFeature1.setInstallableUnitInclusionRules(helloIU, ProfileInclusionRules.createOptionalInclusionRule(helloIU));
IProvisioningPlan feature1Plan = getPlannerService().getProvisioningPlan(installFeature1, new ProvisioningContext(getAgent()), null);
assertOK("installation of feature1", getEngineService().perform(feature1Plan, new NullProgressMonitor()));
assertEquals(0, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello", Version.create("1.0.0.200911201237")), new NullProgressMonitor())));
assertEquals(1, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello", Version.create("1.0.1.200911201237")), new NullProgressMonitor())));
}
private void applyHelloPatch2() throws ProvisionException {
// install newer version of feature patch which updates
// hello to version 1.0.1 with later qualifier and
// adds unit hello2 1.0.0
/*
<unit id='hellopatch.feature.group' version='1.0.1.200911201358' singleton='false'>
<unit id='hellopatch.feature.jar' version='1.0.1.200911201358'>
<unit id='hello' version='1.0.1.200911201358'>
<unit id='hello2' version='1.0.0.200911201358'>
*/
repo = loadMetadataRepository(getTestData("Repository for 300104", "testData/bug300104/hellopatch2").toURI());
ProfileChangeRequest installFeature1 = new ProfileChangeRequest(profileRegistry.getProfile(profileLoadedId));
IInstallableUnit featureGroup = getIU(repo, "hellopatch.feature.group", "1.0.1.200911201358");
IInstallableUnit featureJar = getIU(repo, "hellopatch.feature.jar", "1.0.1.200911201358");
IInstallableUnit helloIU = getIU(repo, "hello", "1.0.1.200911201358");
IInstallableUnit hello2IU = getIU(repo, "hello2", "1.0.0.200911201358");
installFeature1.addInstallableUnits(new IInstallableUnit[] {featureGroup, featureJar, helloIU, hello2IU});
installFeature1.setInstallableUnitInclusionRules(featureGroup, ProfileInclusionRules.createOptionalInclusionRule(featureGroup));
installFeature1.setInstallableUnitInclusionRules(featureJar, ProfileInclusionRules.createOptionalInclusionRule(featureJar));
installFeature1.setInstallableUnitInclusionRules(helloIU, ProfileInclusionRules.createOptionalInclusionRule(helloIU));
installFeature1.setInstallableUnitInclusionRules(hello2IU, ProfileInclusionRules.createOptionalInclusionRule(hello2IU));
IProvisioningPlan feature1Plan = getPlannerService().getProvisioningPlan(installFeature1, new ProvisioningContext(getAgent()), null);
assertOK("installation of feature1", getEngineService().perform(feature1Plan, new NullProgressMonitor()));
assertEquals(1, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello2", Version.create("1.0.0.200911201358")), new NullProgressMonitor())));
assertEquals(0, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello", Version.create("1.0.0.200911201237")), new NullProgressMonitor())));
assertEquals(0, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello", Version.create("1.0.1.200911201237")), new NullProgressMonitor())));
assertEquals(1, queryResultSize(profileRegistry.getProfile(profileLoadedId).query(QueryUtil.createIUQuery("hello", Version.create("1.0.1.200911201358")), new NullProgressMonitor())));
}
}