| /******************************************************************************* |
| * Copyright (c) 2009, 2017 IBM Corporation and others. |
| * |
| * This |
| * program and the accompanying materials are made available under the terms of |
| * the Eclipse Public License 2.0 which accompanies this distribution, and is |
| * available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: IBM Corporation - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.equinox.p2.tests.planner; |
| |
| import java.net.URI; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest; |
| import org.eclipse.equinox.internal.provisional.p2.director.PlanExecutionHelper; |
| 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 AgentPlanTestInRunningInstance extends AbstractProvisioningTest { |
| private IProfile initialProfile = null; |
| |
| @Override |
| public void setUp() throws Exception { |
| super.setUp(); |
| |
| initialProfile = getProfile(IProfileRegistry.SELF); |
| if (initialProfile != null) |
| return; |
| |
| setUpSelfProfile(); |
| } |
| |
| @Override |
| public void tearDown() throws Exception { |
| if (initialProfile == null) { |
| tearDownSelfProfile(); |
| } else { |
| //After the test we clean up the profile |
| IProfile profileAfterTestRun = getProfile(IProfileRegistry.SELF); |
| IProvisioningPlan rollbackPlan = createPlanner().getDiffPlan(profileAfterTestRun, initialProfile, new NullProgressMonitor()); |
| assertOK("rollback plan", rollbackPlan.getStatus()); |
| assertOK("rollback execution", PlanExecutionHelper.executePlan(rollbackPlan, createEngine(), new ProvisioningContext(getAgent()), new NullProgressMonitor())); |
| } |
| 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(IProfileRegistry.SELF); |
| 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(IProfileRegistry.SELF); |
| 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(IProfileRegistry.SELF); |
| 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(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act1}); |
| assertOK("install A", engine.perform(plan, null)); |
| assertProfileContainsAll("Checking profile after initial install", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {a, act1}); |
| assertEquals(getProfile(IProfileRegistry.SELF).getProfileId(), plan.getInstallerPlan().getProfile().getProfileId()); |
| |
| ProfileChangeRequest request2 = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {a, act1, b}); |
| |
| } |
| |
| 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(IProfileRegistry.SELF); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act1, common}); |
| assertOK("install A", engine.perform(plan, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), 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(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act1}); |
| assertOK("install A", engine.perform(plan, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {a, act1}); |
| |
| //install B which will install Action2 |
| ProfileChangeRequest request2 = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act2, act1, a}); |
| assertOK("install A", engine.perform(plan2, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {act2, act1, b, a}); |
| } |
| |
| 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); |
| |
| 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, act2, c, act1b, a111}); |
| |
| IPlanner planner = createPlanner(); |
| IEngine engine = createEngine(); |
| ProvisioningContext ctx = new ProvisioningContext(getAgent()); |
| |
| //install A which will install Action1 |
| ProfileChangeRequest request = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act1}); |
| assertOK("install A", engine.perform(plan, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {a, act1}); |
| |
| //install B which will install Action2 |
| ProfileChangeRequest request2 = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act2, act1, a}); |
| assertOK("install B", engine.perform(plan2, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {act2, act1, b, a}); |
| |
| //install C |
| ProfileChangeRequest requestForC = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| 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(IProfileRegistry.SELF), new IInstallableUnit[] {act1, act2, a, b, c}); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {act2, act1, b, a}); |
| |
| //update A which will install Action1b |
| ProfileChangeRequest requestUpdateA = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| requestUpdateA.removeInstallableUnits(new IInstallableUnit[] {a}); |
| requestUpdateA.addInstallableUnits(new IInstallableUnit[] {a111}); |
| IProvisioningPlan planUpdateA = planner.getProvisioningPlan(requestUpdateA, ctx, new NullProgressMonitor()); |
| assertOK("Checking planUpdateA", planUpdateA.getStatus()); |
| assertOK("install actions for A 1.1.1", engine.perform(planUpdateA.getInstallerPlan(), null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {act1, act1b}); |
| assertOK("install A", engine.perform(planUpdateA, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {act1b, a111, b, c}); |
| assertTrue(getProfile(IProfileRegistry.SELF).query(QueryUtil.createIUQuery("Action1", DEFAULT_VERSION), null).isEmpty()); |
| |
| //uninstall A |
| ProfileChangeRequest request3 = new ProfileChangeRequest(getProfile(IProfileRegistry.SELF)); |
| request3.removeInstallableUnits(new IInstallableUnit[] {a111}); |
| IProvisioningPlan plan3 = planner.getProvisioningPlan(request3, ctx, new NullProgressMonitor()); |
| // assertNull(plan3.getInstallerPlan()); //TODO |
| assertOK("install actions", engine.perform(plan3.getInstallerPlan(), null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {act1b}); //At this point there is not |
| assertOK("install A", engine.perform(plan3, null)); |
| assertProfileContainsAll("Checking profile after install of actions", getProfile(IProfileRegistry.SELF), new IInstallableUnit[] {c, b, act2}); |
| } |
| |
| 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(IProfileRegistry.SELF); |
| 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()); |
| } |
| } |