Bug 535463 - Fixes for running tests on Java 9

testContextFinderEmptyGetResources - converted this to a unit test for
BundleLoader.compoundEnumerations() method to take null parameters.
Reproducing the situation from the original testcase is not obvious,
decided to instead directly unit test the compondEnumerations to ensure
it can take null parameters without NPEs.

testContextFinderGetResource - moved this to SystemBundleTests which
allows us to set the parent class loader of the ContextFinder in order
to allow it to search resources in the framework instead of from the VM.

Change-Id: I9187dbda840afc1e8d7b17034854c770b7d16708
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF
index e3d6680..42400e6 100644
--- a/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.osgi.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Core OSGi Tests
 Bundle-SymbolicName: org.eclipse.osgi.tests;singleton:=true
-Bundle-Version: 3.13.0.qualifier
+Bundle-Version: 3.13.100.qualifier
 Bundle-Vendor: Eclipse.org
 Bundle-Localization: plugin
 Require-Bundle: 
diff --git a/bundles/org.eclipse.osgi.tests/build.properties b/bundles/org.eclipse.osgi.tests/build.properties
index d9b008e..73a1df8 100644
--- a/bundles/org.eclipse.osgi.tests/build.properties
+++ b/bundles/org.eclipse.osgi.tests/build.properties
@@ -15,7 +15,8 @@
                META-INF/,\
                test.xml,\
                bundle_tests/*.jar,\
-               plugin.xml
+               plugin.xml,\
+               profile.list
 
 source.bundle_tests/test.jar = bundles_src/test/
 manifest.bundle_tests/test.jar = META-INF/MANIFEST.MF
@@ -235,13 +236,6 @@
 manifest.bundle_tests/test.bug375784.jar = META-INF/MANIFEST.MF
 source.bundle_tests/storage.hooks.a.jar = bundles_src/storage.hooks.a/
 manifest.bundle_tests/storage.hooks.a.jar = META-INF/MANIFEST.MF
-source.bundle_tests/test.plugins.a.jar = bundles_src/test.plugins.a/
-source.bundle_tests/test.plugins.b.jar = bundles_src/test.plugins.b/
-source.bundle_tests/test.plugins.c.jar = bundles_src/test.plugins.c/
-source.bundle_tests/test.plugins.d.jar = bundles_src/test.plugins.d/
-source.bundle_tests/test.plugins.e.jar = bundles_src/test.plugins.e/
-source.bundle_tests/test.plugins.f.jar = bundles_src/test.plugins.f/
-source.bundle_tests/test.plugins.g.jar = bundles_src/test.plugins.g/
 source.bundle_tests/test.bug412228.jar = bundles_src/test.bug412228/
 manifest.bundle_tests/test.bug412228.jar = META-INF/MANIFEST.MF
 source.bundle_tests/test.uninstall.start1.jar = bundles_src/test.uninstall.start1/
diff --git a/bundles/org.eclipse.osgi.tests/pom.xml b/bundles/org.eclipse.osgi.tests/pom.xml
index 3ed38f5..1ecbb96 100644
--- a/bundles/org.eclipse.osgi.tests/pom.xml
+++ b/bundles/org.eclipse.osgi.tests/pom.xml
@@ -19,7 +19,7 @@
   </parent>
   <groupId>org.eclipse.osgi</groupId>
   <artifactId>org.eclipse.osgi.tests</artifactId>
-  <version>3.13.0-SNAPSHOT</version>
+  <version>3.13.100-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
 
   <properties>
diff --git a/bundles/org.eclipse.osgi.tests/profile.list b/bundles/org.eclipse.osgi.tests/profile.list
new file mode 100644
index 0000000..b250cc5
--- /dev/null
+++ b/bundles/org.eclipse.osgi.tests/profile.list
@@ -0,0 +1,28 @@
+###############################################################################
+# Copyright (c) 2003, 2013 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
+###############################################################################
+java.profiles = \
+ JavaSE-9.profile,\
+ JavaSE-1.8.profile,\
+ JavaSE-1.7.profile,\
+ JavaSE-1.6.profile,\
+ J2SE-1.5.profile,\
+ J2SE-1.4.profile,\
+ J2SE-1.3.profile,\
+ J2SE-1.2.profile,\
+ JRE-1.1.profile,\
+ JavaSE_compact1-1.8.profile,\
+ JavaSE_compact2-1.8.profile,\
+ JavaSE_compact3-1.8.profile,\
+ CDC-1.1_Foundation-1.1.profile,\
+ CDC-1.0_Foundation-1.0.profile,\
+ OSGi_Minimum-1.0.profile,\
+ OSGi_Minimum-1.1.profile,\
+ OSGi_Minimum-1.2.profile
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
index 32088dd..5bbc8d2 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ClassLoadingBundleTests.java
@@ -32,16 +32,11 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
-import javax.jws.WebService;
-import javax.xml.namespace.QName;
-import javax.xml.ws.Endpoint;
-import javax.xml.ws.Service;
 import junit.framework.AssertionFailedError;
 import junit.framework.Test;
 import junit.framework.TestSuite;
+import org.eclipse.osgi.internal.loader.BundleLoader;
 import org.eclipse.osgi.internal.loader.ModuleClassLoader;
 import org.eclipse.osgi.tests.OSGiTestsActivator;
 import org.osgi.framework.Bundle;
@@ -52,7 +47,6 @@
 import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
@@ -1735,76 +1729,22 @@
 		global.loadClass("test.bug438904.frag.Test2");
 	}
 
-	public void testContextFinderGetResource() throws IOException, InvalidSyntaxException {
-		// get the context finder explicitly to test incase the thread context class loader has changed
-		ClassLoader contextFinder = getContext().getService(getContext().getServiceReferences(ClassLoader.class, "(equinox.classloader.type=contextClassLoader)").iterator().next());
-		// Using a resource we know is in java 8.
-		String resource = "META-INF/services/javax.print.PrintServiceLookup";
-		URL systemURL = ClassLoader.getSystemClassLoader().getResource(resource);
-		assertNotNull("Did not find a parent resource: " + resource, systemURL);
-		//should return the file defined in test bundle.
-		URL url = contextFinder.getResource(resource);
-		//the first element should be the file define in this bundle.
-		List<URL> urls = Collections.list(contextFinder.getResources(resource));
-		// make sure we have a resource located in the parent
-		assertTrue("Did not find a parent resource: " + urls, urls.size() > 1);
-		//assert failed as it return the one defined in parent class.
-		assertEquals(url.toExternalForm(), urls.get(0).toExternalForm());
-	}
+	public void testUnitTestForcompoundEnumerations() {
+		Enumeration<Object> result = BundleLoader.compoundEnumerations(null, Collections.emptyEnumeration());
+		assertNotNull("Null result.", result);
+		assertFalse("Found elements.", result.hasMoreElements());
 
-	@WebService(endpointInterface = "org.eclipse.osgi.tests.bundles.TestService")
-	public static class TestServiceImpl implements TestService {
+		result = BundleLoader.compoundEnumerations(Collections.emptyEnumeration(), null);
+		assertNotNull("Null result.", result);
+		assertFalse("Found elements.", result.hasMoreElements());
 
-		@Override
-		public String hello(final String name) {
-			return "Hello " + name;
-		}
+		result = BundleLoader.compoundEnumerations(null, null);
+		assertNotNull("Null result.", result);
+		assertFalse("Found elements.", result.hasMoreElements());
 
-	}
-
-	/*
-	 * This test depends on the behavior of the JVM Endpoint implementation to use
-	 * the context class loader to try and find resources using an executor.
-	 * This is important because it causes the thread stack to have NO classes
-	 * loaded by a bundle class loader.  This causes a condition that would
-	 * make ContextFinder.getResources to return null
-	 */
-	public void testContextFinderEmptyGetResources() throws Exception {
-		// get the context finder explicitly to test incase the thread context class loader has changed
-		ClassLoader contextFinder = getContext().getService(getContext().getServiceReferences(ClassLoader.class, "(equinox.classloader.type=contextClassLoader)").iterator().next());
-		ClassLoader previousTCCL = Thread.currentThread().getContextClassLoader();
-		Thread.currentThread().setContextClassLoader(contextFinder);
-		ExecutorService pool = null;
-		try {
-			pool = Executors.newFixedThreadPool(3);
-
-			final String address = "http://localhost:23512/service";
-
-			final WebService annotation = TestService.class.getAnnotation(WebService.class);
-			final String namespaceURI = annotation.serviceName();
-			final String localPart = annotation.targetNamespace();
-			final QName serviceName = new QName(namespaceURI, localPart);
-
-			final TestServiceImpl tsi = new TestServiceImpl();
-			final Endpoint endpoint = Endpoint.create(tsi);
-			final HashMap<String, Object> props = new HashMap<String, Object>();
-			props.put(Endpoint.WSDL_SERVICE, serviceName);
-
-			endpoint.setProperties(props);
-			endpoint.setExecutor(pool);
-			endpoint.publish(address);
-			final URL wsdlURL = new URL(address + "?wsdl");
-			final Service s = Service.create(wsdlURL, serviceName);
-			assertNotNull("Service is null.", s);
-			final TestService port = s.getPort(TestService.class);
-
-			assertEquals("Wrong result.", "Hello World", port.hello("World"));
-		} finally {
-			Thread.currentThread().setContextClassLoader(previousTCCL);
-			if (pool != null) {
-				pool.shutdown();
-			}
-		}
+		result = BundleLoader.compoundEnumerations(Collections.emptyEnumeration(), Collections.emptyEnumeration());
+		assertNotNull("Null result.", result);
+		assertFalse("Found elements.", result.hasMoreElements());
 	}
 
 	public void testBundleClassLoaderEmptyGetResources() throws Exception {
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
index a294d54..df800f4 100755
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
@@ -3763,4 +3763,43 @@
 		}
 	}
 
