blob: a3ffe62ae77c797c3a2ef552767eb80e001ab63e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.tests.planner;
import java.io.File;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.equinox.internal.p2.engine.*;
import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest;
import org.eclipse.equinox.p2.engine.*;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.planner.IProfileChangeRequest;
import org.eclipse.equinox.p2.planner.ProfileInclusionRules;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
/**
* @since 1.0
*/
public abstract class AbstractPlannerTest extends AbstractProvisioningTest {
private IProfile profile;
private File previousStoreValue = null;
IMetadataRepository repo = null;
/*
* Return the root of the data for this test. e.g. "testData/bug302582"
*/
protected abstract String getTestDataPath();
/*
* Return the profileID to be used for this test.
*/
protected abstract String getProfileId();
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.tests.AbstractProvisioningTest#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
File reporegistry1 = getTestData("loading planner test data", getTestDataPath());
File tempFolder = getTempFolder();
copy("0.2", reporegistry1, tempFolder);
IProfileRegistry realProfileRegistry = getProfileRegistry();
//Tweak the running profile registry
Field profileStore = SimpleProfileRegistry.class.getDeclaredField("store");
profileStore.setAccessible(true);
previousStoreValue = (File) profileStore.get(realProfileRegistry);
profileStore.set(realProfileRegistry, new File(tempFolder, "p2/org.eclipse.equinox.p2.engine/profileRegistry"));
Field profilesMapField = SimpleProfileRegistry.class.getDeclaredField("profiles"); //$NON-NLS-1$
profilesMapField.setAccessible(true);
profilesMapField.set(realProfileRegistry, null);
//End of tweaking the profile registry
profile = realProfileRegistry.getProfile(getProfileId());
assertNotNull(profile);
repo = loadMetadataRepository(getTestData("planner test repo", getTestDataPath() + "/repo").toURI());
}
protected void tearDown() throws Exception {
SimpleProfileRegistry realProfileRegistry = (SimpleProfileRegistry) getProfileRegistry();
Field profilesMapField = SimpleProfileRegistry.class.getDeclaredField("profiles"); //$NON-NLS-1$
profilesMapField.setAccessible(true);
profilesMapField.set(realProfileRegistry, null);
Field profileStore = SimpleProfileRegistry.class.getDeclaredField("store");
profileStore.setAccessible(true);
profileStore.set(realProfileRegistry, previousStoreValue);
super.tearDown();
}
/*
* Create and return a new profile change request with the given additions and removals.
*/
protected IProfileChangeRequest createProfileChangeRequest(Collection optionalAdds, Collection strictAdds, Collection toRemove) {
IProfileChangeRequest result = new ProfileChangeRequest(profile);
// add optional IUs
if (optionalAdds != null) {
for (Iterator iter = optionalAdds.iterator(); iter.hasNext();) {
IInstallableUnit iu = (IInstallableUnit) iter.next();
result.add(iu);
result.setInstallableUnitInclusionRules(iu, ProfileInclusionRules.createOptionalInclusionRule(iu));
result.setInstallableUnitProfileProperty(iu, "org.eclipse.equinox.p2.type.lock", "1");
result.setInstallableUnitProfileProperty(iu, "org.eclipse.equinox.p2.reconciler.dropins", "true");
}
}
// add strict IUs
if (strictAdds != null) {
for (Iterator iter = strictAdds.iterator(); iter.hasNext();) {
IInstallableUnit iu = (IInstallableUnit) iter.next();
result.add(iu);
result.setInstallableUnitInclusionRules(iu, ProfileInclusionRules.createStrictInclusionRule(iu));
}
}
// include removals
if (toRemove != null) {
for (Iterator iter = toRemove.iterator(); iter.hasNext();) {
IInstallableUnit iu = (IInstallableUnit) iter.next();
result.remove(iu);
}
}
return result;
}
/*
* Assert that all the IU operands in the expected plan are contained in the actual plan.
*/
protected void assertContains(String message, IProvisioningPlan expectedPlan, IProvisioningPlan actualPlan) {
Operand[] expectedOperands = ((ProvisioningPlan) expectedPlan).getOperands();
Operand[] actualOperands = ((ProvisioningPlan) actualPlan).getOperands();
// make sure the expected plan isn't empty
assertFalse("0.9 Plan is empty.", expectedOperands.length == 0);
for (int outer = 0; outer < expectedOperands.length; outer++) {
if (!(expectedOperands[outer] instanceof InstallableUnitOperand))
continue;
IInstallableUnit first = ((InstallableUnitOperand) expectedOperands[outer]).first();
IInstallableUnit second = ((InstallableUnitOperand) expectedOperands[outer]).second();
// see if there is an operand in the actual plan which involved this IU.
boolean found = false;
for (int inner = 0; inner < actualOperands.length; inner++) {
if (!(actualOperands[inner] instanceof InstallableUnitOperand))
continue;
InstallableUnitOperand actual = (InstallableUnitOperand) actualOperands[inner];
// handle removals
if (second == null) {
if (actual.second() != null)
continue;
if (!actual.first().getId().equals(first.getId()))
continue;
// we are doing a removal and we have IUs with the same id... do they have the same version too?
assertEquals("0.5", first, actual.first());
}
// treat additions and updates the same as long as we end up with the same IU in the end
assertNotNull("1.2 " + actual, actual.second());
if (!actual.second().getId().equals(second.getId()))
continue;
// we are doing an install or upgrade and we have IUs with the same id... do they have the same version too?
assertEquals("2.0", second, actual.second());
found = true;
}
if (!found)
fail("3.0 Plan is missing install operand for: " + second);
}
}
}