diff options
author | Pascal Rapicault | 2011-06-24 02:05:12 +0000 |
---|---|---|
committer | Pascal Rapicault | 2011-06-24 02:05:12 +0000 |
commit | 79241b77b2ca608d426e44ef1e61ff4c25eac45a (patch) | |
tree | 8a4aedaf4a6338987a2706f1e2f945a6447e62e2 /bundles | |
parent | d4d4d009e08d79cf079bb4bb264f3ecfa82a6144 (diff) | |
download | rt.equinox.p2-79241b77b2ca608d426e44ef1e61ff4c25eac45a.tar.gz rt.equinox.p2-79241b77b2ca608d426e44ef1e61ff4c25eac45a.tar.xz rt.equinox.p2-79241b77b2ca608d426e44ef1e61ff4c25eac45a.zip |
Bug 348428 - [publisher] Allow platform-independent product publishing
Diffstat (limited to 'bundles')
4 files changed, 269 insertions, 3 deletions
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java index 9145b2acd..09aa21b7b 100644 --- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java +++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java @@ -7,6 +7,7 @@ * Contributors: * Code 9 - initial API and implementation * IBM - ongoing development + * SAP - ongoing development ******************************************************************************/ package org.eclipse.equinox.p2.publisher; @@ -103,9 +104,9 @@ public abstract class AbstractPublisherAction implements IPublisherAction { protected IMatchExpression<IInstallableUnit> createFilterSpec(String configSpec) { String[] config = parseConfigSpec(configSpec); if (config[0] != null || config[1] != null || config[2] != null) { - String filterWs = config[0] != null && config[0] != CONFIG_ANY ? "(osgi.ws=" + config[0] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - String filterOs = config[1] != null && config[1] != CONFIG_ANY ? "(osgi.os=" + config[1] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - String filterArch = config[2] != null && config[2] != CONFIG_ANY ? "(osgi.arch=" + config[2] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + String filterWs = config[0] != null && !CONFIG_ANY.equalsIgnoreCase(config[0]) ? "(osgi.ws=" + config[0] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + String filterOs = config[1] != null && !CONFIG_ANY.equalsIgnoreCase(config[1]) ? "(osgi.os=" + config[1] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + String filterArch = config[2] != null && !CONFIG_ANY.equalsIgnoreCase(config[2]) ? "(osgi.arch=" + config[2] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if (filterWs.length() == 0 && filterOs.length() == 0 && filterArch.length() == 0) return null; return InstallableUnit.parseFilter("(& " + filterWs + filterOs + filterArch + ")"); //$NON-NLS-1$ //$NON-NLS-2$ diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/AllTests.java index 2fdeba3e2..d5d954378 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/AllTests.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/AllTests.java @@ -7,6 +7,7 @@ * Contributors: * Code 9 - initial API and implementation * IBM - ongoing development + * SAP - ongoing development ******************************************************************************/ package org.eclipse.equinox.p2.tests.publisher; @@ -20,6 +21,7 @@ public class AllTests extends TestCase { suite.addTestSuite(AbstractPublisherActionTest.class); suite.addTestSuite(AccumulateConfigDataActionTest.class); suite.addTestSuite(AdviceFileParserTest.class); + suite.addTestSuite(ANYConfigCUsActionTest.class); suite.addTestSuite(BundlesActionTest.class); suite.addTestSuite(CategoryPublisherTest.class); suite.addTestSuite(ConfigCUsActionTest.class); diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java new file mode 100644 index 000000000..b78fb8850 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java @@ -0,0 +1,225 @@ +/******************************************************************************* + * Copyright (c) 2011 SAP 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: + * SAP - initial API and implementation + ******************************************************************************/ +package org.eclipse.equinox.p2.tests.publisher.actions; + +import static org.easymock.EasyMock.expect; + +import java.io.File; +import java.util.*; +import org.easymock.EasyMock; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.equinox.internal.p2.metadata.InstallableUnit; +import org.eclipse.equinox.internal.p2.publisher.eclipse.DataLoader; +import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile; +import org.eclipse.equinox.internal.provisional.frameworkadmin.ConfigData; +import org.eclipse.equinox.internal.provisional.frameworkadmin.LauncherData; +import org.eclipse.equinox.p2.metadata.*; +import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; +import org.eclipse.equinox.p2.publisher.AbstractPublisherAction; +import org.eclipse.equinox.p2.publisher.IPublisherResult; +import org.eclipse.equinox.p2.publisher.eclipse.*; +import org.eclipse.equinox.p2.query.IQueryResult; +import org.eclipse.equinox.p2.query.QueryUtil; +import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; +import org.eclipse.equinox.p2.tests.*; + +@SuppressWarnings({"unchecked"}) +public class ANYConfigCUsActionTest extends ActionTest { + private static final String BUNDLE_VERSION = "5.0.0"; //$NON-NLS-1$ + private static final String ORG_ECLIPSE_CORE_COMMANDS = "org.eclipse.core.commands"; //$NON-NLS-1$ + private static File configLocation = new File(TestActivator.getTestDataFolder(), "ConfigCUsActionTest/level1/level2/config.ini"); //$NON-NLS-1$ + private static File executableLocation = new File(TestActivator.getTestDataFolder(), "ConfigCUsActionTest/level1/run.exe"); //$NON-NLS-1$ + private static Version version = Version.create("1.0.0"); //$NON-NLS-1$ + private static String id = "id"; //$NON-NLS-1$ + private static String flavor = "tooling"; //$NON-NLS-1$ + private IMetadataRepository metadataRepo; + private DataLoader loader; + + public void setUp() throws Exception { + + // configuration spec for creation of filterless CUs + String[] cfgSpecs = AbstractPublisherAction.parseConfigSpec("ANY"); //$NON-NLS-1$ + configSpec = AbstractPublisherAction.createConfigSpec(cfgSpecs[0], cfgSpecs[1], cfgSpecs[2]); + setupPublisherInfo(); + setupPublisherResult(); + testAction = new ConfigCUsAction(publisherInfo, flavor, id, version); + } + + public void testAction() throws Exception { + testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor()); + verifyAction(); + debug("Completed ConfigCUsAction test."); //$NON-NLS-1$ + } + + private void verifyAction() { + ArrayList IUs = new ArrayList(publisherResult.getIUs(null, IPublisherResult.ROOT)); + assertTrue(IUs.size() == 1); + InstallableUnit iu = (InstallableUnit) IUs.get(0); + assertTrue(iu.getId().equalsIgnoreCase(flavor + id + ".configuration")); //$NON-NLS-1$ + + //verify ProvidedCapabilities + Collection<IProvidedCapability> providedCapabilities = iu.getProvidedCapabilities(); + verifyProvidedCapability(providedCapabilities, "org.eclipse.equinox.p2.iu", iu.getId(), version); //$NON-NLS-1$ + assertTrue(providedCapabilities.size() == 1); + + //verify RequiredCapabilities + List<IRequirement> requiredCapability = iu.getRequirements(); + assertTrue(requiredCapability.size() == 3); + verifyRequiredCapability(requiredCapability, IInstallableUnit.NAMESPACE_IU_ID, flavor + id + ".config." + configSpec, new VersionRange(version, true, version, true)); //$NON-NLS-1$ + verifyRequiredCapability(requiredCapability, IInstallableUnit.NAMESPACE_IU_ID, flavor + id + ".ini." + configSpec, new VersionRange(version, true, version, true)); //$NON-NLS-1$ + verifyRequiredCapability(requiredCapability, IInstallableUnit.NAMESPACE_IU_ID, flavor + configSpec + ORG_ECLIPSE_CORE_COMMANDS, new VersionRange(version, true, version, true)); + + //verify non root IUs + verifyFragment("ini"); //$NON-NLS-1$ + verifyFragment("config"); //$NON-NLS-1$ + verifyBundleCU(); + } + + private void verifyFragment(String cuType) { + ArrayList IUs = new ArrayList(publisherResult.getIUs(null, IPublisherResult.NON_ROOT)); + for (int i = 0; i < IUs.size(); i++) { + InstallableUnit iu = (InstallableUnit) IUs.get(i); + if (iu.getId().equals(flavor + id + "." + cuType + "." + configSpec)) { //$NON-NLS-1$ //$NON-NLS-2$ + + assertNull(iu.getFilter()); // no filter if config spec is ANY + + assertTrue(iu.getVersion().equals(version)); + + assertFalse(iu.isSingleton()); + + Collection<IProvidedCapability> providedCapabilities = iu.getProvidedCapabilities(); + verifyProvidedCapability(providedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, flavor + id + "." + cuType + "." + configSpec, version); //$NON-NLS-1$//$NON-NLS-2$ + verifyProvidedCapability(providedCapabilities, flavor + id, id + "." + cuType, version); //$NON-NLS-1$ + assertTrue(providedCapabilities.size() == 2); + + assertTrue(iu.getRequirements().size() == 0); + + if (cuType.equals("ini")) //$NON-NLS-1$ + verifyLauncherArgs(iu); + if (cuType.equals("config")) //$NON-NLS-1$ + verifyConfigProperties(iu); + return; //pass + } + } + fail("Configuration unit of type " + cuType + " was not enocuntered among fragments"); //$NON-NLS-1$ + } + + private void verifyBundleCU() { + + final String bundleCUId = flavor + configSpec + ORG_ECLIPSE_CORE_COMMANDS; + IQueryResult queryResult = publisherResult.query(QueryUtil.createIUQuery(bundleCUId), new NullProgressMonitor()); + assertEquals(1, queryResultSize(queryResult)); + IInstallableUnitFragment fragment = (IInstallableUnitFragment) queryResult.iterator().next(); + + assertNull(fragment.getFilter()); // no filter if config spec is ANY + + assertTrue(fragment.getVersion().equals(version)); + + assertFalse(fragment.isSingleton()); + + final Collection<IProvidedCapability> providedCapabilities = fragment.getProvidedCapabilities(); + verifyProvidedCapability(providedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, bundleCUId, version); + verifyProvidedCapability(providedCapabilities, "org.eclipse.equinox.p2.flavor", flavor + configSpec, version); //$NON-NLS-1$ + assertEquals(2, providedCapabilities.size()); + + assertEquals(0, fragment.getRequirements().size()); + + final Collection<IRequirement> hostRequirements = fragment.getHost(); + verifyRequiredCapability(hostRequirements, "osgi.bundle", ORG_ECLIPSE_CORE_COMMANDS, new VersionRange(BUNDLE_VERSION)); //$NON-NLS-1$ + verifyRequiredCapability(hostRequirements, "org.eclipse.equinox.p2.eclipse.type", "bundle", new VersionRange(Version.create("1.0.0"), true, Version.create("2.0.0"), false)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + assertTrue(hostRequirements.size() == 2); + + final Collection<ITouchpointData> touchpointData = fragment.getTouchpointData(); + assertEquals(1, touchpointData.size()); + ITouchpointData data = touchpointData.iterator().next(); + ITouchpointInstruction instruction = data.getInstruction("install"); //$NON-NLS-1$ + assertEquals("installBundle(bundle:${artifact})", instruction.getBody()); //$NON-NLS-1$ + instruction = data.getInstruction("uninstall"); //$NON-NLS-1$ + assertEquals("uninstallBundle(bundle:${artifact})", instruction.getBody()); //$NON-NLS-1$ + instruction = data.getInstruction("configure"); //$NON-NLS-1$ + assertEquals("setStartLevel(startLevel:2);", instruction.getBody()); //$NON-NLS-1$ + instruction = data.getInstruction("unconfigure"); //$NON-NLS-1$ + assertEquals("setStartLevel(startLevel:-1);", instruction.getBody()); //$NON-NLS-1$ + } + + private void verifyLauncherArgs(IInstallableUnit iu) { + Collection<ITouchpointData> touchpointData = iu.getTouchpointData(); + assertEquals(1, touchpointData.size()); + ITouchpointData data = touchpointData.iterator().next(); + ITouchpointInstruction instruction = data.getInstruction("configure"); //$NON-NLS-1$ + String body = instruction.getBody(); + assertTrue("arg -foo bar", body.indexOf("addProgramArg(programArg:-foo bar);") > -1); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("vmarg -agentlib", body.indexOf("addJvmArg(jvmArg:-agentlib${#58}jdwp=transport=dt_socket${#44}server=y${#44}suspend=n${#44}address=8272);") > -1); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("arg -product com,ma", body.indexOf("addProgramArg(programArg:-product);addProgramArg(programArg:com${#44}ma);") > -1); //$NON-NLS-1$ //$NON-NLS-2$ + } + + private void verifyConfigProperties(IInstallableUnit iu) { + Collection<ITouchpointData> touchpointData = iu.getTouchpointData(); + assertEquals(1, touchpointData.size()); + ITouchpointData data = touchpointData.iterator().next(); + ITouchpointInstruction instruction = data.getInstruction("configure"); //$NON-NLS-1$ + String body = instruction.getBody(); + assertTrue("eclipse.product", body.indexOf("setProgramProperty(propName:eclipse.product,propValue:org.eclipse.platform.ide);") > -1); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("eclipse.buildId", body.indexOf("setProgramProperty(propName:eclipse.buildId,propValue:TEST-ID);") > -1); //$NON-NLS-1$ //$NON-NLS-2$ + assertTrue("my.property", body.indexOf("setProgramProperty(propName:my.property,propValue:${#123}a${#44}b${#58}c${#59}${#36}d${#125});") > -1); //$NON-NLS-1$ //$NON-NLS-2$ + } + + protected void insertPublisherInfoBehavior() { + loader = new DataLoader(configLocation, executableLocation); + + //configure IExecutableAdvice + LauncherData launcherData = loader.getLauncherData(); + LaunchingAdvice launchingAdvice = new LaunchingAdvice(launcherData, configSpec); + + ArrayList launchingList = new ArrayList(); + launchingList.add(launchingAdvice); + + ProductFileAdvice productAdvice = null; + + try { + String productFileLocation = TestData.getFile("ProductActionTest", "productFileActionTest.product").toString(); //$NON-NLS-1$ //$NON-NLS-2$ + productAdvice = new ProductFileAdvice(new ProductFile(productFileLocation), configSpec); + launchingList.add(productAdvice); + } catch (Exception e) { + fail("Unable to create product file advice", e); //$NON-NLS-1$ + } + + expect(publisherInfo.getAdvice(EasyMock.matches(configSpec), EasyMock.eq(false), (String) EasyMock.anyObject(), (Version) EasyMock.anyObject(), EasyMock.eq(IExecutableAdvice.class))).andReturn(launchingList).anyTimes(); + + //configure IConfigAdvice + ConfigData configData = loader.getConfigData(); + ConfigAdvice configAdvice = new ConfigAdvice(configData, configSpec); + ArrayList configList = new ArrayList(); + configList.add(configAdvice); + configList.add(productAdvice); + expect(publisherInfo.getAdvice(EasyMock.matches(configSpec), EasyMock.eq(false), (String) EasyMock.anyObject(), (Version) EasyMock.anyObject(), EasyMock.eq(IConfigAdvice.class))).andReturn(configList).anyTimes(); + + //setup metadata repository + IInstallableUnit[] ius = {mockIU("foo", null), mockIU("bar", null)}; //$NON-NLS-1$ //$NON-NLS-2$ + + metadataRepo = new TestMetadataRepository(getAgent(), ius); + expect(publisherInfo.getMetadataRepository()).andReturn(metadataRepo).anyTimes(); + expect(publisherInfo.getContextMetadataRepository()).andReturn(null).anyTimes(); + + } + + @Override + public void setupPublisherResult() { + super.setupPublisherResult(); + + InstallableUnitDescription iuDescription = new InstallableUnitDescription(); + iuDescription.setId(ORG_ECLIPSE_CORE_COMMANDS); + iuDescription.setVersion(Version.create(BUNDLE_VERSION)); + IInstallableUnit iu = MetadataFactory.createInstallableUnit(iuDescription); + + publisherResult.addIU(iu, IPublisherResult.NON_ROOT); + } + +} diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java index ed42c9185..6b792fa11 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java @@ -359,4 +359,42 @@ public class ProductActionTest extends ActionTest { assertEquals("3.0", 0, vmArgs.length); } + + public void testConfigSpecANYProductPublishing() throws Exception { + ProductFile productFile2 = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString()); + PublisherInfo info = new PublisherInfo(); + String configSpecANY = AbstractPublisherAction.createConfigSpec("ANY", "ANY", "ANY"); // configuration spec to create CUs without filters + info.setConfigurations(getArrayFromString(configSpecANY, COMMA_SEPARATOR)); + PublisherResult results = new PublisherResult(); + + InstallableUnitDescription iuDescription1 = new InstallableUnitDescription(); + iuDescription1.setId("org.eclipse.core.runtime"); + iuDescription1.setVersion(Version.create("4.0.0")); // Set a specific version number, the one in the .product file uses 0.0.0. Let's see if it binds properly + IInstallableUnit iu1 = MetadataFactory.createInstallableUnit(iuDescription1); + results.addIU(iu1, IPublisherResult.NON_ROOT); + + InstallableUnitDescription iuDescription2 = new InstallableUnitDescription(); + iuDescription2.setId("org.eclipse.core.commands"); + iuDescription2.setVersion(Version.create("4.0.0")); // Set a specific version number, the one in the .product file uses 0.0.0. Let's see if it binds properly + iuDescription2.setFilter(winFitler); // any valid filter can be set here + IInstallableUnit iu2 = MetadataFactory.createInstallableUnit(iuDescription2); + results.addIU(iu2, IPublisherResult.NON_ROOT); + + ProductAction action = new ProductAction(null, productFile2, flavorArg, executablesFeatureLocation); + + action.perform(info, results, new NullProgressMonitor()); + + // there is a CU for the first IU because it has no filters + IQueryResult queryResult = results.query(QueryUtil.createIUQuery(flavorArg + configSpecANY + "org.eclipse.core.runtime"), new NullProgressMonitor()); + assertEquals("1.0", 1, queryResultSize(queryResult)); + IInstallableUnitFragment fragment = (IInstallableUnitFragment) queryResult.iterator().next(); + assertEquals("1.1", "org.eclipse.core.runtime", RequiredCapability.extractName(fragment.getHost().iterator().next().getMatches())); + assertEquals("1.2", Version.create("4.0.0"), RequiredCapability.extractRange(fragment.getHost().iterator().next().getMatches()).getMinimum()); + assertEquals("1.3", Version.create("1.0.0"), fragment.getVersion()); + assertNull("1.3", fragment.getFilter()); + + // there is no CU for the second IU because it has a filter + queryResult = results.query(QueryUtil.createIUQuery(flavorArg + configSpecANY + "org.eclipse.core.commands"), new NullProgressMonitor()); + assertEquals("2.0", 0, queryResultSize(queryResult)); + } } |