+	public void testContextFinderGetResource() throws IOException, InvalidSyntaxException {
+		File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$
+		Map configuration = new HashMap();
+		configuration.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath());
+		configuration.put(EquinoxConfiguration.PROP_CONTEXTCLASSLOADER_PARENT, EquinoxConfiguration.CONTEXTCLASSLOADER_PARENT_FWK);
+		Equinox equinox = null;
+		try {
+			equinox = new Equinox(configuration);
+			equinox.init();
+			BundleContext bc = equinox.getBundleContext();
+			// get the context finder explicitly to test
+			ClassLoader contextFinder = bc.getService(bc.getServiceReferences(ClassLoader.class, "(equinox.classloader.type=contextClassLoader)").iterator().next());
+			// Using a resource we know is in the framework
+			String resource = "profile.list";
+			URL fwkURL = Bundle.class.getClassLoader().getResource(resource);
+			assertNotNull("Did not find a parent resource: " + resource, fwkURL);
+			// should return the file defined in test bundle.
+			URL url = contextFinder.getResource(resource);
+			// the first element should be the file define in this bundle.
+			List<URL> urls = Collections.list(contextFinder.getResources(resource));
+			// make sure we have a resource located in the parent
+			assertTrue("Did not find a parent resource: " + urls, urls.size() > 1);
+			// assert failed as it return the one defined in parent class.
+			assertEquals(url.toExternalForm(), urls.get(0).toExternalForm());
+		} catch (BundleException e) {
+			fail("Failed init", e);
+		} finally {
+			try {
+				if (equinox != null) {
+					equinox.stop();
+					equinox.waitForStop(1000);
+				}
+			} catch (BundleException e) {
+				fail("Failed to stop framework.", e);
+			} catch (InterruptedException e) {
+				fail("Failed to stop framework.", e);
+			}
+		}
+	}
 }
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/TestService.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/TestService.java
deleted file mode 100644
index c3d2ea3..0000000
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/TestService.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 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.osgi.tests.bundles;
-
-import javax.jws.WebService;
-
-@WebService(serviceName = "Foo", targetNamespace = "http://bar")
-public interface TestService {
-	String hello(String name);
-}
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/AllFrameworkHookTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/AllFrameworkHookTests.java
index 7f46fee..877062a 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/AllFrameworkHookTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/AllFrameworkHookTests.java
@@ -19,6 +19,7 @@
 		suite.addTest(new TestSuite(StorageHookTests.class));
 		suite.addTest(new TestSuite(ClassLoaderHookTests.class));
 		suite.addTest(new TestSuite(BundleFileWrapperFactoryHookTests.class));
