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