1 /*******************************************************************************
2  * Copyright (c) 2013 Red Hat, Inc. and others
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  *  Contributors:
12  *     Red Hat, Inc. - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.equinox.p2.tests.planner;
15 
16 import java.util.Map;
17 import org.eclipse.core.runtime.NullProgressMonitor;
18 import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest;
19 import org.eclipse.equinox.internal.p2.operations.RequestFlexer;
20 import org.eclipse.equinox.p2.engine.*;
21 import org.eclipse.equinox.p2.metadata.IInstallableUnit;
22 import org.eclipse.equinox.p2.planner.*;
23 import org.eclipse.equinox.p2.tests.*;
24 
25 public class TestRequestFlexerRequestWithOptionalInstall extends AbstractProvisioningTest {
26 	final String INCLUSION_RULES = "org.eclipse.equinox.p2.internal.inclusion.rules"; //$NON-NLS-1$
27 	final String INCLUSION_OPTIONAL = "OPTIONAL"; //$NON-NLS-1$
28 	final String INCLUSION_STRICT = "STRICT"; //$NON-NLS-1$
29 
30 	@IUDescription(content = "package: sdk \n" + "singleton: true\n" + "version: 1 \n" + "depends: platform = 1")
31 	public IInstallableUnit sdk1;
32 
33 	@IUDescription(content = "package: platform \n" + "singleton: true\n" + "version: 1 \n")
34 	public IInstallableUnit platform1;
35 
36 	@IUDescription(content = "package: sdk \n" + "singleton: true\n" + "version: 2 \n" + "depends: platform = 2")
37 	public IInstallableUnit sdk2;
38 
39 	@IUDescription(content = "package: platform \n" + "singleton: true\n" + "version: 2 \n")
40 	public IInstallableUnit platform2;
41 
42 	@IUDescription(content = "package: egit \n" + "singleton: true\n" + "version: 1 \n" + "depends: platform = 1")
43 	public IInstallableUnit egit1;
44 
45 	@IUDescription(content = "package: egit \n" + "singleton: true\n" + "version: 2 \n" + "depends: platform = 2")
46 	public IInstallableUnit egit2;
47 
48 	@IUDescription(content = "package: egit \n" + "singleton: true\n" + "version: 3 \n" + "depends: platform = 3")
49 	public IInstallableUnit egit3;
50 
51 	IProfile profile;
52 
53 	private IPlanner planner;
54 
55 	private IEngine engine;
56 
57 	private ProvisioningContext context;
58 
59 	@Override
setUp()60 	protected void setUp() throws Exception {
61 		super.setUp();
62 		profile = createProfile("TestProfile." + getName());
63 		IULoader.loadIUs(this);
64 		createTestMetdataRepository(new IInstallableUnit[] {sdk1, platform1});
65 		planner = createPlanner();
66 		engine = createEngine();
67 		context = new ProvisioningContext(getAgent());
68 		assertOK(installAsRoots(profile, new IInstallableUnit[] {sdk1}, true, planner, engine));
69 	}
70 
testWithOptionalInstall()71 	public void testWithOptionalInstall() {
72 		createTestMetdataRepository(new IInstallableUnit[] {sdk1, platform1, sdk2, platform2, egit1, egit2, egit3});
73 
74 		IProfileChangeRequest originalRequest = planner.createChangeRequest(profile);
75 		originalRequest.add(egit2);
76 		originalRequest.setInstallableUnitInclusionRules(egit2, ProfileInclusionRules.createOptionalInclusionRule(egit2));
77 
78 		{
79 			//The request is unsatisfiable is no flexibility is given
80 			RequestFlexer av = new RequestFlexer(planner);
81 			av.setProvisioningContext(context);
82 			IProfileChangeRequest realRequest = av.getChangeRequest(originalRequest, profile, new NullProgressMonitor());
83 			assertNull(realRequest);
84 		}
85 
86 		{
87 			//The base is allowed to change so egit2 will install fine
88 			RequestFlexer av = new RequestFlexer(planner);
89 			av.setAllowInstalledElementChange(true);
90 			av.setProvisioningContext(context);
91 			IProfileChangeRequest realRequest = av.getChangeRequest(originalRequest, profile, new NullProgressMonitor());
92 			assertTrue(realRequest.getAdditions().contains(egit2));
93 			assertTrue(realRequest.getAdditions().contains(sdk2));
94 			assertEquals(2, realRequest.getAdditions().size());
95 			assertTrue(realRequest.getRemovals().contains(sdk1));
96 			assertResolve(realRequest, planner);
97 		}
98 
99 		{
100 			//We allow for a different version to be installed, so egit1 will be installed
101 			RequestFlexer av = new RequestFlexer(planner);
102 			av.setAllowDifferentVersion(true);
103 			av.setProvisioningContext(context);
104 			IProfileChangeRequest realRequest = av.getChangeRequest(originalRequest, profile, new NullProgressMonitor());
105 			assertTrue(realRequest.getAdditions().contains(egit1));
106 			assertEquals(1, realRequest.getAdditions().size());
107 			assertTrue(isOptionallyBeingInstalled(egit1, realRequest));
108 			assertResolve(realRequest, planner);
109 		}
110 	}
111 
isOptionallyBeingInstalled(IInstallableUnit iu, IProfileChangeRequest originalRequest)112 	private boolean isOptionallyBeingInstalled(IInstallableUnit iu, IProfileChangeRequest originalRequest) {
113 		Map<String, String> match = ((ProfileChangeRequest) originalRequest).getInstallableUnitProfilePropertiesToAdd().get(iu);
114 		if (match == null)
115 			return false;
116 		return INCLUSION_OPTIONAL.equals(match.get(INCLUSION_RULES));
117 	}
118 
119 	@Override
tearDown()120 	protected void tearDown() throws Exception {
121 		super.tearDown();
122 		getProfileRegistry().removeProfile(profile.getProfileId());
123 	}
124 
125 }
126