1 /*******************************************************************************
2  * Copyright (c) 2011, 2017 IBM Corporation 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  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.equinox.p2.tests.planner;
15 
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import org.eclipse.core.runtime.NullProgressMonitor;
19 import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest;
20 import org.eclipse.equinox.p2.engine.*;
21 import org.eclipse.equinox.p2.metadata.*;
22 import org.eclipse.equinox.p2.planner.IPlanner;
23 import org.eclipse.equinox.p2.planner.ProfileInclusionRules;
24 import org.eclipse.equinox.p2.query.IQueryResult;
25 import org.eclipse.equinox.p2.query.QueryUtil;
26 import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
27 import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
28 
29 public class Bug278668 extends AbstractProvisioningTest {
30 	private IProfile profile;
31 	private IMetadataRepository repo;
32 
33 	@Override
setUp()34 	protected void setUp() throws Exception {
35 		super.setUp();
36 		profile = createProfile("test278668");
37 		IEngine engine = createEngine();
38 		IPlanner planner = createPlanner();
39 		ArrayList<IInstallableUnit> target = new ArrayList<>();
40 		target.add(createEclipseIU("com.borland.tg.modelrenaming"));
41 		target.add(createEclipseIU("com.borland.tg.xmldesign"));
42 		target.add(createEclipseIU("com.tssap.selena.dom"));
43 		target.add(createEclipseIU("com.tssap.selena.model.providers.rc"));
44 		target.add(createEclipseIU("com.tssap.selena.model.providers.resources"));
45 		target.add(createEclipseIUSingleton("com.tssap.selena.model", DEFAULT_VERSION));
46 		target.add(createEclipseIU("com.borland.tg.modelrenaming", Version.create("8.1.2.v20090422-1800")));
47 		target.add(createEclipseIU("com.borland.tg.xmldesign", Version.create("8.2.0.v20090422-1800")));
48 		target.add(createEclipseIU("com.tssap.selena.dom", Version.create("8.2.0.v20090422-1800")));
49 		target.add(createEclipseIU("com.tssap.selena.model.providers.rc", Version.create("8.2.0.v20090422-1800")));
50 		target.add(createEclipseIU("com.tssap.selena.model.providers.resources", Version.create("8.1.2.v20090422-1800")));
51 		target.add(createEclipseIU("com.tssap.selena.model", Version.create("8.1.5.v20090422-1800")));
52 		target.add(createEclipseIUSingleton("com.tssap.selena.dom", Version.create("8.2.0.v20090326-1800")));
53 		createTestMetdataRepository(target.toArray(new IInstallableUnit[target.size()]));
54 
55 		ArrayList<IRequirement> requirements = new ArrayList<>();
56 		requirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "com.borland.tg.modelrenaming", new VersionRange("[1.0.0, 1.0.0]"), null, false, false));
57 		requirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "com.borland.tg.xmldesign", new VersionRange("[1.0.0, 1.0.0]"), null, false, false));
58 		requirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "com.tssap.selena.dom", new VersionRange("[1.0.0, 1.0.0]"), null, false, false));
59 		requirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "com.tssap.selena.model.providers.rc", new VersionRange("[1.0.0, 1.0.0]"), null, false, false));
60 		requirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "com.tssap.selena.model.providers.resources", new VersionRange("[1.0.0, 1.0.0]"), null, false, false));
61 		requirements.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "com.tssap.selena.model", new VersionRange("[1.0.0, 1.0.0]"), null, false, false));
62 
63 		IInstallableUnit group = createIU("com.borland.tg.modeling.feature.group", Version.create("8.2.0.v20081113-0500-_87S7nELRXmpf6G0dO3emm"), null, requirements.toArray(new IRequirement[requirements.size()]), new IProvidedCapability[] {MetadataFactory.createProvidedCapability(IInstallableUnit.NAMESPACE_IU_ID, "com.borland.tg.modeling", Version.create("8.2.0.v20081113-0500-_87S7nELRXmpf6G0dO3emm"))}, new HashMap<String, String>(), null, null, true);
64 
65 		ProfileChangeRequest req = new ProfileChangeRequest(profile);
66 		req.addInstallableUnits(new IInstallableUnit[] {group});
67 		IProvisioningPlan plan = planner.getProvisioningPlan(req, null, null);
68 		assertOK("plan should be OK", plan.getStatus());
69 
70 		engine.perform(plan, null);
71 
72 		repo = getMetadataRepositoryManager().loadRepository(getTestData("test data bug 278668", "testData/bug278668").toURI(), null);
73 	}
74 
75 	@Override
tearDown()76 	protected void tearDown() throws Exception {
77 		getMetadataRepositoryManager().removeRepository(getTestData("test data bug 278668", "testData/bug278668").toURI());
78 		super.tearDown();
79 	}
80 
testInstallFeaturePatch()81 	public void testInstallFeaturePatch() {
82 		IQueryResult<IInstallableUnit> c = repo.query(QueryUtil.createIUQuery("com.borland.tg.modeling.8.2.0.hotfixexp.patch.feature.group"), new NullProgressMonitor());
83 		assertEquals(1, queryResultSize(c));
84 		IQueryResult<IInstallableUnit> c2 = repo.query(QueryUtil.createIUQuery("com.borland.tg.modeling.8.2.0.nl.patch.feature.group"), new NullProgressMonitor());
85 		assertEquals(1, queryResultSize(c2));
86 
87 		ProfileChangeRequest request = new ProfileChangeRequest(profile);
88 		request.addInstallableUnits(new IInstallableUnit[] {c.iterator().next()});
89 		IPlanner planner = createPlanner();
90 		IProvisioningPlan plan = planner.getProvisioningPlan(request, null, new NullProgressMonitor());
91 		assertOK("Plan OK", plan.getStatus());
92 
93 		ProfileChangeRequest request2 = new ProfileChangeRequest(profile);
94 		request2.addInstallableUnits(new IInstallableUnit[] {c2.iterator().next()});
95 		IPlanner planner2 = createPlanner();
96 		IProvisioningPlan plan2 = planner2.getProvisioningPlan(request2, null, new NullProgressMonitor());
97 		assertOK("Plan OK", plan2.getStatus());
98 
99 		ProfileChangeRequest request3 = new ProfileChangeRequest(profile);
100 		request3.addInstallableUnits(new IInstallableUnit[] {c.iterator().next(), c2.iterator().next()});
101 		IPlanner planner3 = createPlanner();
102 		IProvisioningPlan plan3 = planner3.getProvisioningPlan(request3, null, new NullProgressMonitor());
103 		assertNotOK("Plan Not OK", plan3.getStatus());
104 
105 		ProfileChangeRequest request4 = new ProfileChangeRequest(profile);
106 		request4.addInstallableUnits(new IInstallableUnit[] {c.iterator().next(), c2.iterator().next()});
107 		request4.setInstallableUnitInclusionRules(c.iterator().next(), ProfileInclusionRules.createOptionalInclusionRule(c.iterator().next()));
108 		request4.setInstallableUnitInclusionRules(c2.iterator().next(), ProfileInclusionRules.createOptionalInclusionRule(c2.iterator().next()));
109 		IPlanner planner4 = createPlanner();
110 		IProvisioningPlan plan4 = planner4.getProvisioningPlan(request4, null, new NullProgressMonitor());
111 		assertOK("Plan OK", plan4.getStatus());
112 	}
113 }
114