+		suite.addTest(new TestSuite(ContextFinderTests.class));
 		return suite;
 	}
 }
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/ContextFinderTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/ContextFinderTests.java
new file mode 100644
index 0000000..8521eb6
--- /dev/null
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/ContextFinderTests.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2017 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.osgi.tests.hooks.framework;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osgi.tests.OSGiTestsActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.launch.Framework;
+
+public class ContextFinderTests extends AbstractFrameworkHookTests {
+
+	private Map<String, String> configuration;
+	private Framework framework;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		File file = OSGiTestsActivator.getContext().getDataFile(getName());
+		configuration = new HashMap<String, String>();
+		configuration.put(Constants.FRAMEWORK_STORAGE, file.getAbsolutePath());
+		framework = createFramework(configuration);
+		initAndStart(framework);
+	}
+
+	protected void tearDown() throws Exception {
+		stopQuietly(framework);
+		super.tearDown();
+	}
+
+	public void testContextClassLoaderNullLocal() throws InvalidSyntaxException, IOException {
+		BundleContext bc = framework.getBundleContext();
+		ClassLoader contextFinder = bc.getService(bc.getServiceReferences(ClassLoader.class, "(equinox.classloader.type=contextClassLoader)").iterator().next());
+		Enumeration<URL> result = contextFinder.getResources("does/not/exist.txt");
+		assertNotNull("Null result.", result);
+		assertFalse("Found unexpected result", result.hasMoreElements());
+	}
+
+}