blob: 0052f4922cb4f1e519bdd49e547750f035744036 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 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.lang.reflect.Field;
import java.net.URI;
import java.util.Properties;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry;
import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest;
import org.eclipse.equinox.p2.engine.*;
import org.eclipse.equinox.p2.metadata.*;
import org.eclipse.equinox.p2.planner.IPlanner;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
public class AgentPlanTestInExternalInstanceForCohostedMode extends AbstractProvisioningTest {
public void setUp() throws Exception {
super.setUp();
SimpleProfileRegistry profileRegistry = (SimpleProfileRegistry) getProfileRegistry();
try {
Field selfField = SimpleProfileRegistry.class.getDeclaredField("self"); //$NON-NLS-1$
selfField.setAccessible(true);
previousSelfValue = selfField.get(profileRegistry);
selfField.set(profileRegistry, "agent");
clearProfileMap(profileRegistry);
} catch (Throwable t) {
fail();
}
createProfile("agent");
Properties p = new Properties();
p.setProperty("org.eclipse.equinox.p2.planner.resolveMetaRequirements", "true");
createProfile("installation", p);
}
public void tearDown() throws Exception {
SimpleProfileRegistry profileRegistry = (SimpleProfileRegistry) getProfileRegistry();
try {
Field selfField = SimpleProfileRegistry.class.getDeclaredField("self"); //$NON-NLS-1$
selfField.setAccessible(true);
Object self = selfField.get(profileRegistry);
if (self.equals("agent"))
selfField.set(profileRegistry, previousSelfValue);
clearProfileMap(profileRegistry);
} catch (Throwable t) {
fail();
}
super.tearDown();
}
public void testGetAgentPlanActionNeededButUnavailable() {
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
IProfile profile = getProfile("installation");
IPlanner planner = createPlanner();
ProfileChangeRequest request = new ProfileChangeRequest(profile);
request.addInstallableUnits(new IInstallableUnit[] {a});
ProvisioningContext context = new ProvisioningContext(getAgent());
context.setMetadataRepositories(new URI[0]);
IProvisioningPlan plan = planner.getProvisioningPlan(request, context, new NullProgressMonitor());
assertNotOK(plan.getStatus());
}
public void testGetAgentPlanActionNeeded() {
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
createTestMetdataRepository(new IInstallableUnit[] {a, act1});
IProfile profile = getProfile("installation");
IPlanner planner = createPlanner();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
ProfileChangeRequest request = new ProfileChangeRequest(profile);
request.addInstallableUnits(new IInstallableUnit[] {a});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
assertTrue(plan.getStatus().isOK());
assertNotNull(plan.getInstallerPlan());
}
public void testConflictBetweenActionAndThingBeingInstalled() {
//This tests the case where the action is in conflict with the thing being installed
//The action needs another version of A which is singleton
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "A", new VersionRange("[2.0.0, 2.0.0]")), new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
IInstallableUnit a2 = createIU("A", Version.createOSGi(2, 0, 0));
createTestMetdataRepository(new IInstallableUnit[] {a, a2, act1});
IProfile profile = getProfile("installation");
IPlanner planner = createPlanner();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
ProfileChangeRequest request = new ProfileChangeRequest(profile);
request.addInstallableUnits(new IInstallableUnit[] {a});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
assertNotOK(plan.getStatus());
}
public void testSubsequentInstall() {
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
IInstallableUnit b = createEclipseIU("B");
createTestMetdataRepository(new IInstallableUnit[] {a, act1, b});
IPlanner planner = createPlanner();
IEngine engine = createEngine();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
ProfileChangeRequest request = new ProfileChangeRequest(getProfile("installation"));
request.addInstallableUnits(new IInstallableUnit[] {a});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
//Check that the actions are installed properly
assertOK("install actions", engine.perform(plan.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1});
//Check that the IUs are installed in the profile
assertOK("install A", engine.perform(plan, null));
assertProfileContainsAll("Checking profile after initial install", getProfile("installation"), new IInstallableUnit[] {a, act1});
ProfileChangeRequest request2 = new ProfileChangeRequest(getProfile("installation"));
request2.addInstallableUnits(new IInstallableUnit[] {b});
IProvisioningPlan plan2 = planner.getProvisioningPlan(request2, ctx, new NullProgressMonitor());
assertNull(plan2.getInstallerPlan());
assertOK("install b", engine.perform(plan2, null));
assertProfileContainsAll("Checking profile after initial install", getProfile("installation"), new IInstallableUnit[] {a, b, act1});
assertProfileContainsAll("Checking actions are still installed", getProfile("agent"), new IInstallableUnit[] {act1});
}
public void testWithOveralInDependency() {
IInstallableUnit common = createEclipseIU("Common");
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "Common"), new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "Common"), metaReq);
createTestMetdataRepository(new IInstallableUnit[] {a, act1, common});
IProfile profile = getProfile("installation");
IPlanner planner = createPlanner();
IEngine engine = createEngine();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
ProfileChangeRequest request = new ProfileChangeRequest(profile);
request.addInstallableUnits(new IInstallableUnit[] {a});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
assertOK("install actions", engine.perform(plan.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1, common});
assertOK("install A", engine.perform(plan, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {a, common, act1});
}
public void testTwoInstallWithActions() {
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
IProvidedCapability act2Cap = MetadataFactory.createProvidedCapability("p2.action", "action2", DEFAULT_VERSION);
IInstallableUnit act2 = createIU("Action2", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act2Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq2 = createRequiredCapabilities("p2.action", "action2", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit b = createIUWithMetaRequirement("B", DEFAULT_VERSION, true, NO_REQUIRES, metaReq2);
createTestMetdataRepository(new IInstallableUnit[] {a, b, act1, act2,});
IPlanner planner = createPlanner();
IEngine engine = createEngine();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
//install A which will install Action1
ProfileChangeRequest request = new ProfileChangeRequest(getProfile("installation"));
request.addInstallableUnits(new IInstallableUnit[] {a});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
assertOK("install actions", engine.perform(plan.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1});
assertOK("install A", engine.perform(plan, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {a, act1});
//install B which will install Action2
ProfileChangeRequest request2 = new ProfileChangeRequest(getProfile("installation"));
request2.addInstallableUnits(new IInstallableUnit[] {b});
IProvisioningPlan plan2 = planner.getProvisioningPlan(request2, ctx, new NullProgressMonitor());
assertOK("install actions", engine.perform(plan2.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act2, act1});
assertOK("install A", engine.perform(plan2, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {b, a, act1, act2});
}
public void testCompleteScenario() {
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
IProvidedCapability act1bCap = MetadataFactory.createProvidedCapability("p2.action", "action1b", DEFAULT_VERSION);
IInstallableUnit act1b = createIU("Action1b", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act1bCap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReqb = createRequiredCapabilities("p2.action", "action1b", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a111 = createIUWithMetaRequirement("A", Version.createOSGi(1, 1, 1), true, NO_REQUIRES, metaReqb);
IProvidedCapability act2Cap = MetadataFactory.createProvidedCapability("p2.action", "action2", DEFAULT_VERSION);
IInstallableUnit act2 = createIU("Action2", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act2Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IProvidedCapability act1v2Cap = MetadataFactory.createProvidedCapability("p2.action", "action2", Version.createOSGi(2, 0, 0));
IInstallableUnit act1v2 = createIU("Action1", Version.create("2.0.0"), null, NO_REQUIRES, new IProvidedCapability[] {act1v2Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReqd = createRequiredCapabilities("p2.action", "action2", new VersionRange("[2.0.0, 2.0.0]"));
IInstallableUnit d = createIUWithMetaRequirement("D", DEFAULT_VERSION, true, NO_REQUIRES, metaReqd);
IRequirement[] metaReq2 = createRequiredCapabilities("p2.action", "action2", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit b = createIUWithMetaRequirement("B", DEFAULT_VERSION, true, NO_REQUIRES, metaReq2);
IInstallableUnit c = createEclipseIU("C");
createTestMetdataRepository(new IInstallableUnit[] {a, b, act1, act1v2, act2, c, act1b, d, a111});
IPlanner planner = createPlanner();
IEngine engine = createEngine();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
//install A which will install Action1
ProfileChangeRequest request = new ProfileChangeRequest(getProfile("installation"));
request.addInstallableUnits(new IInstallableUnit[] {a});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
assertOK("install actions for A", engine.perform(plan.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1});
assertOK("install A", engine.perform(plan, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {a, act1});
//install B which will install Action2
ProfileChangeRequest request2 = new ProfileChangeRequest(getProfile("installation"));
request2.addInstallableUnits(new IInstallableUnit[] {b});
IProvisioningPlan plan2 = planner.getProvisioningPlan(request2, ctx, new NullProgressMonitor());
assertOK("install actions for B", engine.perform(plan2.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act2});
assertOK("install B", engine.perform(plan2, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {b, a, act2});
//install C
ProfileChangeRequest requestForC = new ProfileChangeRequest(getProfile("installation"));
requestForC.addInstallableUnits(new IInstallableUnit[] {c});
IProvisioningPlan planForC = planner.getProvisioningPlan(requestForC, ctx, new NullProgressMonitor());
assertNull(planForC.getInstallerPlan());
assertOK("install C", engine.perform(planForC, null));
assertProfileContainsAll("Checking profile after C", getProfile("installation"), new IInstallableUnit[] {a, b, c, act2, act1});
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act2, act1});
//update A which will install Action1b
ProfileChangeRequest requestUpdateA = new ProfileChangeRequest(getProfile("installation"));
requestUpdateA.removeInstallableUnits(new IInstallableUnit[] {a});
requestUpdateA.addInstallableUnits(new IInstallableUnit[] {a111});
IProvisioningPlan planUpdateA = planner.getProvisioningPlan(requestUpdateA, ctx, new NullProgressMonitor());
assertOK("install actions for A 1.1.1", engine.perform(planUpdateA.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1, act1b, act2});
assertOK("install A", engine.perform(planUpdateA, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {act2, act1b, a111, b, c});
assertTrue(getProfile("installation").query(QueryUtil.createIUQuery("Action1", DEFAULT_VERSION), null).isEmpty());
assertEquals(getProfile("agent").getProfileId(), plan.getInstallerPlan().getProfile().getProfileId());
//uninstall A
ProfileChangeRequest request3 = new ProfileChangeRequest(getProfile("installation"));
request3.removeInstallableUnits(new IInstallableUnit[] {a111});
IProvisioningPlan plan3 = planner.getProvisioningPlan(request3, ctx, new NullProgressMonitor());
// assertOK("install actions", engine.perform(getProfile("agent"), new PhaseSetFactory(), plan3.getInstallerPlan().getOperands(), null, null));
// assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1b}); //At this point there is not
assertOK("install A", engine.perform(plan3, null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("installation"), new IInstallableUnit[] {c, b, act2});
//uninstall C
ProfileChangeRequest request4 = new ProfileChangeRequest(getProfile("installation"));
request4.removeInstallableUnits(new IInstallableUnit[] {c});
IProvisioningPlan uninstallC = planner.getProvisioningPlan(request4, ctx, new NullProgressMonitor());
assertNull(uninstallC.getInstallerPlan());
assertOK("install C", engine.perform(uninstallC, null));
assertProfileContainsAll("Checking profile after C", getProfile("installation"), new IInstallableUnit[] {b, act2});
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act2});
//install D, This will cause the removal of act1 and cause the addition of act1v2 from the installer
ProfileChangeRequest requestForD = new ProfileChangeRequest(getProfile("installation"));
requestForD.addInstallableUnits(new IInstallableUnit[] {d});
IProvisioningPlan planForD = planner.getProvisioningPlan(requestForD, ctx, new NullProgressMonitor());
assertNotNull(planForD.getInstallerPlan());
assertEquals(1, queryResultSize(planForD.getInstallerPlan().getRemovals().query(QueryUtil.createIUQuery(act1b.getId()), null)));
assertOK("install actions", engine.perform(planForD.getInstallerPlan(), null));
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act1v2});
assertOK("install D", engine.perform(planForD, null));
assertProfileContainsAll("Checking profile after D", getProfile("installation"), new IInstallableUnit[] {b, d});
assertProfileContainsAll("Checking profile after install of actions", getProfile("agent"), new IInstallableUnit[] {act2, act1v2});
}
public void testConflictBetweenActions() {
IProvidedCapability act1Cap = MetadataFactory.createProvidedCapability("p2.action", "action1", DEFAULT_VERSION);
IInstallableUnit act1 = createIU("Action1", DEFAULT_VERSION, null, NO_REQUIRES, new IProvidedCapability[] {act1Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReq = createRequiredCapabilities("p2.action", "action1", new VersionRange("[0.0.0, 1.0.0]"));
IInstallableUnit a = createIUWithMetaRequirement("A", DEFAULT_VERSION, true, NO_REQUIRES, metaReq);
IProvidedCapability act1v2Cap = MetadataFactory.createProvidedCapability("p2.action", "action2", Version.createOSGi(2, 0, 0));
IInstallableUnit act1v2 = createIU("Action1", Version.create("2.0.0"), null, NO_REQUIRES, new IProvidedCapability[] {act1v2Cap}, NO_PROPERTIES, null, NO_TP_DATA, true);
IRequirement[] metaReqd = createRequiredCapabilities("p2.action", "action2", new VersionRange("[2.0.0, 2.0.0]"));
IInstallableUnit d = createIUWithMetaRequirement("D", DEFAULT_VERSION, true, NO_REQUIRES, metaReqd);
createTestMetdataRepository(new IInstallableUnit[] {a, act1, d, act1v2});
IProfile profile = getProfile("installation");
IPlanner planner = createPlanner();
ProvisioningContext ctx = new ProvisioningContext(getAgent());
ProfileChangeRequest request = new ProfileChangeRequest(profile);
request.addInstallableUnits(new IInstallableUnit[] {a, d});
IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
assertNotOK(plan.getStatus());
assertEquals(request.getProfile(), plan.getProfile());
}
}