1 /*******************************************************************************
2  * Copyright (c) 2011, 2018 Sonatype, Inc. and others.
3  *
4  * This
5  * program and the accompanying materials are made available under the terms of
6  * the Eclipse Public License 2.0 which accompanies this distribution, and is
7  * available at
8  * https://www.eclipse.org/legal/epl-2.0/
9  *
10  * SPDX-License-Identifier: EPL-2.0
11  *
12  * Contributors:
13  *  Sonatype, Inc. - initial API and implementation
14  ******************************************************************************/
15 package org.eclipse.equinox.p2.tests.planner;
16 
17 import java.util.Arrays;
18 import org.eclipse.core.runtime.IStatus;
19 import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest;
20 import org.eclipse.equinox.p2.engine.IProfile;
21 import org.eclipse.equinox.p2.engine.IProvisioningPlan;
22 import org.eclipse.equinox.p2.engine.ProvisioningContext;
23 import org.eclipse.equinox.p2.metadata.IInstallableUnit;
24 import org.eclipse.equinox.p2.metadata.IRequirement;
25 import org.eclipse.equinox.p2.metadata.Version;
26 import org.eclipse.equinox.p2.metadata.VersionRange;
27 import org.eclipse.equinox.p2.planner.IPlanner;
28 import org.eclipse.equinox.p2.query.QueryUtil;
29 import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
30 
31 public class FindRootsAfterUpdate extends AbstractProvisioningTest {
32 	IInstallableUnit a1;
33 	IInstallableUnit b1;
34 	IInstallableUnit b2;
35 	IInstallableUnit b3;
36 	IInstallableUnit x1;
37 
38 	IProfile profile;
39 	IPlanner planner;
40 
41 	@Override
setUp()42 	protected void setUp() throws Exception {
43 		super.setUp();
44 		a1 = createIU("A", Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "B", new VersionRange("[1.0.0, 4.0.0)")));
45 
46 		b1 = createIU("B", Version.create("1.0.0"), true);
47 
48 		b2 = createIU("B", Version.create("2.0.0"), true);
49 
50 		b3 = createIU("B", Version.create("3.0.0"), true);
51 
52 		x1 = createIU("X", Version.createOSGi(2, 0, 0), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "B", new VersionRange("[2.0.0, 2.0.0]")));
53 
54 		createTestMetdataRepository(new IInstallableUnit[] {a1, b1, b2, b3, x1});
55 
56 		profile = createProfile("TestProfile." + getName());
57 		planner = createPlanner();
58 
59 	}
60 
testInstallB3()61 	public void testInstallB3() {
62 		ProfileChangeRequest req = new ProfileChangeRequest(profile);
63 		ProvisioningContext ctx = new ProvisioningContext(getAgent());
64 		IRequirement[] reqs = createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "B", new VersionRange("[2.0.0, 4.0.0]"));
65 		req.addExtraRequirements(Arrays.asList(reqs[0]));
66 		IProvisioningPlan plan = planner.getProvisioningPlan(req, ctx, null);
67 		assertEquals(IStatus.OK, plan.getStatus().getSeverity());
68 		assertInstallOperand(plan, b3);
69 		assertContains(plan.getFutureState().query(QueryUtil.createMatchQuery(reqs[0].getMatches()), null), b3);
70 	}
71 
testConflictThroughExtraRequirements()72 	public void testConflictThroughExtraRequirements() {
73 		ProfileChangeRequest req = new ProfileChangeRequest(profile);
74 		ProvisioningContext ctx = new ProvisioningContext(getAgent());
75 		IRequirement reqOnB = createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "B", new VersionRange("[3.0.0, 4.0.0]"))[0];
76 		IRequirement reqOnX = createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, "X", new VersionRange("[2.0.0, 2.0.0]"))[0];
77 		IRequirement[] extraReqs = new IRequirement[] {reqOnB, reqOnX};
78 		req.addExtraRequirements(Arrays.asList(extraReqs));
79 		IProvisioningPlan plan = planner.getProvisioningPlan(req, ctx, null);
80 		assertNotOK(plan.getStatus());
81 	}
82 }
83