CQ-4081: Initial import
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/.classpath b/tests/org.eclipse.e4.enterprise.installer.test/.classpath
new file mode 100644
index 0000000..8a8f166
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/.project b/tests/org.eclipse.e4.enterprise.installer.test/.project
new file mode 100644
index 0000000..c0e9017
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.e4.enterprise.installer.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.e4.enterprise.installer.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..eec20cf
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Mon Apr 20 09:46:07 CDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/META-INF/MANIFEST.MF b/tests/org.eclipse.e4.enterprise.installer.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..921c075
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Installer Test Fragment
+Bundle-SymbolicName: org.eclipse.e4.enterprise.installer.test
+Bundle-Version: 4.6.0.qualifier
+Fragment-Host: org.eclipse.e4.enterprise.installer;bundle-version="4.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.junit,
+ org.easymock,
+ org.eclipse.e4.ui.test.utils
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/about.html b/tests/org.eclipse.e4.enterprise.installer.test/about.html
new file mode 100644
index 0000000..f77f378
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/about.html
@@ -0,0 +1,22 @@
+<h1>About This Content</h1>
+
+23 June, 2010
+
+<h2>License</h2>
+
+<p>The Eclipse Foundation makes available all content in this plug-in
+("Content"). Unless otherwise indicated below, the Content is provided
+to you under the terms and conditions of the Eclipse Public License
+Version 1.0 ("EPL"). A copy of the EPL is available at
+http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL,
+"Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse
+Foundation, the Content is being redistributed by another party
+("Redistributor") and different terms and conditions may apply to your
+use of any object code in the Content. Check the Redistributor’s
+license that was provided with the Content. If no such license exists,
+contact the Redistributor. Unless otherwise indicated below, the terms
+and conditions of the EPL still apply to any source code in the
+Content and such source code may be obtained at
+http://www.eclipse.org.</p>
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/build.properties b/tests/org.eclipse.e4.enterprise.installer.test/build.properties
new file mode 100644
index 0000000..41eb6ad
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/AbstractBundleTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/AbstractBundleTest.java
new file mode 100644
index 0000000..6619aa3
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/AbstractBundleTest.java
@@ -0,0 +1,95 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSite;
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSiteManager;
+import org.eclipse.e4.ui.test.utils.FixturesLocation;
+import org.eclipse.e4.ui.test.utils.TestCaseX;
+
+
+public abstract class AbstractBundleTest extends TestCaseX {
+
+ public static final URL SITE400_FIXTURE_URL = makeFixtureURL("fixtures/site_4.0.0/site.xml");
+ public static final URL SITE401_FIXTURE_URL = makeFixtureURL("fixtures/site_4.0.1/site.xml");
+ public static final URL SITE500_FIXTURE_URL = makeFixtureURL("fixtures/site_5.0.0/site.xml");
+
+
+ protected BundleUpdater testee;
+
+ private static final String INSTALL_TO_SITE_DIR = System.getProperty("java.io.tmpdir") + File.separator + "AbstractBundleTest";
+
+ protected File downloadRootDir;
+
+ public AbstractBundleTest() {
+ super();
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ //delete anything in the INSTALL_TO_SITE_DIR
+ downloadRootDir = new File(INSTALL_TO_SITE_DIR);
+ testee = new BundleUpdater();
+
+ //if any tests are forced to stop AFTER the set-up but before the tearDown then we might have
+ //a problem, so we are just running tearDown first for safety
+ tearDown();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ //find the site that exists and get rid of it
+ InstallationSiteManager builder = new InstallationSiteManager(downloadRootDir);
+ InstallationSite currentSite = builder.find();
+ currentSite.removeFromConfiguredSites();
+ deleteDir(downloadRootDir);
+ }
+
+ protected int countOccurancesOfListItemsStartingWithPrefix(List<String> list, String prefix) {
+ int count = 0;
+ for (String string : list) {
+ if (string.startsWith(prefix))
+ count++;
+ }
+ return count;
+ }
+
+ private static URL makeFixtureURL(String fixturePath) {
+ // DJO: FIXME: Why does this ignore the fixturePath parameter? This is smelly! Phew!
+ try {
+// return FileLocator.toFileURL(find);
+ return new URL(FixturesLocation.FIXTURE_ROOT);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private boolean deleteDir(File fileOrDir) {
+ if (fileOrDir.isDirectory()) {
+ String[] children = fileOrDir.list();
+ for (int i = 0; i < children.length; i++) {
+ boolean success = deleteDir(new File(fileOrDir, children[i]));
+ if (!success) {
+ return false;
+ }
+ }
+ }
+
+ // The directory or file can now be deleted
+ return fileOrDir.delete();
+ }
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/BundleUpdaterConfigTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/BundleUpdaterConfigTest.java
new file mode 100644
index 0000000..ef08e05
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/BundleUpdaterConfigTest.java
@@ -0,0 +1,321 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import static org.eclipse.e4.enterprise.installer.BundleUpdaterConfig.DOWNLOAD_ROOT_KEY;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.e4.enterprise.installer.BundleUpdaterConfig;
+import org.eclipse.e4.enterprise.installer.FeatureVersionedIdentifier;
+import org.eclipse.e4.enterprise.installer.InstallError;
+
+import junit.framework.TestCase;
+
+
+public class BundleUpdaterConfigTest extends TestCase {
+
+ // convertToFeatureVersionSet
+ // -------------------------------------------------------------------------------
+
+ public void testConvertToFeatureVersionSet_MoreThan2SpaceSeparatedString_ThrowsException() throws Exception {
+ String id = "featureID";
+ String version = "1.2.3";
+ String spurious = "spuriousExtraThing";
+
+ String line = id + " " + version + " " + spurious;
+
+ try {
+ BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(line));
+ fail();
+ } catch (InstallError e) {
+ // want to be here
+ }
+
+ }
+
+ public void testConvertToFeatureVersionSet_InLineCommentsIgnored() throws Exception {
+ String id1 = "featureID1";
+ String version1 = "1.2.31";
+ String id2 = "featureID2";
+ String version2 = "1.2.32";
+ String id3 = "featureID3";
+ String version3 = "1.2.33";
+ String id4 = "featureID4";
+ String version4 = "1.2.34";
+
+ String comment = "# I am a comment because I start with a hash.";
+
+ String line1 = id1 + " " + version1 + comment + "\n";
+ String line2 = id2 + " " + version2 + comment + "\n";
+ String line3 = id3 + " " + version3 + comment + "\n";
+ String line4 = id4 + " " + version4 + comment + "\n";
+
+ String input = line1 + line2 + line3 + line4;
+
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(input));
+
+ assertEquals(4, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id1, version1)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id2, version2)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id3, version3)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id4, version4)));
+ }
+
+ public void testConvertToFeatureVersionSet_CommentLinesIgnored() throws Exception {
+ String id1 = "featureID1";
+ String version1 = "1.2.31";
+ String id2 = "featureID2";
+ String version2 = "1.2.32";
+ String id3 = "featureID3";
+ String version3 = "1.2.33";
+ String id4 = "featureID4";
+ String version4 = "1.2.34";
+
+ String line1 = id1 + " " + version1 + "\n";
+ String line2 = id2 + " " + version2 + "\n";
+ String line3 = id3 + " " + version3 + "\n";
+ String line4 = id4 + " " + version4 + "\n";
+
+ String commentLine = "# I am a comment because I start with a hash. \n";
+
+ String input = line1 + commentLine + line2 + commentLine + line3 + commentLine + line4;
+
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(input));
+
+ assertEquals(4, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id1, version1)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id2, version2)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id3, version3)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id4, version4)));
+ }
+
+ public void testConvertToFeatureVersionSet_EmptyLinesIgnored() throws Exception {
+ String id1 = "featureID1";
+ String version1 = "1.2.31";
+ String id2 = "featureID2";
+ String version2 = "1.2.32";
+ String id3 = "featureID3";
+ String version3 = "1.2.33";
+ String id4 = "featureID4";
+ String version4 = "1.2.34";
+
+ String line1 = id1 + " " + version1 + "\n";
+ String line2 = id2 + " " + version2 + "\n";
+ String line3 = id3 + " " + version3 + "\n";
+ String line4 = id4 + " " + version4 + "\n";
+
+ String blankLine = " \n";
+
+ String input = line1 + blankLine + line2 + blankLine + line3 + blankLine + line4;
+
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(input));
+
+ assertEquals(4, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id1, version1)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id2, version2)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id3, version3)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id4, version4)));
+ }
+
+ public void testConvertToFeatureVersionSet_UnspecifiedVersion_defaultsTo000() throws Exception {
+ String id = "featureID";
+ String version = "";
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(id + " " + version));
+
+ assertEquals(1, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id, "0.0.0")));
+ }
+
+ public void testConvertToFeatureVersionSet_ManyItems_returnsCorrectlyParsedSet() throws Exception {
+ String id1 = "featureID1";
+ String version1 = "1.2.31";
+ String id2 = "featureID2";
+ String version2 = "1.2.32";
+ String id3 = "featureID3";
+ String version3 = "1.2.33";
+ String id4 = "featureID4";
+ String version4 = "1.2.34";
+
+ String line1 = id1 + " " + version1 + "\n";
+ String line2 = id2 + " " + version2 + "\n";
+ String line3 = id3 + " " + version3 + "\n";
+ String line4 = id4 + " " + version4 + "\n";
+
+ String input = line1 + line2 + line3 + line4;
+
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(input));
+
+ assertEquals(4, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id1, version1)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id2, version2)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id3, version3)));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id4, version4)));
+ }
+
+ public void testConvertToFeatureVersionSet_singleItem_returnsCorrectlyParsedSet() throws Exception {
+ String id = "featureID";
+ String version = "1.2.3";
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(id + " " + version));
+
+ assertEquals(1, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(id, version)));
+ }
+
+ public void testConvertToFeatureVersionSet_EmptyStream_returnsEmptySet() throws Exception {
+ Set<FeatureVersionedIdentifier> result = BundleUpdaterConfig.convertToFeatureVersionSet(convertStringToStream(""));
+
+ assertEquals(0, result.size());
+ }
+
+ private ByteArrayInputStream convertStringToStream(String contents) {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(contents.getBytes());
+ return inputStream;
+ }
+
+ // parseURLs
+ // -------------------------------------------------------------------------------
+
+ public void testParseURLS_WithAtLeastOneDuffOne_throwsException() throws Exception {
+ String urlAsString1 = "http://www.eclipse.org";
+ String urlAsString2 = "http://news.bbc.co.uk";
+ String urlAsString3 = "I-am-not-a-valid-url";
+ String urlAsString4 = "http://www.theregister.co.uk/";
+
+ String input = urlAsString1 + " " + urlAsString2 + " " + urlAsString3 + " " + urlAsString4 + " ";
+
+ try {
+ BundleUpdaterConfig.parseURLs(input);
+ fail();
+ } catch (InstallError e) {
+ assertTrue(e.getCause() instanceof MalformedURLException);
+ }
+ }
+
+ public void testParseURLS_N_ValidURLsWithVariousSpaces_parsedCorrectly() throws Exception {
+ String urlAsString1 = "http://www.eclipse.org";
+ String urlAsString2 = "http://news.bbc.co.uk";
+ String urlAsString3 = "http://slashdot.org/";
+ String urlAsString4 = "http://www.theregister.co.uk/";
+
+ String s = " ";
+
+ String input = s + s + s + urlAsString1 + s + urlAsString2 + s + s + s + urlAsString3 + s + s + s + s + s + urlAsString4 + s + s;
+
+ URL[] result = BundleUpdaterConfig.parseURLs(input);
+
+ assertEquals(4, result.length);
+ assertEquals(urlAsString1, result[0].toString());
+ assertEquals(urlAsString2, result[1].toString());
+ assertEquals(urlAsString3, result[2].toString());
+ assertEquals(urlAsString4, result[3].toString());
+ }
+
+ public void testParseURLS_TwoValidURLsWithManySpaces_parsedCorrectly() throws Exception {
+ String urlAsString1 = "http://www.eclipse.org";
+ String urlAsString2 = "http://news.bbc.co.uk";
+
+ String fourSpaces = " ";
+ String input = urlAsString1 + fourSpaces + urlAsString2;
+
+ URL[] result = BundleUpdaterConfig.parseURLs(input);
+
+ assertEquals(2, result.length);
+ assertEquals(urlAsString1, result[0].toString());
+ assertEquals(urlAsString2, result[1].toString());
+ }
+
+ public void testParseURLS_TwoValidURLs_parsedCorrectly() throws Exception {
+ String urlAsString1 = "http://www.eclipse.org";
+ String urlAsString2 = "http://news.bbc.co.uk";
+
+ String input = urlAsString1 + " " + urlAsString2;
+
+ URL[] result = BundleUpdaterConfig.parseURLs(input);
+
+ assertEquals(2, result.length);
+ assertEquals(urlAsString1, result[0].toString());
+ assertEquals(urlAsString2, result[1].toString());
+ }
+
+ public void testParseURLS_SingleURLWithPadding_parsedCorrectly() throws Exception {
+ String urlAsString = " http://www.eclipse.org ";
+
+ URL[] result = BundleUpdaterConfig.parseURLs(urlAsString);
+
+ assertEquals(1, result.length);
+ assertEquals(urlAsString.trim(), result[0].toString());
+ }
+
+ public void testParseURLS_SingleURL_parsedCorrectly() throws Exception {
+ String urlAsString = "http://www.eclipse.org";
+
+ URL[] result = BundleUpdaterConfig.parseURLs(urlAsString);
+
+ assertEquals(1, result.length);
+ assertEquals(urlAsString, result[0].toString());
+ }
+
+ public void testParseURLS_KeyPresentValueIsSpace_throwsException() throws Exception {
+ try {
+ BundleUpdaterConfig.parseURLs(" ");
+ fail();
+ } catch (InstallError e) {
+ assertTrue(e.getCause() instanceof MalformedURLException);
+ }
+ }
+
+ public void testParseURLS_KeyPresentValueIsEmptyString_throwsException() throws Exception {
+ try {
+ BundleUpdaterConfig.parseURLs("");
+ fail();
+ } catch (InstallError e) {
+ assertTrue(e.getCause() instanceof MalformedURLException);
+ }
+ }
+
+ public void testParseURLS_KeyPresentButNoValue_ThrowsException() throws Exception {
+ try {
+ BundleUpdaterConfig.parseURLs(null);
+ fail();
+ } catch (InstallError e) {
+ // want to be here
+ }
+ }
+
+ public void testFindDownloadDirectoryRoot_PropertySet_returnsValueOfProperty() throws Exception {
+ String expectedPath = "c:/temp/mytestvalue";
+ Properties properties = new Properties();
+ properties.put(DOWNLOAD_ROOT_KEY, expectedPath);
+ BundleUpdaterConfig.props = properties; // inject our properties into
+ // BundleUpdaterConfig
+
+ File actual = BundleUpdaterConfig.findDownloadDirectoryRoot();
+
+ File expected = new File(expectedPath);
+
+ assertEquals(expected, actual);
+ }
+
+ public void testFindDownloadDirectoryRoot_NoPropertySet_returnsDefaultDownloadRoot() throws Exception {
+ BundleUpdaterConfig.props = new Properties();
+
+ File actual = BundleUpdaterConfig.findDownloadDirectoryRoot();
+ File expected = BundleUpdaterConfig.getDefaultDownloadRoot();
+
+ assertEquals(expected, actual);
+ }
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/BundleUpdaterTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/BundleUpdaterTest.java
new file mode 100644
index 0000000..8b22d79
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/BundleUpdaterTest.java
@@ -0,0 +1,600 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.e4.enterprise.installer.internal.FeatureReferenceTree;
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSite;
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSiteManager;
+import org.eclipse.e4.enterprise.installer.internal.site.StubInstallationSite;
+import org.eclipse.e4.ui.test.utils.FixturesLocation;
+import org.eclipse.e4.ui.test.utils.TestCaseX;
+import org.eclipse.update.core.IFeature;
+import org.eclipse.update.core.IFeatureReference;
+import org.eclipse.update.core.ISite;
+import org.eclipse.update.core.VersionedIdentifier;
+
+
+public class BundleUpdaterTest extends TestCaseX {
+ private static final String FIXTURE_FEATURE_ID = "org.eclipse.e4.enterprise.installer.test.fixture.feature";
+
+ private static final String FIXTURE_FEATURE_ID_A = "org.eclipse.e4.enterprise.installer.test.fixture.many_a.feature";
+ private static final String FIXTURE_FEATURE_ID_B = "org.eclipse.e4.enterprise.installer.test.fixture.many_b.feature";
+ private static final String FIXTURE_FEATURE_ID_C = "org.eclipse.e4.enterprise.installer.test.fixture.many_c.feature";
+
+ private static final String SITE400_FIXTURE = FixturesLocation.FIXTURE_ROOT + "/site_4.0.0/site.xml";
+ private static final String SITEABC_FIXTURE = FixturesLocation.FIXTURE_ROOT + "/site_ABC/site.xml";
+ private static final String SITE401_FIXTURE = FixturesLocation.FIXTURE_ROOT + "/site_4.0.1/site.xml";
+ private static final String SITE500_FIXTURE = FixturesLocation.FIXTURE_ROOT + "/site_5.0.0/site.xml";
+ private static final String FOO_FIXTURE = FixturesLocation.FIXTURE_ROOT + "/no_site_ABC/foo.xml";
+
+ private URL SITE400_URL;
+ private URL SITEABC_URL;
+ private URL SITE401_URL;
+ private URL SITE500_URL;
+ private URL FOO_URL;
+
+
+ BundleUpdater testee;
+
+ public BundleUpdaterTest() throws MalformedURLException {
+ SITE400_URL = new URL(SITE400_FIXTURE);
+ SITEABC_URL = new URL(SITEABC_FIXTURE);
+ SITE401_URL = new URL(SITE401_FIXTURE);
+ SITE500_URL = new URL(SITE500_FIXTURE);
+ FOO_URL = new URL(FOO_FIXTURE);
+
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ testee = new BundleUpdater(null);
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+
+ // Custom-Asserts--------------------------------------------------------------------------------------------------------------------
+
+ private void assertFeatureFoundIn(List<IFeatureReference> list, String featureID) throws Exception {
+ for (IFeatureReference feature : list) {
+ if (feature.getVersionedIdentifier().getIdentifier().equals(featureID)) {
+ return;
+ }
+ }
+ fail("Expected pruned feature to install list to contain: " + featureID);
+ }
+
+ // calculateFeaturesReferencesToInstall-----------------------------------------------------------------------------------------------
+
+ public void testVersionQualifiersAreOrderedAsAStringComparisonWhenUsingList() throws InstallError {
+ List<IFeatureReference> featuresToLookIn = new ArrayList<IFeatureReference>();
+ Set<FeatureVersionedIdentifier> featuresToProvision = new HashSet<FeatureVersionedIdentifier>();
+
+ String featureID = "MyFeature";
+ featuresToLookIn.add(FeatureReferenceMother.createFeatureReferenceFromFVIWithNoChildren(
+ new FeatureVersionedIdentifier(featureID, "1.0.0.M7")));
+ IFeatureReference expectedIFR = FeatureReferenceMother.createFeatureReferenceFromFVIWithNoChildren(
+ new FeatureVersionedIdentifier(featureID, "1.0.0.R3"));
+ featuresToLookIn.add(expectedIFR);
+
+ featuresToProvision.add(new FeatureVersionedIdentifier(featureID, "0.0.0"));
+
+ List<IFeatureReference> result = testee.resolveVersionNumbersAsIFRList(featuresToLookIn, featuresToProvision, true);
+
+ assertEquals(1, result.size());
+ assertTrue(result.contains(expectedIFR));
+ }
+
+ public void testVersionQualifiersAreOrderedAsAStringComparisonWhenUsingSet() throws InstallError {
+ FeatureReferenceTree tree = new FeatureReferenceTree();
+ String featureID = "MyFeature";
+ FeatureVersionedIdentifier oldFvi = new FeatureVersionedIdentifier(featureID, "1.0.0.M7");
+ IFeatureReference oldFeature = FeatureReferenceMother.createFeatureReferenceFromFVIWithNoChildren(oldFvi);
+
+ FeatureVersionedIdentifier newFvi = new FeatureVersionedIdentifier(featureID, "1.0.0.R3");
+ IFeatureReference newFeature = FeatureReferenceMother.createFeatureReferenceFromFVIWithNoChildren(newFvi);
+
+ tree.add(newFeature);
+ tree.add(oldFeature);
+
+ Set<FeatureVersionedIdentifier> setToProvision = new HashSet<FeatureVersionedIdentifier>();
+ setToProvision.add(new FeatureVersionedIdentifier(featureID, "0.0.0"));
+
+ Set<FeatureVersionedIdentifier> result = testee.resolveVersionNumbersAsFVISet(tree, setToProvision, true);
+
+ assertEquals(1, result.size());
+ assertTrue(result.contains(newFvi));
+ }
+
+ // 0 FRs come from local, the rest from remote
+ public void testCalculateFeaturesReferencesToInstall_0FeatureRefsComeFromTheLocalSite() throws Exception {
+ List<IFeatureReference> local = new ArrayList<IFeatureReference>();
+ List<IFeatureReference> remote = new ArrayList<IFeatureReference>();
+ remote.add(new SpecialStubFeatureReference("f1", false));
+ remote.add(new SpecialStubFeatureReference("f2", false));
+ remote.add(new SpecialStubFeatureReference("f3", false));
+
+ List<IFeatureReference> result = testee.calculateFeaturesReferencesToInstall(remote, local);
+
+ for (IFeatureReference featureReference : result) {
+ SpecialStubFeatureReference stubFR = (SpecialStubFeatureReference) featureReference;
+ assertFalse("featureName:" + stubFR.name, stubFR.isLocal);
+ }
+ }
+
+ // 1 FR comes from local, the rest from remote
+ public void testCalculateFeaturesReferencesToInstall_1FeatureRefComesFromTheLocalSite() throws Exception {
+ String featureOnBothLocalAndRemote = "f2";
+ List<IFeatureReference> local = new ArrayList<IFeatureReference>();
+ local.add(new SpecialStubFeatureReference(featureOnBothLocalAndRemote, true));
+ List<IFeatureReference> remote = new ArrayList<IFeatureReference>();
+ remote.add(new SpecialStubFeatureReference("f1", false));
+ remote.add(new SpecialStubFeatureReference(featureOnBothLocalAndRemote, false));
+ remote.add(new SpecialStubFeatureReference("f3", false));
+
+ List<IFeatureReference> result = testee.calculateFeaturesReferencesToInstall(remote, local);
+
+ for (IFeatureReference featureReference : result) {
+ SpecialStubFeatureReference stubFR = (SpecialStubFeatureReference) featureReference;
+ String name = stubFR.name;
+ if (featureOnBothLocalAndRemote.equals(name)) {
+ assertTrue("featureName:" + name, stubFR.isLocal);
+ } else {
+ assertFalse("featureName:" + name, stubFR.isLocal);
+ }
+ }
+ }
+
+ // n FRs come from local, the rest from remote
+ public void testCalculateFeaturesReferencesToInstall_ManyFeatureRefComesFromTheLocalSite() throws Exception {
+ String featureOnBothLocalAndRemote1 = "f2";
+ String featureOnBothLocalAndRemote2 = "f3";
+
+ HashSet<String> localNames = new HashSet<String>(2);
+ localNames.add(featureOnBothLocalAndRemote1);
+ localNames.add(featureOnBothLocalAndRemote2);
+
+ List<IFeatureReference> local = new ArrayList<IFeatureReference>();
+ local.add(new SpecialStubFeatureReference(featureOnBothLocalAndRemote1, true));
+ local.add(new SpecialStubFeatureReference(featureOnBothLocalAndRemote2, true));
+
+ List<IFeatureReference> remote = new ArrayList<IFeatureReference>();
+ remote.add(new SpecialStubFeatureReference("f1", false));
+ remote.add(new SpecialStubFeatureReference(featureOnBothLocalAndRemote1, false));
+ remote.add(new SpecialStubFeatureReference(featureOnBothLocalAndRemote2, false));
+ remote.add(new SpecialStubFeatureReference("f4", false));
+
+ List<IFeatureReference> result = testee.calculateFeaturesReferencesToInstall(remote, local);
+
+ for (IFeatureReference featureReference : result) {
+ SpecialStubFeatureReference stubFR = (SpecialStubFeatureReference) featureReference;
+ String name = stubFR.name;
+ if (localNames.contains(name)) {
+ assertTrue("featureName:" + name, stubFR.isLocal);
+ } else {
+ assertFalse("featureName:" + name, stubFR.isLocal);
+ }
+ }
+ }
+ // all come from local.
+ public void testCalculateFeaturesReferencesToInstall_AllFeatureRefsComeFromTheLocalSite() throws Exception {
+ List<IFeatureReference> local = new ArrayList<IFeatureReference>();
+ local.add(new SpecialStubFeatureReference("f1", true));
+ local.add(new SpecialStubFeatureReference("f2", true));
+ local.add(new SpecialStubFeatureReference("f3", true));
+ List<IFeatureReference> remote = new ArrayList<IFeatureReference>();
+
+ List<IFeatureReference> result = testee.calculateFeaturesReferencesToInstall(remote, local);
+
+ for (IFeatureReference featureReference : result) {
+ SpecialStubFeatureReference stubFR = (SpecialStubFeatureReference) featureReference;
+ assertTrue("featureName:" + stubFR.name, stubFR.isLocal);
+ }
+ }
+ // setFeaturesToProvisionAsSetOfAllFeaturesOnRemoteSitesIfUnspecified-----------------------------------------------------------------
+
+ public void testSetFeaturesToProvisionAsSetOfAllFeaturesOnRemoteSitesIfUnspecified_whenProvisingSetNull_CopiesFromIFRs() throws Exception {
+ FeatureReferenceTree input = testee.getAllFeaturesFromUpdateSites(new URL[] { SITEABC_URL });
+
+ Set<FeatureVersionedIdentifier> result = testee.setFeaturesToProvisionToBeOfAllFeaturesOnRemoteSitesIfUnspecified(null, input);
+
+ assertEquals(3, result.size());
+ assertTrue(result.contains(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_A, "1.0.0")));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_B, "1.0.0")));
+ assertTrue(result.contains(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_C, "1.0.0")));
+ }
+
+ public void testSetFeaturesToProvisionAsSetOfAllFeaturesOnRemoteSitesIfUnspecified_returnsFirstArgWhenFirstArgNonNull() throws Exception {
+ Set<FeatureVersionedIdentifier> input = new HashSet<FeatureVersionedIdentifier>();
+ input.add(new FeatureVersionedIdentifier("oink", "1.2.3"));
+ input.add(new FeatureVersionedIdentifier("moo", "2.3.4"));
+ input.add(new FeatureVersionedIdentifier("baah", "3.4.5"));
+
+ Set<FeatureVersionedIdentifier> result = testee.setFeaturesToProvisionToBeOfAllFeaturesOnRemoteSitesIfUnspecified(input, new FeatureReferenceTree());
+
+ assertTrue(input.equals(result));
+ }
+
+
+ // extractCorrectVersionsOfFeatureReferenceToProvision------------------------------------------------------------------------------------
+
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_whereFeatureToBeProvisionedHasVersion000_updateSitesHaveMultipleVersions_getsLatestVersions_andIsNotOrderDependent() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID, "0.0.0"));
+
+ FeatureVersionedIdentifier expectedFVI = new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID, "4.0.1");
+
+ // Ordered 400, 401
+ FeatureReferenceTree featuresOnUpdateSite = testee.getAllFeaturesFromUpdateSites(new URL[] { SITE400_URL, SITE401_URL });
+ List<IFeatureReference> result = testee.resolveVersionNumbersAsIFRList(featuresOnUpdateSite.getAllReferences(), featureIDsToProvision, true);
+ assertEquals(1, result.size());
+ assertEquals(expectedFVI, new FeatureVersionedIdentifier(result.get(0)));
+
+ // Ordered 401, 400 - this was causing an error
+ featuresOnUpdateSite = testee.getAllFeaturesFromUpdateSites(new URL[] { SITE401_URL, SITE400_URL });
+ result = testee.resolveVersionNumbersAsIFRList(featuresOnUpdateSite.getAllReferences(), featureIDsToProvision, true);
+ assertEquals(1, result.size());
+ assertEquals(expectedFVI, new FeatureVersionedIdentifier(result.get(0)));
+ }
+
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_featureToProvisionVersion000_UpdateSiteFeatureVersionNot000() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID, "0.0.0"));
+
+ FeatureReferenceTree featuresOnUpdateSite = testee.getAllFeaturesFromUpdateSites(new URL[] { SITE400_URL });
+
+ List<IFeatureReference> result = testee.resolveVersionNumbersAsIFRList(featuresOnUpdateSite.getAllReferences(), featureIDsToProvision, true);
+
+ assertEquals(1, result.size());
+ assertEquals(featuresOnUpdateSite.getAllReferences().get(0), result.get(0));
+ }
+
+
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_FeatureNotAvailableThrowsException() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier("a_feature_that_doesnt_exist on_the_site", "1.0.0"));
+
+ try {
+ testee.resolveVersionNumbersAsIFRList(new ArrayList<IFeatureReference>(), featureIDsToProvision, true);
+ fail("Should have failed");
+ } catch (InstallError e) {
+ // success
+ }
+ }
+
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_FeatureNotAvailableStillSucceeds() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier("a_feature_that_doesnt_exist on_the_site", "1.0.0"));
+
+ try {
+ testee.resolveVersionNumbersAsIFRList(new ArrayList<IFeatureReference>(), featureIDsToProvision, false);
+ // success
+ } catch (InstallError e) {
+ fail("Should not have failed");
+ }
+ }
+
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_featureToProvisionSameAsUpdateSiteFeatures_oneFeature() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID, "4.0.0"));
+ FeatureReferenceTree featuresOnUpdateSite = testee.getAllFeaturesFromUpdateSites(new URL[] { SITE400_URL });
+
+ List<IFeatureReference> result = testee.resolveVersionNumbersAsIFRList(featuresOnUpdateSite.getAllReferences(), featureIDsToProvision, true);
+
+ assertEquals(1, result.size());
+ assertEquals(featuresOnUpdateSite.getAllReferences().get(0), result.get(0));
+ }
+
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_featureToProvisionSameAsUpdateSiteFeatures_threeFeatures() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_A, "1.0.0"));
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_B, "1.0.0"));
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_C, "1.0.0"));
+ FeatureReferenceTree featuresOnUpdateSite = testee.getAllFeaturesFromUpdateSites(new URL[] { SITEABC_URL });
+
+ List<IFeatureReference> result = testee.resolveVersionNumbersAsIFRList(featuresOnUpdateSite.getAllReferences(), featureIDsToProvision, true);
+
+ assertEquals(3, result.size());
+
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_A);
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_B);
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_C);
+ }
+
+ // test where provisioning list is a subset of features on site
+ public void testExtractCorrectVersionsOfFeatureReferenceToProvision_featureToProvisionFewerThanUpdateSiteFeatures() throws Exception {
+ Set<FeatureVersionedIdentifier> featureIDsToProvision = new HashSet<FeatureVersionedIdentifier>();
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_A, "1.0.0"));
+ featureIDsToProvision.add(new FeatureVersionedIdentifier(FIXTURE_FEATURE_ID_C, "1.0.0"));
+ FeatureReferenceTree featuresOnUpdateSite = testee.getAllFeaturesFromUpdateSites(new URL[] { SITEABC_URL });
+
+ List<IFeatureReference> result = testee.resolveVersionNumbersAsIFRList(featuresOnUpdateSite.getAllReferences(), featureIDsToProvision, true);
+
+ assertEquals(2, result.size());
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_A);
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_C);
+ }
+
+ // getAllFeaturesFromUpdateSites-----------------------------------------------------------------------------------------------------
+
+ public void testGetAllFeaturesFromUpdateSite_AlternativeNameXML_returnsAllFeatures() throws Exception {
+ URL[] updateSites = new URL[] { FOO_URL};
+
+ List<IFeatureReference> result = testee.getAllFeaturesFromUpdateSites(updateSites).getAllReferences();
+
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_A);
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_B);
+ assertFeatureFoundIn(result, FIXTURE_FEATURE_ID_C);
+ }
+
+ public void testGetAllFeaturesFromUpdateSites_worksFor2Sites() throws Exception {
+ URL[] updateSites = new URL[] { SITE400_URL, SITE401_URL };
+
+ FeatureReferenceTree allFeaturesFromUpdateSites = testee.getAllFeaturesFromUpdateSites(updateSites);
+
+ assertEquals(2, allFeaturesFromUpdateSites.getAllReferences().size());
+
+ String[] resultVersions = extractVersionStringsAndSort(allFeaturesFromUpdateSites.getAllReferences());
+
+ assertEquals("org.eclipse.e4.enterprise.installer.test.fixture.feature_4.0.0", resultVersions[0]);
+ assertEquals("org.eclipse.e4.enterprise.installer.test.fixture.feature_4.0.1", resultVersions[1]);
+ }
+
+ private String[] extractVersionStringsAndSort(List<IFeatureReference> allFeaturesFromUpdateSites) throws CoreException {
+ String[] resultVersions = new String[allFeaturesFromUpdateSites.size()];
+ for (int i = 0; i < allFeaturesFromUpdateSites.size(); i++) {
+ resultVersions[i] = allFeaturesFromUpdateSites.get(i).getVersionedIdentifier().toString();
+ }
+ Arrays.sort(resultVersions);
+ return resultVersions;
+ }
+
+ public void testGetAllFeaturesFromUpdateSites_worksForSingleSite() throws Exception {
+ URL[] updateSites = new URL[] { SITE400_URL };
+
+ FeatureReferenceTree allFeaturesFromUpdateSites = testee.getAllFeaturesFromUpdateSites(updateSites);
+
+ assertEquals(1, allFeaturesFromUpdateSites.getAllReferences().size());
+
+ IFeatureReference featureReference = allFeaturesFromUpdateSites.getAllReferences().get(0);
+ assertEquals("org.eclipse.e4.enterprise.installer.test.fixture.feature_4.0.0", featureReference.getVersionedIdentifier().toString());
+ }
+
+ public static class StuntSiteManager extends InstallationSiteManager {
+ public StuntSiteManager(File downloadRootDir) {
+ super(downloadRootDir);
+ downloadRootDir.delete();
+ downloadRootDir.mkdirs();
+ }
+
+ int callCount = 0;
+
+ public int getCallCount() {
+ return callCount;
+ }
+
+ @Override
+ public void restartInitiated() throws IOException {
+ callCount++;
+ }
+ };
+
+ public void testInstallAndRollBackOnError_WhenNoRestartIsNeeded_RestartInitiatedNotInvoked() throws Exception {
+ InstallationSite currentSite = new StubInstallationSite(false);
+ File downloadRoot = File.createTempFile("any", "thing");
+ final StuntSiteManager stuntManager = new StuntSiteManager(downloadRoot);
+
+ testee.installAndRollBackOnError(stuntManager, currentSite, new ArrayList<IFeatureReference>());
+
+ assertEquals(0, stuntManager.getCallCount());
+ }
+
+ public void testIOExceptionInRestartManager_causesInstallRollbackAndInstallError() throws Exception {
+ final StubInstallationSite newSite = new StubInstallationSite(true);
+ StubInstallationSite currentSite = new StubInstallationSite(true);
+
+ // stubs
+ InstallationSiteManager stuntManager = new InstallationSiteManager(File.createTempFile("any", "thing")) {
+ @Override
+ public InstallationSite create() throws CoreException {
+ return newSite;
+ }
+ @Override
+ public void restartInitiated() throws IOException {
+ throw new IOException();
+ }
+ };
+
+ try {
+ testee.installAndRollBackOnError(stuntManager, currentSite, new ArrayList<IFeatureReference>());
+ fail();
+ } catch (InstallError e) {
+ // want to be here
+ }
+
+ /*
+ * the following expectations embody "rollback". There may be better ways to
+ * represent "rolling back" as currently we are saying the same thing in
+ * two places (code, test). Perhaps this could be done with a proper
+ * transaction of some kind.
+ *
+ * Really, what you want above is to know that
+ * "roll back has been initiated"; you probably don't need to care how
+ * the rollback works.
+ */
+ assertEquals(1, newSite.removeFromConfiguredSitesCount);
+ assertEquals(1, currentSite.addToConfiguredSitesCount);
+ }
+
+ // ------------------------------------------------------------------------------------
+
+ public void testResolveVersionNumbersAsVFISet_cannotFindFeatureReference_featuresMustBePresent_throwsInstallError() throws Exception {
+ FeatureReferenceTree tree = new FeatureReferenceTree();
+ Set<FeatureVersionedIdentifier> toProvision = new HashSet<FeatureVersionedIdentifier>();
+ toProvision.add(new FeatureVersionedIdentifier("org.eclipse.foo.bar", "1.1.0"));
+ toProvision.add(new FeatureVersionedIdentifier("org.eclipse.foo2.bar", "1.1.0"));
+
+ try {
+ testee.resolveVersionNumbersAsFVISet(tree, toProvision, true);
+ fail("Should have thrown an InstallError");
+ } catch (InstallError e) {
+ //success
+ }
+ }
+
+ public void testResolveVersionNumbersAsVFISet_cannotFindFeatureReference_returnsEmptySet() throws Exception {
+ FeatureReferenceTree tree = new FeatureReferenceTree();
+ Set<FeatureVersionedIdentifier> toProvision = new HashSet<FeatureVersionedIdentifier>();
+ toProvision.add(new FeatureVersionedIdentifier("org.eclipse.foo.bar", "1.1.0"));
+ toProvision.add(new FeatureVersionedIdentifier("org.eclipse.foo2.bar", "1.1.0"));
+
+ Set<FeatureVersionedIdentifier> result = testee.resolveVersionNumbersAsFVISet(tree, toProvision, false);
+ assertTrue("returned set should be empty", result.isEmpty());
+ }
+
+ // ------------------------------------------------------------------------------------
+
+ private class SpecialStubFeatureReference implements IFeatureReference {
+
+// This class smells fishy, there is another StubFeatureReference class that should
+// be used in this test class. The getOuterType() method is added automatically
+// by the IDE, probably because this is in an inner class.
+
+ public String name = "";
+ public boolean isLocal = false;
+
+ public SpecialStubFeatureReference(String name) {
+ this.name = name;
+ }
+
+ public SpecialStubFeatureReference(String name, boolean isLocal) {
+ this.name = name;
+ this.isLocal = isLocal;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + getOuterType().hashCode();
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SpecialStubFeatureReference other = (SpecialStubFeatureReference) obj;
+ if (!getOuterType().equals(other.getOuterType()))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ public IFeature getFeature() throws CoreException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public IFeature getFeature(IProgressMonitor monitor) throws CoreException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public ISite getSite() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public URL getURL() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public VersionedIdentifier getVersionedIdentifier() throws CoreException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean isPatch() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void setSite(ISite site) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setURL(URL url) throws CoreException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public Object getAdapter(Class adapter) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getNL() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getOS() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getOSArch() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getWS() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ private BundleUpdaterTest getOuterType() {
+ return BundleUpdaterTest.this;
+ }
+
+ }
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/FeatureReferenceMother.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/FeatureReferenceMother.java
new file mode 100644
index 0000000..d6b23be
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/FeatureReferenceMother.java
@@ -0,0 +1,48 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import org.eclipse.update.core.IFeatureReference;
+import org.eclipse.update.core.IIncludedFeatureReference;
+
+public class FeatureReferenceMother {
+
+ private static final String DEFAULT_ID = "id";
+ private static final String DEFAULT_VERSION = "0.0.1";
+
+ public static IFeatureReference createFeatureReferenceFromFVIWithChildren(FeatureVersionedIdentifier fvi, IIncludedFeatureReference... featureReference) {
+ StubFeatureReference stub = new StubFeatureReference(new StubFeature(featureReference));
+ stub.setVersionedIdentifier(fvi.featureID, fvi.featureVersion);
+ return stub;
+ }
+
+ public static IFeatureReference createFeatureReferenceFromFVIWithNoChildren(FeatureVersionedIdentifier fvi) {
+ StubFeatureReference stub = new StubFeatureReference(new StubFeature(new StubFeatureReference[]{}));
+ stub.setVersionedIdentifier(fvi.featureID, fvi.featureVersion);
+ return stub;
+ }
+
+ public static IIncludedFeatureReference createFeatureWithNoChildren() {
+ StubFeatureReference stubFeatureReference = new StubFeatureReference(new StubFeature(new StubFeatureReference[]{}));
+ stubFeatureReference.setVersionedIdentifier(DEFAULT_ID, DEFAULT_VERSION);
+ return stubFeatureReference;
+ }
+
+ public static IFeatureReference createFeatureWithChildren(IIncludedFeatureReference... featureReference) {
+ StubFeatureReference stubFeatureReference = new StubFeatureReference(new StubFeature(featureReference));
+ stubFeatureReference.setVersionedIdentifier(DEFAULT_ID, DEFAULT_VERSION);
+ return stubFeatureReference;
+ }
+
+
+
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/FeatureVersionedIdentifierTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/FeatureVersionedIdentifierTest.java
new file mode 100644
index 0000000..b43253c
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/FeatureVersionedIdentifierTest.java
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import org.eclipse.e4.enterprise.installer.FeatureVersionedIdentifier;
+
+import junit.framework.TestCase;
+
+public class FeatureVersionedIdentifierTest extends TestCase {
+
+ public void testConstructorValidatesVersionCorrectly() throws Exception {
+
+ //valid:
+ new FeatureVersionedIdentifier("name","1.2.3");
+
+ //invalid:
+ try{
+ FeatureVersionedIdentifier testee = new FeatureVersionedIdentifier("name","1.monkey.foo");
+ fail();
+ }
+ catch (IllegalArgumentException e) {
+ // want to be here
+ }
+ }
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/StubFeature.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/StubFeature.java
new file mode 100644
index 0000000..b060879
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/StubFeature.java
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.update.core.Feature;
+import org.eclipse.update.core.IIncludedFeatureReference;
+
+public class StubFeature extends Feature {
+
+ private final IIncludedFeatureReference[] includedFeatureReferences;
+
+ public StubFeature(IIncludedFeatureReference[] includedFeatureReferences) {
+ this.includedFeatureReferences = includedFeatureReferences;
+ }
+
+
+ @Override
+ public IIncludedFeatureReference[] getIncludedFeatureReferences()
+ throws CoreException {
+ return includedFeatureReferences;
+ }
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/StubFeatureReference.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/StubFeatureReference.java
new file mode 100644
index 0000000..24df063
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/StubFeatureReference.java
@@ -0,0 +1,74 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.update.core.IFeature;
+import org.eclipse.update.core.IncludedFeatureReference;
+import org.eclipse.update.core.VersionedIdentifier;
+
+public class StubFeatureReference extends IncludedFeatureReference {
+
+ private IFeature feature;
+ private VersionedIdentifier versionedIdentifier;
+
+ public StubFeatureReference(IFeature feature){
+ this.feature = feature;
+ }
+
+ public void setVersionedIdentifier(String id, String version){
+ versionedIdentifier = new VersionedIdentifier(id, version);
+ }
+
+ @Override
+ public VersionedIdentifier getVersionedIdentifier() {
+ return versionedIdentifier;
+ }
+
+ @Override
+ public IFeature getFeature() throws CoreException {
+ return feature;
+ }
+
+ @Override
+ public IFeature getFeature(IProgressMonitor monitor) throws CoreException {
+ return feature;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((feature == null) ? 0 : feature.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StubFeatureReference other = (StubFeatureReference) obj;
+ if (feature == null) {
+ if (other.feature != null)
+ return false;
+ } else if (!feature.equals(other.feature))
+ return false;
+ return true;
+ }
+
+
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/FeatureReferenceTreeTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/FeatureReferenceTreeTest.java
new file mode 100644
index 0000000..9e7d6e4
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/FeatureReferenceTreeTest.java
@@ -0,0 +1,181 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer.internal;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.e4.enterprise.installer.FeatureReferenceMother;
+import org.eclipse.e4.enterprise.installer.FeatureVersionedIdentifier;
+import org.eclipse.update.core.IFeatureReference;
+import org.eclipse.update.core.IIncludedFeatureReference;
+
+public class FeatureReferenceTreeTest extends TestCase {
+
+ private FeatureReferenceTree testee;
+
+ public void setUp() {
+ testee = new FeatureReferenceTree();
+ }
+
+ public void testGetDescendants_GivenKnownKeysWithManyDescendants_returnsAllDescendants() throws Exception {
+
+ // f1
+ // ...f11 *
+ // ......f111
+ // ......f112
+ // ......f113
+ // .........f1131
+ // ...f12
+ // ......f121
+ // ...f13
+ // f2 *
+ // ...f21
+ // ...f22
+ // ......f221
+ // ......f222
+
+ IIncludedFeatureReference f111 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f112 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f1131 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f113 = (IIncludedFeatureReference) FeatureReferenceMother.createFeatureWithChildren(f1131);
+
+ FeatureVersionedIdentifier keyf11 = new FeatureVersionedIdentifier("f11", "11.11.11");
+ IIncludedFeatureReference f11 = (IIncludedFeatureReference) FeatureReferenceMother.createFeatureReferenceFromFVIWithChildren(keyf11, f111, f112, f113);
+
+ IIncludedFeatureReference f121 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f12 = (IIncludedFeatureReference )FeatureReferenceMother.createFeatureWithChildren(f121);
+
+ IIncludedFeatureReference f13 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IFeatureReference f1 = FeatureReferenceMother.createFeatureWithChildren(f11, f12, f13);
+
+ IIncludedFeatureReference f21 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f221 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f222 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f22 = (IIncludedFeatureReference)FeatureReferenceMother.createFeatureWithChildren(f221, f222);
+
+ FeatureVersionedIdentifier keyf2 = new FeatureVersionedIdentifier("f2", "2.2.2");
+ IFeatureReference f2 = FeatureReferenceMother.createFeatureReferenceFromFVIWithChildren(keyf2, f21,f22);
+
+ testee.add(f1);
+ testee.add(f2);
+
+ List<IFeatureReference> descendantsF11 = testee.getFeatureReferenceWithDescendants(keyf11);
+ assertEquals(5, descendantsF11.size());
+ assertTrue(descendantsF11.contains(f11));
+ assertTrue(descendantsF11.contains(f111));
+ assertTrue(descendantsF11.contains(f112));
+ assertTrue(descendantsF11.contains(f113));
+ assertTrue(descendantsF11.contains(f1131));
+
+ List<IFeatureReference> descendantsF2 = testee.getFeatureReferenceWithDescendants(keyf2);
+ assertEquals(5, descendantsF2.size());
+ assertTrue(descendantsF2.contains(f2));
+ assertTrue(descendantsF2.contains(f21));
+ assertTrue(descendantsF2.contains(f22));
+ assertTrue(descendantsF2.contains(f221));
+ assertTrue(descendantsF2.contains(f222));
+ }
+
+ public void testGetDescendants_GivenKnownKeyWithManyDescendants_returnsAllDescendants() throws Exception {
+
+ IIncludedFeatureReference f4 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference f3 = (IIncludedFeatureReference) FeatureReferenceMother.createFeatureWithChildren(f4);
+
+ FeatureVersionedIdentifier key = new FeatureVersionedIdentifier("foo", "1.2.3");
+ IIncludedFeatureReference f2 = (IIncludedFeatureReference) FeatureReferenceMother.createFeatureReferenceFromFVIWithChildren(key, f3);
+ IIncludedFeatureReference f1 = (IIncludedFeatureReference) FeatureReferenceMother.createFeatureWithChildren(f2);
+
+ testee.add(f1);
+
+ List<IFeatureReference> descendants = testee.getFeatureReferenceWithDescendants(key);
+ assertEquals(3, descendants.size());
+ assertTrue(descendants.contains(f2));
+ assertTrue(descendants.contains(f3));
+ assertTrue(descendants.contains(f4));
+
+
+ }
+
+
+ public void testGetDescendants_GivenKnownKeyWithNoDescendants_returnsTheReference() throws Exception {
+ FeatureVersionedIdentifier key = new FeatureVersionedIdentifier("myFeature", "1.1.1");
+ IFeatureReference keyReference = FeatureReferenceMother.createFeatureReferenceFromFVIWithNoChildren(key);
+ testee.add(keyReference);
+
+ List<IFeatureReference> descendants = testee.getFeatureReferenceWithDescendants(key);
+
+ assertEquals(1, descendants.size());
+ assertEquals(keyReference, descendants.get(0));
+ }
+
+ public void testGetDescendants_GivenUnknownKey_returnsEmptyList() throws Exception {
+ List<IFeatureReference> descendants = testee.getFeatureReferenceWithDescendants(new FeatureVersionedIdentifier("missingfeature", "1.1.1"));
+ assertTrue(descendants.isEmpty());
+ }
+
+ public void testWhenOneReferenceWithChildrenOfChildren_returnsAllFeatureReference() throws Exception {
+
+ IIncludedFeatureReference grandChild1 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference grandChild2 = FeatureReferenceMother.createFeatureWithNoChildren();
+
+ IFeatureReference child1 = FeatureReferenceMother.createFeatureWithChildren(grandChild1, grandChild2);
+
+ IFeatureReference parent = FeatureReferenceMother.createFeatureWithChildren((IIncludedFeatureReference) child1);
+ testee.add(parent);
+
+ assertEquals(4, testee.getAllReferences().size());
+ assertTrue(testee.getAllReferences().contains(parent));
+ assertTrue(testee.getAllReferences().contains(child1));
+ assertTrue(testee.getAllReferences().contains(grandChild1));
+ assertTrue(testee.getAllReferences().contains(grandChild2));
+ }
+
+ public void testWhenOneReferenceWithMultipleChildren_returnsAll() throws Exception {
+ IIncludedFeatureReference child1 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference child2 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference child3 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IIncludedFeatureReference child4 = FeatureReferenceMother.createFeatureWithNoChildren();
+ IFeatureReference parent = FeatureReferenceMother.createFeatureWithChildren(child1, child2, child3, child4);
+ testee.add(parent);
+
+ assertEquals(5, testee.getAllReferences().size());
+ assertTrue(testee.getAllReferences().contains(parent));
+ assertTrue(testee.getAllReferences().contains(child1));
+ assertTrue(testee.getAllReferences().contains(child2));
+ assertTrue(testee.getAllReferences().contains(child3));
+ assertTrue(testee.getAllReferences().contains(child4));
+ }
+
+ public void testWhenOneReferenceWithOneChildHasBeenAdded_returnsBoth() throws Exception {
+ IIncludedFeatureReference child = FeatureReferenceMother.createFeatureWithNoChildren();
+ IFeatureReference parent = FeatureReferenceMother.createFeatureWithChildren(child);
+ testee.add(parent);
+
+ assertEquals(2, testee.getAllReferences().size());
+ assertTrue(testee.getAllReferences().contains(parent));
+ assertTrue(testee.getAllReferences().contains(child));
+ }
+
+ public void testWhenOneReferenceWithNoChildrenHasBeenAdded_OnlyOneReturned() throws Exception {
+ IFeatureReference expectedFeatureReference = FeatureReferenceMother.createFeatureWithNoChildren();
+ testee.add(expectedFeatureReference);
+
+ assertEquals(1, testee.getAllReferences().size());
+ assertEquals(expectedFeatureReference, testee.getAllReferences().get(0));
+ }
+
+ public void testWhenNoObjectsHaveBeenAdded_EmptyListReturned() {
+ assertTrue(testee.getAllReferences().isEmpty());
+ }
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/InstallationSiteBuilderTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/InstallationSiteBuilderTest.java
new file mode 100644
index 0000000..ee4cca4
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/InstallationSiteBuilderTest.java
@@ -0,0 +1,191 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer.internal.site;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSite;
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSiteManager;
+import org.eclipse.e4.enterprise.installer.internal.site.NullInstallationSite;
+import org.eclipse.e4.enterprise.installer.internal.site.UpdateManagerSite;
+import org.eclipse.update.configuration.IConfiguredSite;
+import org.eclipse.update.core.SiteManager;
+
+
+public class InstallationSiteBuilderTest extends TestCase {
+
+ private File downloadRootDir;
+ private InstallationSiteManager testee;
+
+ protected void setUp() throws Exception {
+ downloadRootDir = new File(System.getProperty("java.io.tmpdir") + "/obtest");
+ downloadRootDir.mkdir();
+ testee = new InstallationSiteManager(downloadRootDir);
+ }
+
+ protected void tearDown() throws Exception {
+ deleteDir(downloadRootDir);
+ }
+
+ public void testDirectoryNameFiltering() throws Exception {
+ File root = File.createTempFile("downloadroot", "temp");
+
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(InstallationSiteManager.CONFIG_SITE_DIR_DATE_NAME_FORMAT);
+ Date now = new Date();
+ String date = simpleDateFormat.format(now);
+
+ long nowLong = now.getTime();
+
+ File pruneMe1 = new File(root, "I should not be deleted");
+ File pruneMe2 = new File(root, "_I should not be deleted");
+ File pruneMe3 = new File(root, date + "something");
+ File pruneMe4 = new File(root, date.substring(0, 10));
+
+
+ File expected1 = new File(root, simpleDateFormat.format(now));
+ File expected2 = new File(root, simpleDateFormat.format(new Date(nowLong + 12345)));
+ File expected3 = new File(root, simpleDateFormat.format(new Date(nowLong + 123456)));
+ File expected4 = new File(root, simpleDateFormat.format(new Date(nowLong + 1234567)));
+
+ File[] testData = new File[] { expected4, pruneMe1, expected3, pruneMe2, expected2, pruneMe3, expected1 , pruneMe4};
+
+ File[] result = testee.filterOutFilesThatDoNotMatchExpectedFormat(testData);
+
+ assertTrue(arrayContains(result, expected1));
+ assertTrue(arrayContains(result, expected2));
+ assertTrue(arrayContains(result, expected3));
+ assertTrue(arrayContains(result, expected4));
+
+ assertFalse(arrayContains(result, pruneMe1));
+ assertFalse(arrayContains(result, pruneMe2));
+ assertFalse(arrayContains(result, pruneMe3));
+ assertFalse(arrayContains(result, pruneMe4));
+
+ assertEquals(4, result.length);
+ }
+
+ private boolean arrayContains(Object[] array, Object objectToLookFor) {
+ for (Object object : array) {
+ if (object == objectToLookFor) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void testFind_existingSitePresent_returnsInstallationSite() throws Exception {
+ InstallationSite expectedSite = testee.create();
+ expectedSite.addToConfiguredSites();
+
+ InstallationSite actualSite = testee.find();
+
+ assertEquals(expectedSite,actualSite);
+ expectedSite.removeFromConfiguredSites();
+ }
+
+ public void testFind_noSiteExists_returnsNullInstallationSite() throws Exception {
+ InstallationSite site = testee.find();
+ assertTrue(site instanceof NullInstallationSite);
+ }
+
+ public void testCreate_creatingNewSite_leavesExistingDirectoriesUntouched() throws Exception {
+ File testSubDir = new File(downloadRootDir,"rubbish");
+ testSubDir.mkdir();
+
+ testee.create();
+
+ File[] subdirs = downloadRootDir.listFiles();
+
+ assertEquals(2,subdirs.length);
+ assertTrue(testSubDir.exists());
+ }
+
+ public void testCreate_creatingNewSite_makesDirectoryUnderDownloadRootDir() throws Exception {
+ assertEquals(0,downloadRootDir.list().length);
+ testee.create();
+
+ File[] subdirs = downloadRootDir.listFiles();
+ assertEquals(1,subdirs.length);
+ assertTrue(subdirs[0].isDirectory());
+
+ File[] subsubdirs = subdirs[0].listFiles();
+ assertEquals(1,subsubdirs.length);
+ assertTrue(subsubdirs[0].isDirectory());
+ assertEquals("eclipse",subsubdirs[0].getName());
+ }
+
+ public void testFindCurrentDownloadSite_existingSitePresent_returnsSite() throws Exception {
+ UpdateManagerSite expectedSite = (UpdateManagerSite) testee.create();
+ expectedSite.addToConfiguredSites();
+ IConfiguredSite actualSite = testee.findCurrentDownloadSite(downloadRootDir, SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites());
+
+ expectedSite.removeFromConfiguredSites();
+ assertEquals(expectedSite.getConfiguredSite(),actualSite);
+ }
+
+ public void testFindCurrentDownloadSite_NoPreviouslyCreatedDownloadSites_returnsNullCurrentSite() throws Exception {
+ IConfiguredSite[] onlyEclipseConfiguredSites = SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites();
+ IConfiguredSite actual = testee.findCurrentDownloadSite(downloadRootDir,onlyEclipseConfiguredSites);
+ assertNull(actual);
+ }
+
+ public void testFindCurrentDownloadSite_NoConfiguredSites_returnsNullCurrentSite() throws Exception {
+ IConfiguredSite actual = testee.findCurrentDownloadSite(downloadRootDir,new IConfiguredSite[0]);
+ assertNull(actual);
+ }
+
+ public void testIsSubdirectory_SourceIsNull_returnsFalse() {
+ boolean isSubdirectory = testee.isSubdirectory(null, new File("c:\\windows"));
+ assertFalse(isSubdirectory);
+ }
+
+ public void testIsSubdirectory_TargetIsNull_returnsFalse() {
+ boolean isSubdirectory = testee.isSubdirectory(new File("c:\\windows"), null);
+ assertFalse(isSubdirectory);
+ }
+
+ public void testIsSubdirectory_TargetIsSubdirectoryOfSource_returnsTrue() {
+ boolean isSubdirectory = testee.isSubdirectory(new File("c:\\windows"), new File("C:\\windows/system"));
+ assertTrue(isSubdirectory);
+ }
+
+ public void testIsSubdirectory_TargetIsNotSubdirectoryOfSource_returnsFalse() {
+ boolean isSubdirectory = testee.isSubdirectory(new File("c:/windows"), new File("c:/temp"));
+ assertFalse(isSubdirectory);
+ }
+
+ public void testIsSubdirectory_TargetIsSameAsParentButWithTrailingSlash_returnsFalse() {
+ boolean isSubdirectory = testee.isSubdirectory(new File("c:/windows"), new File("c:/windows/"));
+ assertFalse(isSubdirectory);
+ }
+
+ public void testIsSubdirectory_TargetHasNoDirectorySeparator_returnsFalse() {
+ boolean isSubdirectory = testee.isSubdirectory(new File("c:/windows"), new File("c:/windowsrubbish"));
+ assertFalse(isSubdirectory);
+ }
+
+ private boolean deleteDir(File dir) {
+ if (dir.isDirectory()) {
+ String[] children = dir.list();
+ for (int i=0; i<children.length; i++) {
+ boolean success = deleteDir(new File(dir, children[i]));
+ if (!success) {
+ return false;
+ }
+ }
+ }
+ return dir.delete();
+ }
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/RestartManagerTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/RestartManagerTest.java
new file mode 100644
index 0000000..5bd29ba
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/RestartManagerTest.java
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer.internal.site;
+
+import junit.framework.TestCase;
+
+public class RestartManagerTest extends TestCase {
+
+ public RestartManagerTest(String name) {
+ super(name);
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testDummyTest() throws Exception {
+ // success: to keep JUnit from complaining that there are no tests here.
+ }
+
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/StubInstallationSite.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/StubInstallationSite.java
new file mode 100644
index 0000000..feae759
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/StubInstallationSite.java
@@ -0,0 +1,49 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer.internal.site;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.update.core.IFeatureReference;
+
+public class StubInstallationSite extends NullInstallationSite {
+
+ private final boolean installReturnValue;
+ public int addToConfiguredSitesCount = 0;
+ public int removeFromConfiguredSitesCount = 0;
+
+ public StubInstallationSite(boolean installReturnValue) {
+ this.installReturnValue = installReturnValue;
+
+ }
+
+ @Override
+ public boolean install(IFeatureReference[] updateSiteFeatures, IProgressMonitor progressMonitor) throws CoreException, InvocationTargetException {
+ return installReturnValue;
+ }
+
+ @Override
+ public void addToConfiguredSites() {
+ addToConfiguredSitesCount++;
+ }
+
+ @Override
+ public void removeFromConfiguredSites() {
+ removeFromConfiguredSitesCount++;
+ }
+
+
+
+
+
+}
diff --git a/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/UpdateManagerSiteTest.java b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/UpdateManagerSiteTest.java
new file mode 100644
index 0000000..7ec2a30
--- /dev/null
+++ b/tests/org.eclipse.e4.enterprise.installer.test/src/org/eclipse/e4/enterprise/installer/internal/site/UpdateManagerSiteTest.java
@@ -0,0 +1,250 @@
+/******************************************************************************
+ * Copyright (c) David Orme 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:
+ * David Orme - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.e4.enterprise.installer.internal.site;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.e4.enterprise.installer.InstallError;
+import org.eclipse.e4.enterprise.installer.internal.site.InstallationSiteManager;
+import org.eclipse.e4.enterprise.installer.internal.site.UpdateManagerSite;
+import org.eclipse.e4.enterprise.installer.internal.site.UpdateManagerSite.UpdateSiteFeatureXML;
+import org.eclipse.e4.ui.test.utils.FixturesLocation;
+import org.eclipse.e4.ui.test.utils.TestCaseX;
+import org.eclipse.update.core.IFeature;
+import org.eclipse.update.core.IFeatureReference;
+import org.eclipse.update.core.ISite;
+import org.eclipse.update.core.ISiteFeatureReference;
+import org.eclipse.update.core.SiteManager;
+import org.eclipse.update.core.VersionedIdentifier;
+
+
+
+public class UpdateManagerSiteTest extends TestCaseX {
+ private UpdateManagerSite testee;
+ private File downloadRootDir;
+
+ protected void setUp() throws Exception {
+ downloadRootDir = new File(System.getProperty("java.io.tmpdir") + "/obtest");
+ testee = (UpdateManagerSite) new InstallationSiteManager(downloadRootDir).create();
+ }
+
+ // downloadToUpdateSet--------------------------------------------------------------------------------------------
+ private static final String SITE400_FIXTURE = FixturesLocation.FIXTURE_ROOT + "/site_4.0.0/site.xml";
+
+ public void testConvertIntoUpdateSite_CheckThatUpdateSiteContainsSameFeaturesAsConfigSiteItIsGeneratedFrom() throws Exception {
+ UpdateManagerSite testee = createTemporaryDownloadSiteWithDownloadedContents();
+ try {
+ testee.convertIntoUpdateSite();
+ assertUpdateSiteHasIdenticalFeaturesAsDownloadSite(testee);
+ } finally {
+ testee.removeFromConfiguredSites(); // Make sure we don't leave Eclipse in a wierd state
+ }
+ }
+
+ private void assertUpdateSiteHasIdenticalFeaturesAsDownloadSite(
+ UpdateManagerSite testee) throws CoreException, InstallError {
+ URL url = testee.getConfiguredSite().getSite().getURL();
+ IFeatureReference[] featureReferences = SiteManager.getSite(url, false, new NullProgressMonitor()).getFeatureReferences();
+
+ List<IFeatureReference> featureReferencesList = Arrays.asList(featureReferences);
+
+ assertTrue("Update site should have identical Features as download site",
+ testee.hasIdenticalFeatures(featureReferencesList));
+ }
+
+ private UpdateManagerSite createTemporaryDownloadSiteWithDownloadedContents() throws IOException,
+ CoreException, MalformedURLException, InvocationTargetException
+ {
+ File tempDir = createTempDir("1BenchTest-"); // start w/ numeral so that it sorts to the top
+ System.out.println("Temp update site dir = " + tempDir.getAbsolutePath()); // for debugging purposes
+
+ InstallationSiteManager siteBuilder = new InstallationSiteManager(tempDir);
+ UpdateManagerSite temporaryDownloadSite = (UpdateManagerSite) siteBuilder.create();
+ temporaryDownloadSite.addToConfiguredSites();
+
+ ISiteFeatureReference[] remoteFeatures = SiteManager.getSite(
+ new URL(SITE400_FIXTURE), false, new NullProgressMonitor())
+ .getFeatureReferences();
+ temporaryDownloadSite.install(remoteFeatures, new NullProgressMonitor());
+
+ return temporaryDownloadSite;
+ }
+
+ // computeUpdateSiteFeatureData--------------------------------------------------------------------------------
+
+ public void testComputeUpdateSiteFeatureData_emptyInput_resultsInEmptyOutput() throws Exception {
+ UpdateSiteFeatureXML[] result = testee.computeUpdateSiteFeatureData(
+ new IFeatureReference[] {});
+ assertEquals(0, result.length);
+ }
+
+ public void testComputeUpdateSiteFeatureData_indexesMatch() throws Exception {
+ IFeatureReference[] input = new IFeatureReference[] {
+ newFeatureRef("file:///c:/path/to/features/featurefolder/",
+ "com.foo.feature.id", "1.0.0"),
+ newFeatureRef("file:///c:/path/to/features/featurefolder/",
+ "com.foo.feature.id", "1.0.0"),
+ };
+
+ UpdateSiteFeatureXML[] result = testee.computeUpdateSiteFeatureData(input);
+
+ assertEquals(2, result.length);
+ }
+
+ // computeFeatureXMLData---------------------------------------------------------------------------------------
+
+ public void testComputeFeatureXMLData_dataMatches() throws Exception {
+ IFeatureReference input = newFeatureRef(
+ "file:///c:/path/to/features/featurefolder/",
+ "com.foo.feature.id", "1.0.0");
+
+ UpdateSiteFeatureXML result = testee.computeFeatureXMLData(input);
+
+ assertEquals("features/featurefolder.jar", result.jarRelativePath);
+ assertEquals("com.foo.feature.id", result.id);
+ assertEquals("1.0.0", result.version);
+ }
+
+ // areFeaturesDifferent?---------------------------------------------------------------------------------------
+
+ public void testAreFeaturesDifferent_catchesListsInDifferentOrders(){
+ List<String> list1 = new ArrayList<String>();
+ List<String> list2 = new LinkedList<String>();
+
+ list1.add("thing 1");
+ list1.add("thing 2");
+ list1.add("thing 3");
+
+ list2.add("thing 3");
+ list2.add("thing 1");
+ list2.add("thing 2");
+
+ assertFalse(testee.areFeaturesDifferent(list1, list2));
+ }
+
+ public void testAreFeaturesDifferent_matchesSimpleDuplicate(){
+ List<String> list1 = new ArrayList<String>();
+ List<String> list2 = new LinkedList<String>();
+
+ list1.add("the same thing");
+ list2.add("the same thing");
+
+ assertFalse(testee.areFeaturesDifferent(list1, list2));
+ }
+
+ public void testAreFeaturesDifferent_catchesDifferentNoEmptyLists(){
+ List<String> list1 = new ArrayList<String>();
+ List<String> list2 = new LinkedList<String>();
+
+ list1.add("something");
+ list1.add("somethingelse");
+
+ assertTrue(testee.areFeaturesDifferent(list1, list2));
+ }
+
+ public void testAreFeaturesDifferent_catchesDifferentListAndEmptyList(){
+ List<String> list1 = new ArrayList<String>();
+ List<String> list2 = new LinkedList<String>();
+
+ list1.add("something");
+
+ assertTrue(testee.areFeaturesDifferent(list1, list2));
+ }
+
+ public void testAreFeaturesDifferent_matchesEmptyLists(){
+ List<String> empty1 = new ArrayList<String>();
+ List<String> empty2 = new LinkedList<String>();
+
+ assertFalse(testee.areFeaturesDifferent(empty1, empty2));
+ }
+
+ //--------------------------------------------------------------------------------
+
+ private IFeatureReference newFeatureRef(final String url, final String id, final String version) {
+ return new IFeatureReference() {
+
+ public IFeature getFeature() throws CoreException {
+ return null;
+ }
+
+ public IFeature getFeature(IProgressMonitor monitor)
+ throws CoreException {
+ return null;
+ }
+
+ public String getName() {
+ return null;
+ }
+
+ public ISite getSite() {
+ return null;
+ }
+
+ public URL getURL() {
+ URL result = null;
+ try {
+ result = new URL(url);
+ } catch (MalformedURLException e) {
+ fail();
+ }
+ return result;
+ }
+
+ public VersionedIdentifier getVersionedIdentifier()
+ throws CoreException {
+ return new VersionedIdentifier(id, version);
+ }
+
+ public boolean isPatch() {
+ return false;
+ }
+
+ public void setSite(ISite site) {
+ }
+
+ public void setURL(URL url) throws CoreException {
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public String getNL() {
+ return null;
+ }
+
+ public String getOS() {
+ return null;
+ }
+
+ public String getOSArch() {
+ return null;
+ }
+
+ public String getWS() {
+ return null;
+ }};
+ }
+
+
+}