Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDJ Houghton2008-10-17 19:20:36 +0000
committerDJ Houghton2008-10-17 19:20:36 +0000
commitbb673011932a8ff7f5a76210a2cd7c63a9c3c241 (patch)
tree9962fca3e4e60075a5bb1b9d447cba89b2e91404
parent7fa5abedf9b119be0e3500fff07794835862f5ce (diff)
downloadrt.equinox.p2-bb673011932a8ff7f5a76210a2cd7c63a9c3c241.tar.gz
rt.equinox.p2-bb673011932a8ff7f5a76210a2cd7c63a9c3c241.tar.xz
rt.equinox.p2-bb673011932a8ff7f5a76210a2cd7c63a9c3c241.zip
Bug 251230 - [reconciler] Add test reconciler test suite to 3.4.x testsR34x_20081017
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AutomatedTests.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java453
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AllTests.java29
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/BasicTests.java178
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ConfigurationTests.java271
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ReconcilerTestSuite.java52
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/.eclipseextension0
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/features/bbb.feature_1.0.0/feature.xml26
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/bbb_1.0.0.jarbin0 -> 319 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/ccc_1.0.0.jarbin0 -> 335 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_1.0.0/feature.xml30
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_2.0.0/feature.xml30
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_1.0.0/feature.xml26
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_2.0.0/feature.xml26
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/directoryBased.jarbin0 -> 871 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/plugin.xml11
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_1.0.0.jarbin0 -> 359 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_2.0.0.jarbin0 -> 361 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_1.0.0.jarbin0 -> 377 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_2.0.0.jarbin0 -> 379 bytes
21 files changed, 1135 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
index 467a02ca9..f7eeb603e 100644
--- a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
@@ -17,6 +17,7 @@ Import-Package: org.eclipse.equinox.internal.p2.artifact.repository,
org.eclipse.equinox.internal.p2.persistence,
org.eclipse.equinox.internal.p2.resolution,
org.eclipse.equinox.internal.p2.touchpoint.eclipse,
+ org.eclipse.equinox.internal.p2.update,
org.eclipse.equinox.internal.p2.updatesite,
org.eclipse.equinox.internal.p2.updatesite.artifact,
org.eclipse.equinox.internal.p2.updatesite.metadata,
@@ -37,6 +38,7 @@ Import-Package: org.eclipse.equinox.internal.p2.artifact.repository,
org.eclipse.equinox.internal.provisional.spi.p2.artifact.repository,
org.eclipse.equinox.internal.provisional.spi.p2.core.repository,
org.eclipse.equinox.internal.provisional.spi.p2.metadata.repository,
+ org.eclipse.osgi.service.datalocation;version="1.1.0",
org.eclipse.osgi.service.environment;version="1.0.0",
org.eclipse.osgi.service.resolver;version="1.1.0",
org.eclipse.osgi.service.urlconversion;version="1.0.0",
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AutomatedTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AutomatedTests.java
index e96fd0fe0..29de2c821 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AutomatedTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AutomatedTests.java
@@ -34,6 +34,7 @@ public class AutomatedTests extends TestCase {
suite.addTest(org.eclipse.equinox.p2.tests.updatesite.AllTests.suite());
suite.addTest(org.eclipse.equinox.p2.tests.extensionlocation.AllTests.suite());
suite.addTest(org.eclipse.equinox.p2.tests.touchpoint.eclipse.AllTests.suite());
+ suite.addTest(org.eclipse.equinox.p2.tests.reconciler.dropins.AllTests.suite());
return suite;
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java
new file mode 100644
index 000000000..6761be390
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java
@@ -0,0 +1,453 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.reconciler.dropins;
+
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.equinox.internal.p2.core.helpers.*;
+import org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry;
+import org.eclipse.equinox.internal.p2.engine.SurrogateProfileHandler;
+import org.eclipse.equinox.internal.p2.update.*;
+import org.eclipse.equinox.internal.p2.updatesite.Activator;
+import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException;
+import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
+import org.eclipse.equinox.internal.provisional.p2.metadata.query.InstallableUnitQuery;
+import org.eclipse.equinox.internal.provisional.p2.query.Collector;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+import org.eclipse.equinox.p2.tests.TestActivator;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.osgi.framework.Version;
+
+public class AbstractReconcilerTest extends AbstractProvisioningTest {
+
+ private static File output;
+ protected static Set toRemove = new HashSet();
+ private static boolean initialized = false;
+
+ /*
+ * Constructor for the class.
+ */
+ public AbstractReconcilerTest(String name) {
+ super(name);
+ }
+
+ /*
+ * Set up the platform binary download and get it ready to run the tests.
+ * This method is not intended to be called by clients, it will be called
+ * automatically when the clients use a ReconcilerTestSuite.
+ */
+ public void initialize() throws Exception {
+ initialized = false;
+ File file = getPlatformZip();
+ output = getUniqueFolder();
+ toRemove.add(output);
+ // for now we will exec to un-tar archives to keep the executable bits
+ if (file.getName().toLowerCase().endsWith(".zip")) {
+ try {
+ FileUtils.unzipFile(file, output);
+ } catch (IOException e) {
+ fail("0.99", e);
+ }
+ } else {
+ untar("1.0", file);
+ }
+ initialized = true;
+ }
+
+ public void assertInitialized() {
+ assertTrue("Test suite not initialized, check log for previous errors.", initialized);
+ }
+
+ /*
+ * Run the given command.
+ */
+ private void run(String message, String command) {
+ try {
+ Process process = Runtime.getRuntime().exec(command, null, output);
+ process.waitFor();
+ } catch (IOException e) {
+ fail(message, e);
+ } catch (InterruptedException e) {
+ fail(message, e);
+ }
+ }
+
+ /*
+ * Untar the given file in the output directory.
+ */
+ private void untar(String message, File file) {
+ String name = file.getName();
+ File gzFile = new File(output, name);
+ output.mkdirs();
+ run(message, "cp " + file + " " + gzFile);
+ run(message, "tar -zpxf" + gzFile);
+ gzFile.delete();
+ }
+
+ /*
+ * Return a file object with a unique name in a temporary location.
+ */
+ public static File getUniqueFolder() {
+ String tempDir = System.getProperty("java.io.tmpdir");
+ return new File(tempDir, getUniqueString());
+ }
+
+ /*
+ * Helper method to return the install location. Return null if it is unavailable.
+ */
+ public static File getInstallLocation() {
+ Location installLocation = (Location) ServiceHelper.getService(TestActivator.getContext(), Location.class.getName(), Location.INSTALL_FILTER);
+ if (installLocation == null || !installLocation.isSet())
+ return null;
+ URL url = installLocation.getURL();
+ if (url == null)
+ return null;
+ return URLUtil.toFile(url);
+ }
+
+ /*
+ * Return a file handle pointing to the platform binary zip. Method never returns null because
+ * it will fail an assert before that.
+ */
+ private File getPlatformZip() {
+ // Check to see if the user set a system property first
+ String property = TestActivator.getContext().getProperty("org.eclipse.equinox.p2.reconciler.tests.platform.archive");
+ File file = null;
+ if (property == null) {
+ // the releng test framework copies the zip so let's look for it...
+ // it will be a sibling of the eclipse/ folder that we are running
+ File installLocation = getInstallLocation();
+ if (installLocation != null) {
+ // parent will be "eclipse" and the parent's parent will be "eclipse-testing"
+ File parent = installLocation.getParentFile();
+ if (parent != null) {
+ parent = parent.getParentFile();
+ if (parent != null) {
+ File[] children = parent.listFiles(new FileFilter() {
+ public boolean accept(File pathname) {
+ String name = pathname.getName();
+ return name.startsWith("eclipse-platform-");
+ }
+ });
+ if (children != null && children.length == 1)
+ file = children[0];
+ }
+ }
+ }
+ } else {
+ file = new File(property);
+ }
+ String message = "Need to set the \"org.eclipse.equinox.p2.reconciler.tests.platform.archive\" system property with a valid path to the platform binary drop or copy the archive to be a sibling of the install folder.";
+ assertNotNull(message, file);
+ assertTrue(message, file.exists());
+ return file;
+ }
+
+ /*
+ * Add the given bundle to the given folder (do a copy).
+ * The folder can be one of dropins, plugins or features.
+ * If the file handle points to a directory, then do a deep copy.
+ */
+ public void add(String message, String target, File file) {
+ if (!(target.startsWith("dropins") || target.startsWith("plugins") || target.startsWith("features")))
+ fail("Destination folder for resource copying should be either dropins, plugins or features.");
+ File destinationParent = new File(output, "eclipse/" + target);
+ destinationParent.mkdirs();
+ copy(message, file, new File(destinationParent, file.getName()));
+ }
+
+ /*
+ * Create a link file in the links folder. Point it to the given extension location.
+ */
+ public void createLinkFile(String message, String filename, String extensionLocation) {
+ File file = new File(output, "eclipse/links/" + filename + ".link");
+ file.getParentFile().mkdirs();
+ Properties properties = new Properties();
+ properties.put("path", extensionLocation);
+ OutputStream stream = null;
+ try {
+ stream = new BufferedOutputStream(new FileOutputStream(file));
+ properties.store(stream, null);
+ } catch (IOException e) {
+ fail(message, e);
+ } finally {
+ try {
+ if (stream != null)
+ stream.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+
+ /*
+ * Delete the link file with the given name from the links folder.
+ */
+ public void removeLinkFile(String message, String filename) {
+ File file = new File(output, "eclipse/links/" + filename + ".link");
+ file.delete();
+ }
+
+ public void add(String message, String target, File[] files) {
+ assertNotNull(files);
+ for (int i = 0; i < files.length; i++)
+ add(message, target, files[i]);
+ }
+
+ /*
+ * Remove the given filename from the given folder.
+ */
+ public boolean remove(String message, String target, String filename) {
+ if (!(target.startsWith("dropins") || target.startsWith("plugins") || target.startsWith("features")))
+ fail("Target folder for resource deletion should be either dropins, plugins or features.");
+ File folder = new File(output, "eclipse/" + target);
+ File targetFile = new File(folder, filename);
+ if (!targetFile.exists())
+ return false;
+ return delete(targetFile);
+ }
+
+ /*
+ * Remove the files with the given names from the target folder.
+ */
+ public void remove(String message, String target, String[] names) {
+ assertNotNull(names);
+ for (int i = 0; i < names.length; i++)
+ remove(message, target, names[i]);
+ }
+
+ /*
+ * Return a boolean value indicating whether or not a bundle with the given id
+ * is listed in the bundles.info file. Ignore the version number and return true
+ * if there are any matches in the file.
+ */
+ public boolean isInBundlesInfo(String bundleId) throws IOException {
+ return isInBundlesInfo(bundleId, null);
+ }
+
+ /*
+ * Return a boolean value indicating whether or not a bundle with the given id
+ * is listed in the bundles.info file. If the version is non-null, check to ensure the
+ * version is the expected one.
+ */
+ public boolean isInBundlesInfo(String bundleId, String version) throws IOException {
+ File bundlesInfo = new File(output, "eclipse/configuration/org.eclipse.equinox.simpleconfigurator/bundles.info");
+ if (!bundlesInfo.exists())
+ return false;
+ String line;
+ Exception exception = null;
+ BufferedReader reader = new BufferedReader(new FileReader(bundlesInfo));
+ try {
+ while ((line = reader.readLine()) != null) {
+ StringTokenizer tokenizer = new StringTokenizer(line, ",");
+ if (bundleId.equals(tokenizer.nextToken())) {
+ if (version == null)
+ return true;
+ if (version.equals(tokenizer.nextToken()))
+ return true;
+ }
+ }
+ } catch (IOException e) {
+ exception = e;
+ } finally {
+ try {
+ reader.close();
+ } catch (IOException ex) {
+ if (exception == null)
+ throw ex;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * Run the reconciler to discover changes in the drop-ins folder and update the system state.
+ */
+ public void reconcile(String message) {
+ File root = new File(Activator.getBundleContext().getProperty("java.home"));
+ root = new File(root, "bin");
+ File exe = new File(root, "javaw.exe");
+ if (!exe.exists())
+ exe = new File(root, "java");
+ run(message, "\"" + output.getAbsolutePath() + "/eclipse/eclipse\" --launcher.suppressErrors -nosplash -application org.eclipse.equinox.p2.reconciler.application -vm \"" + exe.getAbsolutePath() + "\"");
+ }
+
+ /*
+ * If a bundle with the given id and version exists in the bundles.info file then
+ * throw an AssertionFailedException.
+ */
+ public void assertDoesNotExistInBundlesInfo(String message, String bundleId, String version) {
+ try {
+ assertTrue(message, !isInBundlesInfo(bundleId, version));
+ } catch (IOException e) {
+ fail(message, e);
+ }
+ }
+
+ /*
+ * If a bundle with the given id in the bundles.info file then throw an AssertionFailedException.
+ */
+ public void assertDoesNotExistInBundlesInfo(String message, String bundleId) {
+ assertDoesNotExistInBundlesInfo(message, bundleId, null);
+ }
+
+ /*
+ * If a bundle with the given id and version does not exist in the bundles.info file then
+ * throw an AssertionFailedException.
+ */
+ public void assertExistsInBundlesInfo(String message, String bundleId, String version) {
+ try {
+ assertTrue(message, isInBundlesInfo(bundleId, version));
+ } catch (IOException e) {
+ fail(message, e);
+ }
+ }
+
+ /*
+ * If a bundle with the given id does not exist in the bundles.info file then throw an AssertionFailedException.
+ */
+ public void assertExistsInBundlesInfo(String message, String bundleId) {
+ assertExistsInBundlesInfo(message, bundleId, null);
+ }
+
+ /*
+ * Clean up the temporary data used to run the tests.
+ * This method is not intended to be called by clients, it will be called
+ * automatically when the clients use a ReconcilerTestSuite.
+ */
+ public void cleanup() throws Exception {
+ // rm -rf eclipse sub-dir
+ for (Iterator iter = toRemove.iterator(); iter.hasNext();) {
+ File next = (File) iter.next();
+ FileUtils.deleteAll(next);
+ }
+ output = null;
+ toRemove.clear();
+ }
+
+ /*
+ * Read and return the configuration object. Will not return null.
+ */
+ public Configuration getConfiguration() {
+ File configLocation = new File(output, "eclipse/configuration/org.eclipse.update/platform.xml");
+ File installLocation = new File(output, "eclipse");
+ if (installLocation == null)
+ fail("Unable to determine install location.");
+ try {
+ return Configuration.load(configLocation, installLocation.toURL());
+ } catch (ProvisionException e) {
+ fail("Error while reading configuration from " + configLocation);
+ } catch (MalformedURLException e) {
+ fail("Unable to convert install location to URL " + installLocation);
+ }
+ assertTrue("Unable to read configuration from " + configLocation, false);
+ // avoid compiler error
+ return null;
+ }
+
+ /*
+ * Save the given configuration to disk.
+ */
+ public void save(String message, Configuration configuration) {
+ File configLocation = new File(output, "eclipse/configuration/org.eclipse.update/platform.xml");
+ File installLocation = new File(output, "eclipse");
+ try {
+ configuration.save(configLocation, installLocation.toURL());
+ } catch (ProvisionException e) {
+ fail(message, e);
+ } catch (MalformedURLException e) {
+ fail(message, e);
+ }
+ }
+
+ /*
+ * Iterate over the sites in the given configuration and remove the one which
+ * has a url matching the given location.
+ */
+ public boolean removeSite(Configuration configuration, String location) {
+ IPath path = new Path(location);
+ List sites = configuration.getSites();
+ for (Iterator iter = sites.iterator(); iter.hasNext();) {
+ Site tempSite = (Site) iter.next();
+ String siteURL = tempSite.getUrl();
+ if (path.equals(new Path(siteURL)))
+ return configuration.removeSite(tempSite);
+ }
+ return false;
+ }
+
+ /*
+ * Create and return a new feature object with the given parameters.
+ */
+ public Feature createFeature(Site site, String id, String version, String url) {
+ Feature result = new Feature(site);
+ result.setId(id);
+ result.setVersion(version);
+ result.setUrl(url);
+ return result;
+ }
+
+ /*
+ * Create and return a new site object with the given parameters.
+ */
+ public Site createSite(String policy, boolean enabled, boolean updateable, String uri, String[] plugins) {
+ Site result = new Site();
+ result.setPolicy(policy);
+ result.setEnabled(enabled);
+ result.setUpdateable(updateable);
+ result.setUrl(uri);
+ if (plugins != null)
+ for (int i = 0; i < plugins.length; i++)
+ result.addPlugin(plugins[i]);
+ return result;
+ }
+
+ /*
+ * Assert that a feature with the given id exists in the configuration. If
+ * a version is specified then match the version, otherwise any version will
+ * do.
+ */
+ public void assertFeatureExists(String message, Configuration configuration, String id, String version) {
+ List sites = configuration.getSites();
+ assertNotNull(message, sites);
+ boolean found = false;
+ for (Iterator iter = sites.iterator(); iter.hasNext();) {
+ Site site = (Site) iter.next();
+ Feature[] features = site.getFeatures();
+ for (int i = 0; features != null && i < features.length; i++) {
+ if (id.equals(features[i].getId())) {
+ if (version == null)
+ found = true;
+ else if (version.equals(features[i].getVersion()))
+ found = true;
+ }
+ }
+ }
+ assertTrue(message, found);
+ }
+
+ /*
+ * Return a boolean value indicating whether or not the IU with the given ID and version
+ * is installed. We do this by loading the profile registry and seeing if it is there.
+ */
+ public boolean isInstalled(String id, String version) {
+ File location = new File(output, "eclipse/p2/org.eclipse.equinox.p2.engine/profileRegistry");
+ SimpleProfileRegistry registry = new SimpleProfileRegistry(location, new SurrogateProfileHandler(), false);
+ IProfile[] profiles = registry.getProfiles();
+ assertEquals("1.0 Should only be one profile in registry.", 1, profiles.length);
+ Collector collector = profiles[0].query(new InstallableUnitQuery(id, new Version(version)), new Collector(), null);
+ return !collector.isEmpty();
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AllTests.java
new file mode 100644
index 000000000..e44dd90e2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AllTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.reconciler.dropins;
+
+import junit.framework.*;
+
+/**
+ * To run the reconciler tests, you must perform some manual setup steps:
+ * 1) Download the platform runtime binary zip (latest build or the one you want to test).
+ * 2) Set the following system property to the file system path of the binary zip. For example:
+ *
+ * -Dorg.eclipse.equinox.p2.reconciler.tests.platform.archive=c:/tmp/eclipse-platform-3.4-win32.zip
+ */
+public class AllTests extends TestCase {
+ public static Test suite() {
+ TestSuite suite = new TestSuite(AllTests.class.getName());
+ suite.addTest(BasicTests.suite());
+ suite.addTest(ConfigurationTests.suite());
+ return suite;
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/BasicTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/BasicTests.java
new file mode 100644
index 000000000..29b667dae
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/BasicTests.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.reconciler.dropins;
+
+import java.io.File;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+//- add new
+//- remove only
+//- add higher
+//- remove higher
+//- add lower (no change)
+//- remove lower (no change)
+//
+//singleton behaviour vs non-singleton behaviour
+//
+// platform specific fragments
+//
+//dropins/*/eclipse/[features|plugins]/*
+//dropins/*/[features|plugins]/*
+//dropins/[features|plugins]/*
+//dropins/Foo (Foo is a feature or bundle, in folder or jar shape)
+//dropins/some.link
+//
+//handle both dropins and plugins directory
+public class BasicTests extends AbstractReconcilerTest {
+
+ /*
+ * Constructor for the class.
+ */
+ public BasicTests(String name) {
+ super(name);
+ }
+
+ /*
+ * The list of tests for this class. Order is important since some of them rely
+ * on the state from the previous test run.
+ */
+ public static Test suite() {
+ TestSuite suite = new ReconcilerTestSuite();
+ suite.addTest(new BasicTests("testNonSingleton"));
+ suite.addTest(new BasicTests("testSingleton"));
+ suite.addTest(new BasicTests("testDirectoryBasedPlugin"));
+ return suite;
+ }
+
+ /*
+ * Basic add and remove tests for directory-based bundles.
+ */
+ public void testDirectoryBasedPlugin() {
+ assertInitialized();
+ assertDoesNotExistInBundlesInfo("1.0", "directoryBased");
+ File dir = getTestData("1.1", "testData/reconciler/plugins/directoryBased_1.0.0");
+ add("1.2", "dropins", dir);
+ reconcile("1.3");
+ assertExistsInBundlesInfo("1.4", "directoryBased", "1.0.0");
+
+ remove("2.0", "dropins", "directoryBased_1.0.0");
+ reconcile("2.1");
+ assertDoesNotExistInBundlesInfo("2.2", "directoryBased");
+ }
+
+ /*
+ * Basic add and remove operations for non-singleton bundles.
+ */
+ public void testNonSingleton() {
+ assertInitialized();
+ assertDoesNotExistInBundlesInfo("0.1", "myBundle");
+ // copy bundle to dropins and reconcile
+ File jar = getTestData("2.0", "testData/reconciler/plugins/myBundle_1.0.0.jar");
+ add("0.2", "dropins", jar);
+ reconcile("0.3");
+ // bundle should exist
+ assertExistsInBundlesInfo("0.4", "myBundle");
+
+ // remove the bundle from the dropins and reconcile
+ remove("1.0", "dropins", "myBundle_1.0.0.jar");
+ reconcile("1.1");
+ // bundle should not exist anymore
+ assertDoesNotExistInBundlesInfo("1.2", "myBundle");
+
+ // Add 2 versions of the same non-singleton bundle to the dropins folder and
+ // ensure that both of them exist after reconciliation.
+ jar = getTestData("2.0", "testData/reconciler/plugins/myBundle_1.0.0.jar");
+ add("2.1", "dropins", jar);
+ jar = getTestData("2.2", "testData/reconciler/plugins/myBundle_2.0.0.jar");
+ add("2.3", "dropins", jar);
+ reconcile("2.4");
+ // bundle should exist - both versions since we have non-singleton bundles
+ assertExistsInBundlesInfo("2.5", "myBundle", "1.0.0");
+ assertExistsInBundlesInfo("2.6", "myBundle", "2.0.0");
+
+ // start with 2 non-singleton versions of the same bundle and remove the lower
+ // version and reconcile. should have just the higher version left.
+ remove("3.0", "dropins", "myBundle_1.0.0.jar");
+ reconcile("3.1");
+ // only the higher version should exist
+ assertDoesNotExistInBundlesInfo("3.2", "myBundle", "1.0.0");
+ assertExistsInBundlesInfo("3.3", "myBundle", "2.0.0");
+
+ // cleanup
+ remove("99.0", "dropins", "myBundle_2.0.0.jar");
+ reconcile("99.1");
+ // TODO re-enable this when we fix bug 248468
+ if (false)
+ assertDoesNotExistInBundlesInfo("99.2", "myBundle", "2.0.0");
+ }
+
+ /*
+ * Perform some add and remove operations with two different versions
+ * of a singleton bundle.
+ */
+ public void testSingleton() {
+ assertInitialized();
+ // empty state
+ assertDoesNotExistInBundlesInfo("1.0", "mySingletonBundle");
+
+ // add first version
+ File jar = getTestData("2.0", "testData/reconciler/plugins/mySingletonBundle_1.0.0.jar");
+ add("2.1", "dropins", jar);
+ reconcile("2.3");
+
+ // only lowest version of the bundle exists
+ assertExistsInBundlesInfo("3.0", "mySingletonBundle", "1.0.0");
+ assertDoesNotExistInBundlesInfo("3.1", "mySingletonBundle", "2.0.0");
+
+ // add higher version
+ jar = getTestData("4.0", "testData/reconciler/plugins/mySingletonBundle_2.0.0.jar");
+ add("4.1", "dropins", jar);
+ reconcile("4.3");
+
+ // highest version of the bundle has replaced the lower one
+ assertDoesNotExistInBundlesInfo("5.1", "mySingletonBundle", "1.0.0");
+ assertExistsInBundlesInfo("5.2", "mySingletonBundle", "2.0.0");
+
+ // re-add the lower version
+ jar = getTestData("6.0", "testData/reconciler/plugins/mySingletonBundle_1.0.0.jar");
+ add("6.1", "dropins", jar);
+ reconcile("6.3");
+
+ // nothing changes
+ assertDoesNotExistInBundlesInfo("7.1", "mySingletonBundle", "1.0.0");
+ assertExistsInBundlesInfo("7.2", "mySingletonBundle", "2.0.0");
+
+ // add back lower version
+ jar = getTestData("8.0", "testData/reconciler/plugins/mySingletonBundle_1.0.0.jar");
+ add("8.1", "dropins", jar);
+ reconcile("8.3");
+
+ // no change
+ assertDoesNotExistInBundlesInfo("9.1", "mySingletonBundle", "1.0.0");
+ assertExistsInBundlesInfo("9.2", "mySingletonBundle", "2.0.0");
+
+ // remove higher version
+ remove("10.1", "dropins", "mySingletonBundle_2.0.0.jar");
+ reconcile("10.2");
+
+ // lower should be there
+ assertExistsInBundlesInfo("11.0", "mySingletonBundle", "1.0.0");
+ assertDoesNotExistInBundlesInfo("11.1", "mySingletonBundle", "2.0.0");
+
+ // cleanup
+ remove("99.0", "dropins", "mySingletonBundle_1.0.0.jar");
+ remove("99.1", "dropins", "mySingletonBundle_2.0.0.jar");
+ reconcile("99.2");
+ assertDoesNotExistInBundlesInfo("99.3", "mySingletonBundle", "1.0.0");
+ assertDoesNotExistInBundlesInfo("99.4", "mySingletonBundle", "2.0.0");
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ConfigurationTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ConfigurationTests.java
new file mode 100644
index 000000000..131926a28
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ConfigurationTests.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.reconciler.dropins;
+
+import java.io.File;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.eclipse.equinox.internal.p2.update.*;
+
+/*
+ * Tests related to the platform configuration before and after reconciliation.
+ *
+ * Tests to add and regression tests to add:
+ * - ensure there is a platform:base: entry
+ * - 222505 - IUs in the dropins only rely on each other and not on things already in the install
+ * - ...
+ */
+public class ConfigurationTests extends AbstractReconcilerTest {
+
+ /*
+ * Constructor for the class.
+ */
+ public ConfigurationTests(String name) {
+ super(name);
+ }
+
+ /*
+ * The list of tests for this class. Order is important since some of them rely
+ * on the state from the previous test run.
+ */
+ public static Test suite() {
+ TestSuite suite = new ReconcilerTestSuite();
+ // TODO these fail because of bug 249641
+ // suite.addTest(new ConfigurationTests("testDiscoverOne"));
+ suite.addTest(new ConfigurationTests("test_247095"));
+ suite.addTest(new ConfigurationTests("test_247095b"));
+ suite.addTest(new ConfigurationTests("test_249607"));
+ suite.addTest(new ConfigurationTests("test_249898"));
+ return suite;
+ }
+
+ public void testDiscoverOne() {
+ // copy feature and bundle to dropins and reconcile
+ assertInitialized();
+ File featureFile = getTestData("2.0", "testData/reconciler/features/myFeature_1.0.0");
+ add("2.2", "dropins/features", featureFile);
+ File bundleFile = getTestData("2.3", "testData/reconciler/plugins/myBundle_1.0.0.jar");
+ add("2.4", "dropins/plugins", bundleFile);
+ assertDoesNotExistInBundlesInfo("2.5", "myBundle");
+ assertFalse("2.6", isInstalled("myBundle", "1.0.0"));
+ reconcile("2.7");
+
+ // make sure the feature is listed in a site in the configuration
+ Configuration config = getConfiguration();
+ assertFeatureExists("3.0", config, "myFeature", "1.0.0");
+
+ // cleanup
+ remove("99.0", "dropins/plugins", bundleFile.getName());
+ remove("99.1", "dropins/features", featureFile.getName());
+ reconcile("99.2");
+ config = getConfiguration();
+ assertFalse("99.4", !isInstalled("myFeature.feature", "1.0.0"));
+ assertDoesNotExistInBundlesInfo("99.5", "myBundle");
+ assertFalse("99.6", !isInstalled("myBundle", "1.0.0"));
+ }
+
+ /*
+ * We have a user-include site which lists some plug-ins and has a feature as
+ * a sub-element of the site. When the feature and its plug-ins are removed
+ * from the site we need to ensure the plug-ins are removed from the install.
+ */
+ public void test_247095() {
+ assertInitialized();
+ Configuration configuration = getConfiguration();
+ File temp = getTempFolder();
+ toRemove.add(temp);
+ String siteLocation = null;
+ siteLocation = new File(temp, "eclipse").toURI().toString();
+
+ // copy the data to the temp folder
+ File source = getTestData("1.0", "testData/reconciler/247095");
+ copy("1.1", source, temp);
+
+ /* this is the entry to add to the site.xml file
+ <site enabled="true" policy="USER-INCLUDE" updateable="false"
+ url="file:C:/share/1/" list="plugins/hello_1.0.0.jar" >
+ <feature id="hello_feature" version="1.0.0" />
+ </site>
+ */
+ Site site = createSite(Site.POLICY_USER_INCLUDE, true, false, siteLocation, new String[] {"plugins/bbb_1.0.0.jar,plugins/ccc_1.0.0.jar"});
+ Feature feature = createFeature(site, "bbb.feature", "1.0.0", "features/bbb.feature_1.0.0/");
+ site.addFeature(feature);
+ configuration.add(site);
+ save("5.0", configuration);
+ reconcile("6.0");
+ assertExistsInBundlesInfo("7.0", "bbb", "1.0.0");
+ assertTrue("7.1", isInstalled("bbb", "1.0.0"));
+ assertExistsInBundlesInfo("7.2", "ccc", "1.0.0");
+ assertTrue("7.3", isInstalled("ccc", "1.0.0"));
+ configuration = getConfiguration();
+ assertFeatureExists("8.0", configuration, "bbb.feature", "1.0.0");
+
+ // remove the feature and its bundle from the platform.xml but leave the second bundle
+ configuration = getConfiguration();
+ assertTrue("9.0", removeSite(configuration, siteLocation));
+ site = createSite(Site.POLICY_USER_INCLUDE, true, false, siteLocation, new String[] {"plugins/ccc_1.0.0.jar"});
+ configuration.add(site);
+ save("9.1", configuration);
+ reconcile("10.0");
+ assertDoesNotExistInBundlesInfo("10.1", "bbb", "1.0.0");
+ assertFalse("10.2", isInstalled("bbb", "1.0.0"));
+ assertExistsInBundlesInfo("10.3", "ccc", "1.0.0");
+ assertTrue("10.4", isInstalled("ccc", "1.0.0"));
+
+ // cleanup
+ configuration = getConfiguration();
+ removeSite(configuration, siteLocation);
+ save("99.2", configuration);
+ reconcile("99.3");
+ assertDoesNotExistInBundlesInfo("99.4", "ccc", "1.0.0");
+ assertFalse("99.5", isInstalled("ccc", "1.0.0"));
+ }
+
+ /*
+ * Same but delete the files from disk. (other test cases doesn't delete the files... simulates
+ * the use of a shared bundle pool)
+ */
+ public void test_247095b() {
+ assertInitialized();
+ Configuration configuration = getConfiguration();
+ File temp = getTempFolder();
+ toRemove.add(temp);
+ String siteLocation = null;
+ siteLocation = new File(temp, "eclipse").toURI().toString();
+
+ // copy the data to the temp folder
+ File source = getTestData("1.0", "testData/reconciler/247095");
+ copy("1.1", source, temp);
+
+ /* this is the entry to add to the site.xml file
+ <site enabled="true" policy="USER-INCLUDE" updateable="false"
+ url="file:C:/share/1/" list="plugins/hello_1.0.0.jar" >
+ <feature id="hello_feature" version="1.0.0" />
+ </site>
+ */
+ Site site = createSite(Site.POLICY_USER_INCLUDE, true, false, siteLocation, new String[] {"plugins/bbb_1.0.0.jar,plugins/ccc_1.0.0.jar"});
+ Feature feature = createFeature(site, "bbb.feature", "1.0.0", "features/bbb.feature_1.0.0/");
+ site.addFeature(feature);
+ configuration.add(site);
+ save("5.0", configuration);
+ reconcile("6.0");
+ assertExistsInBundlesInfo("7.0", "bbb", "1.0.0");
+ assertTrue("7.1", isInstalled("bbb", "1.0.0"));
+ assertExistsInBundlesInfo("7.2", "ccc", "1.0.0");
+ assertTrue("7.3", isInstalled("ccc", "1.0.0"));
+ configuration = getConfiguration();
+ assertFeatureExists("8.0", configuration, "bbb.feature", "1.0.0");
+
+ // remove the feature and its bundle from the platform.xml but leave the second bundle
+ configuration = getConfiguration();
+ assertTrue("9.0", removeSite(configuration, siteLocation));
+ site = createSite(Site.POLICY_USER_INCLUDE, true, false, siteLocation, new String[] {"plugins/ccc_1.0.0.jar"});
+ configuration.add(site);
+ save("9.1", configuration);
+ File parent = new File(temp, "eclipse");
+ assertTrue("9.2", delete(new File(parent, "plugins/bbb_1.0.0.jar")));
+ assertTrue("9.3", delete(new File(parent, "features/bbb.feature_1.0.0")));
+ reconcile("10.0");
+ assertDoesNotExistInBundlesInfo("10.1", "bbb", "1.0.0");
+ assertFalse("10.2", isInstalled("bbb", "1.0.0"));
+ assertExistsInBundlesInfo("10.3", "ccc", "1.0.0");
+ assertTrue("10.4", isInstalled("ccc", "1.0.0"));
+
+ // cleanup
+ configuration = getConfiguration();
+ removeSite(configuration, siteLocation);
+ save("99.2", configuration);
+ reconcile("99.3");
+ assertDoesNotExistInBundlesInfo("99.4", "ccc", "1.0.0");
+ assertFalse("99.5", isInstalled("ccc", "1.0.0"));
+ }
+
+ /*
+ * There was a problem if we had a user-exclude site policy and a list of
+ * features, we were always adding the features to the excludes list and
+ * therefore they were never installed.
+ */
+ public void test_249607() {
+ assertInitialized();
+ Configuration configuration = getConfiguration();
+ File temp = getTempFolder();
+ toRemove.add(temp);
+ String siteLocation = null;
+ siteLocation = new File(temp, "eclipse").toURI().toString();
+
+ // copy the data to the temp folder
+ File source = getTestData("1.0", "testData/reconciler/247095");
+ copy("1.1", source, temp);
+
+ Site site = createSite(Site.POLICY_USER_EXCLUDE, true, false, siteLocation, new String[] {"plugins/ccc_1.0.0.jar"});
+ Feature feature = createFeature(site, "bbb.feature", "1.0.0", "features/bbb.feature_1.0.0/");
+ site.addFeature(feature);
+ configuration.add(site);
+ save("2.0", configuration);
+ reconcile("2.1");
+ assertExistsInBundlesInfo("2.2", "bbb", "1.0.0");
+ assertTrue("2.3", isInstalled("bbb", "1.0.0"));
+ assertDoesNotExistInBundlesInfo("2.4", "ccc");
+ assertFalse("2.4", isInstalled("ccc", "1.0.0"));
+ configuration = getConfiguration();
+ assertFeatureExists("3.0", configuration, "bbb.feature", "1.0.0");
+ assertTrue("3.1", isInstalled("bbb.feature.feature.group", "1.0.0"));
+
+ // cleanup
+ configuration = getConfiguration();
+ removeSite(configuration, siteLocation);
+ save("99.2", configuration);
+ reconcile("99.3");
+ assertDoesNotExistInBundlesInfo("99.4", "bbb", "1.0.0");
+ assertFalse("99.5", isInstalled("bbb", "1.0.0"));
+ assertDoesNotExistInBundlesInfo("99.6", "ccc", "1.0.0");
+ assertFalse("99.7", isInstalled("ccc", "1.0.0"));
+ }
+
+ /*
+ * Add a site to the platform.xml, reconcile, ensure its contents are installed, remove the site,
+ * reconcile, ensure the contents are uninstalled.
+ */
+ public void test_249898() {
+ assertInitialized();
+ Configuration configuration = getConfiguration();
+ File temp = getTempFolder();
+ toRemove.add(temp);
+ String siteLocation = new File(temp, "eclipse").toURI().toString();
+
+ // copy the data to the temp folder
+ File source = getTestData("1.0", "testData/reconciler/247095");
+ copy("1.1", source, temp);
+
+ Site site = createSite(Site.POLICY_USER_INCLUDE, true, false, siteLocation, new String[] {"plugins/bbb_1.0.0.jar,plugins/ccc_1.0.0.jar"});
+ Feature feature = createFeature(site, "bbb.feature", "1.0.0", "features/bbb.feature_1.0.0/");
+ site.addFeature(feature);
+ configuration.add(site);
+ save("5.0", configuration);
+ reconcile("6.0");
+ assertExistsInBundlesInfo("7.0", "bbb", "1.0.0");
+ assertTrue("7.1", isInstalled("bbb", "1.0.0"));
+ assertExistsInBundlesInfo("7.2", "ccc", "1.0.0");
+ assertTrue("7.3", isInstalled("ccc", "1.0.0"));
+ configuration = getConfiguration();
+ assertFeatureExists("8.0", configuration, "bbb.feature", "1.0.0");
+
+ // remove the site from the platform.xml
+ configuration = getConfiguration();
+ assertTrue("9.0", removeSite(configuration, siteLocation));
+ save("9.1", configuration);
+ reconcile("10.0");
+ assertDoesNotExistInBundlesInfo("10.1", "bbb", "1.0.0");
+ assertFalse("10.2", isInstalled("bbb", "1.0.0"));
+ assertDoesNotExistInBundlesInfo("10.3", "ccc", "1.0.0");
+ assertFalse("10.4", isInstalled("ccc", "1.0.0"));
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ReconcilerTestSuite.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ReconcilerTestSuite.java
new file mode 100644
index 000000000..17682ea69
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/ReconcilerTestSuite.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.reconciler.dropins;
+
+import java.util.Enumeration;
+import java.util.Vector;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class ReconcilerTestSuite extends TestSuite {
+
+ private Test INITIALIZE = new AbstractReconcilerTest("initialize");
+ private Test CLEANUP = new AbstractReconcilerTest("cleanup");
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestSuite#tests()
+ */
+ public Enumeration tests() {
+ Vector result = new Vector();
+ result.add(INITIALIZE);
+ for (Enumeration e = super.tests(); e.hasMoreElements();)
+ result.add(e.nextElement());
+ result.add(CLEANUP);
+ return result.elements();
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestSuite#testCount()
+ */
+ public int testCount() {
+ return super.testCount() + 2;
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestSuite#testAt(int)
+ */
+ public Test testAt(int index) {
+ if (index == 0)
+ return INITIALIZE;
+ if (index == testCount() - 1)
+ return CLEANUP;
+ return super.testAt(index - 1);
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/.eclipseextension b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/.eclipseextension
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/.eclipseextension
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/features/bbb.feature_1.0.0/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/features/bbb.feature_1.0.0/feature.xml
new file mode 100644
index 000000000..d4e47cbe0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/features/bbb.feature_1.0.0/feature.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="bbb.feature"
+ label="Feature Feature"
+ version="1.0.0">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <plugin
+ id="bbb"
+ download-size="0"
+ install-size="0"
+ version="1.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/bbb_1.0.0.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/bbb_1.0.0.jar
new file mode 100644
index 000000000..97cfbc503
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/bbb_1.0.0.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/ccc_1.0.0.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/ccc_1.0.0.jar
new file mode 100644
index 000000000..328d9ad65
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/247095/eclipse/plugins/ccc_1.0.0.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_1.0.0/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_1.0.0/feature.xml
new file mode 100644
index 000000000..afb647df9
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_1.0.0/feature.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="myFeaturePatch"
+ label="MyFeaturePatch Feature"
+ version="1.0.0">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <requires>
+ <import feature="myFeature" version="1.0.0" patch="true"/>
+ </requires>
+
+ <plugin
+ id="mySingletonBundle"
+ download-size="0"
+ install-size="0"
+ version="1.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_2.0.0/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_2.0.0/feature.xml
new file mode 100644
index 000000000..0e7227e35
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeaturePatch_2.0.0/feature.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="myFeaturePatch"
+ label="MyFeaturePatch Feature"
+ version="2.0.0">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <requires>
+ <import feature="myFeature" version="1.0.0" patch="true"/>
+ </requires>
+
+ <plugin
+ id="myBundle"
+ download-size="0"
+ install-size="0"
+ version="2.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_1.0.0/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_1.0.0/feature.xml
new file mode 100644
index 000000000..e51123811
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_1.0.0/feature.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="myFeature"
+ label="MyFeature Feature"
+ version="1.0.0">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <plugin
+ id="myBundle"
+ download-size="0"
+ install-size="0"
+ version="1.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_2.0.0/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_2.0.0/feature.xml
new file mode 100644
index 000000000..f9b6fa0c8
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/features/myFeature_2.0.0/feature.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="myFeature"
+ label="MyFeature Feature"
+ version="2.0.0">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <plugin
+ id="myBundle"
+ download-size="0"
+ install-size="0"
+ version="2.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/directoryBased.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/directoryBased.jar
new file mode 100644
index 000000000..5f5e8021b
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/directoryBased.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/plugin.xml b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/plugin.xml
new file mode 100644
index 000000000..8139c6a1e
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/directoryBased_1.0.0/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin
+ id="directoryBased"
+ name="directoryBased"
+ version="1.0.0">
+
+ <runtime>
+ <library name="directoryBased.jar"/>
+ </runtime>
+
+</plugin>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_1.0.0.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_1.0.0.jar
new file mode 100644
index 000000000..011368be8
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_1.0.0.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_2.0.0.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_2.0.0.jar
new file mode 100644
index 000000000..b7c01a542
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/myBundle_2.0.0.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_1.0.0.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_1.0.0.jar
new file mode 100644
index 000000000..a2eee0aa6
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_1.0.0.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_2.0.0.jar b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_2.0.0.jar
new file mode 100644
index 000000000..8cd275fee
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/reconciler/plugins/mySingletonBundle_2.0.0.jar
Binary files differ

Back to the top