| /******************************************************************************* |
| * 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()); |
| } |
| } |