diff options
Diffstat (limited to 'bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/MultiReleaseJarTests.java')
-rw-r--r-- | bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/MultiReleaseJarTests.java | 832 |
1 files changed, 832 insertions, 0 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/MultiReleaseJarTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/MultiReleaseJarTests.java new file mode 100644 index 000000000..5d9e8f82a --- /dev/null +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/MultiReleaseJarTests.java @@ -0,0 +1,832 @@ +/******************************************************************************* + * Copyright (c) 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.bundles; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.jar.Attributes; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.eclipse.osgi.launch.Equinox; +import org.eclipse.osgi.storage.StorageUtil; +import org.eclipse.osgi.tests.OSGiTestsActivator; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; +import org.osgi.framework.Constants; +import org.osgi.framework.namespace.PackageNamespace; +import org.osgi.framework.wiring.BundleRequirement; +import org.osgi.framework.wiring.BundleRevision; +import org.osgi.framework.wiring.BundleWire; +import org.osgi.framework.wiring.BundleWiring; +import org.osgi.resource.Namespace; + +public class MultiReleaseJarTests extends AbstractBundleTests { + + private final static String RNF = "RNF"; + private final static String CNFE = "CNFE"; + + public static Test suite() { + return new TestSuite(MultiReleaseJarTests.class); + } + + private File mrJarBundle; + private String originalSpecVersion; + + @Override + protected void setUp() throws Exception { + super.setUp(); + mrJarBundle = createMRJarBundle(); + originalSpecVersion = System.getProperty("java.specification.version"); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + System.setProperty("java.specification.version", originalSpecVersion); + } + + private static File createMRJarBundle() throws BundleException, IOException { + BundleContext bc = OSGiTestsActivator.getContext(); + File mrJarBundle = bc.getDataFile("mrJarBundleTest.jar"); + if (mrJarBundle.exists()) { + return mrJarBundle; + } + File classpathMrJar = bc.getDataFile("classpathMrJar.jar"); + + Bundle base = installer.installBundle("mrBundleInputBase"); + + Map<String, String> bundleHeaders = new LinkedHashMap<String, String>(); + bundleHeaders.put(Constants.BUNDLE_MANIFESTVERSION, "2"); + bundleHeaders.put(Constants.BUNDLE_SYMBOLICNAME, "mrBundle"); + bundleHeaders.put(Constants.BUNDLE_VERSION, "1.0.0"); + bundleHeaders.put(Constants.IMPORT_PACKAGE, "pkgbase"); + bundleHeaders.put(Constants.REQUIRE_CAPABILITY, "capbase"); + bundleHeaders.put(Constants.EXPORT_PACKAGE, "pkgbase, pkg8, pkg9, pkg10, pkg11"); + bundleHeaders.put(Constants.PROVIDE_CAPABILITY, "capbase, cap8, cap9, cap10, cap11"); + bundleHeaders.put(Constants.BUNDLE_CLASSPATH, "., " + classpathMrJar.getName() + ", classPathDir"); + + Map<String, byte[]> bundleEntries = new LinkedHashMap<String, byte[]>(); + bundleEntries.put("multi/", null); + bundleEntries.put("multi/release/", null); + bundleEntries.put("multi/release/test/", null); + bundleEntries.put("multi/release/test/TestClassBase.class", getBytes("multi/release/test/TestClassBase.class", base)); + bundleEntries.put("multi/release/test/TestClass8.class", getBytes("multi/release/test/TestClass8.class", base)); + bundleEntries.put("multi/release/test/TestClass9.class", getBytes("multi/release/test/TestClass9.class", base)); + bundleEntries.put("multi/release/test/TestClass10.class", getBytes("multi/release/test/TestClass10.class", base)); + bundleEntries.put("multi/release/test/TestClass11.class", getBytes("multi/release/test/TestClass11.class", base)); + bundleEntries.put("multi/release/test/testResourceBase.txt", getBytes("multi/release/test/testResourceBase.txt", base)); + bundleEntries.put("multi/release/test/testResource8.txt", getBytes("multi/release/test/testResource8.txt", base)); + bundleEntries.put("multi/release/test/testResource9.txt", getBytes("multi/release/test/testResource9.txt", base)); + bundleEntries.put("multi/release/test/testResource10.txt", getBytes("multi/release/test/testResource10.txt", base)); + bundleEntries.put("multi/release/test/testResource11.txt", getBytes("multi/release/test/testResource11.txt", base)); + + bundleEntries.put("META-INF/versions/", null); + bundleEntries.put("META-INF/versions/8/", null); + bundleEntries.put("META-INF/versions/8/multi/", null); + bundleEntries.put("META-INF/versions/8/multi/release/", null); + bundleEntries.put("META-INF/versions/8/multi/release/test/", null); + bundleEntries.put("META-INF/versions/8/multi/release/test/TestClass8.class", getBytes("multi/release/test/TestClass8.class", base, new byte[] {'0', '8'})); + bundleEntries.put("META-INF/versions/8/multi/release/test/TestClassAdd8.class", getBytes("multi/release/test/TestClassAdd8.class", base)); + bundleEntries.put("META-INF/versions/8/multi/release/test/testResource8.txt", getBytes("multi/release/test/testResource8.txt", base, new byte[] {'0', '8'})); + bundleEntries.put("META-INF/versions/8/multi/release/test/testResourceAdd8.txt", getBytes("multi/release/test/testResourceAdd8.txt", base)); + bundleEntries.put("META-INF/versions/9/", null); + bundleEntries.put("META-INF/versions/9/multi/", null); + bundleEntries.put("META-INF/versions/9/multi/release/", null); + bundleEntries.put("META-INF/versions/9/multi/release/test/", null); + bundleEntries.put("META-INF/versions/9/multi/release/test/TestClass9.class", getBytes("multi/release/test/TestClass9.class", base, new byte[] {'0', '9'})); + bundleEntries.put("META-INF/versions/9/multi/release/test/TestClassAdd9.class", getBytes("multi/release/test/TestClassAdd9.class", base)); + bundleEntries.put("META-INF/versions/9/multi/release/test/testResource9.txt", getBytes("multi/release/test/testResource9.txt", base, new byte[] {'0', '9'})); + bundleEntries.put("META-INF/versions/9/multi/release/test/testResourceAdd9.txt", getBytes("multi/release/test/testResourceAdd9.txt", base)); + bundleEntries.put("META-INF/versions/10/", null); + bundleEntries.put("META-INF/versions/10/multi/", null); + bundleEntries.put("META-INF/versions/10/multi/release/", null); + bundleEntries.put("META-INF/versions/10/multi/release/test/", null); + bundleEntries.put("META-INF/versions/10/multi/release/test/TestClass10.class", getBytes("multi/release/test/TestClass10.class", base, new byte[] {'1', '0'})); + bundleEntries.put("META-INF/versions/10/multi/release/test/TestClassAdd10.class", getBytes("multi/release/test/TestClassAdd10.class", base)); + bundleEntries.put("META-INF/versions/10/multi/release/test/testResource10.txt", getBytes("multi/release/test/testResource10.txt", base, new byte[] {'1', '0'})); + bundleEntries.put("META-INF/versions/10/multi/release/test/testResourceAdd10.txt", getBytes("multi/release/test/testResourceAdd10.txt", base)); + bundleEntries.put("META-INF/versions/11/", null); + bundleEntries.put("META-INF/versions/11/multi/", null); + bundleEntries.put("META-INF/versions/11/multi/release/", null); + bundleEntries.put("META-INF/versions/11/multi/release/test/", null); + bundleEntries.put("META-INF/versions/11/multi/release/test/TestClass11.class", getBytes("multi/release/test/TestClass11.class", base, new byte[] {'1', '1'})); + bundleEntries.put("META-INF/versions/11/multi/release/test/TestClassAdd11.class", getBytes("multi/release/test/TestClassAdd11.class", base)); + bundleEntries.put("META-INF/versions/11/multi/release/test/testResource11.txt", getBytes("multi/release/test/testResource11.txt", base, new byte[] {'1', '1'})); + bundleEntries.put("META-INF/versions/11/multi/release/test/testResourceAdd11.txt", getBytes("multi/release/test/testResourceAdd11.txt", base)); + + bundleEntries.put("META-INF/versions/8/OSGI-INF/", null); + bundleEntries.put("META-INF/versions/8/OSGI-INF/MANIFEST.MF", getBytes("manifests/manifest8.mf", base)); + bundleEntries.put("META-INF/versions/9/OSGI-INF/", null); + bundleEntries.put("META-INF/versions/9/OSGI-INF/MANIFEST.MF", getBytes("manifests/manifest9.mf", base)); + bundleEntries.put("META-INF/versions/10/OSGI-INF/", null); + bundleEntries.put("META-INF/versions/10/OSGI-INF/MANIFEST.MF", getBytes("manifests/manifest10.mf", base)); + bundleEntries.put("META-INF/versions/11/OSGI-INF/", null); + bundleEntries.put("META-INF/versions/11/OSGI-INF/MANIFEST.MF", getBytes("manifests/manifest11.mf", base)); + + Map<String, byte[]> classPathJarEntries = new LinkedHashMap<String, byte[]>(); + classPathJarEntries.put("multi/", null); + classPathJarEntries.put("multi/release/", null); + classPathJarEntries.put("multi/release/test/", null); + classPathJarEntries.put("multi/release/test/sub/", null); + classPathJarEntries.put("multi/release/test/sub/TestClassBase.class", getBytes("multi/release/test/sub/TestClassBase.class", base)); + classPathJarEntries.put("multi/release/test/sub/TestClass8.class", getBytes("multi/release/test/sub/TestClass8.class", base)); + classPathJarEntries.put("multi/release/test/sub/TestClass9.class", getBytes("multi/release/test/sub/TestClass9.class", base)); + classPathJarEntries.put("multi/release/test/sub/TestClass10.class", getBytes("multi/release/test/sub/TestClass10.class", base)); + classPathJarEntries.put("multi/release/test/sub/TestClass11.class", getBytes("multi/release/test/sub/TestClass11.class", base)); + classPathJarEntries.put("multi/release/test/sub/testResourceBase.txt", getBytes("multi/release/test/sub/testResourceBase.txt", base)); + classPathJarEntries.put("multi/release/test/sub/testResource8.txt", getBytes("multi/release/test/sub/testResource8.txt", base)); + classPathJarEntries.put("multi/release/test/sub/testResource9.txt", getBytes("multi/release/test/sub/testResource9.txt", base)); + classPathJarEntries.put("multi/release/test/sub/testResource10.txt", getBytes("multi/release/test/sub/testResource10.txt", base)); + classPathJarEntries.put("multi/release/test/sub/testResource11.txt", getBytes("multi/release/test/sub/testResource11.txt", base)); + + classPathJarEntries.put("META-INF/versions/", null); + classPathJarEntries.put("META-INF/versions/8/", null); + classPathJarEntries.put("META-INF/versions/8/multi/", null); + classPathJarEntries.put("META-INF/versions/8/multi/release/", null); + classPathJarEntries.put("META-INF/versions/8/multi/release/test/", null); + classPathJarEntries.put("META-INF/versions/8/multi/release/test/sub/", null); + classPathJarEntries.put("META-INF/versions/8/multi/release/test/sub/TestClass8.class", getBytes("multi/release/test/sub/TestClass8.class", base, new byte[] {'0', '8'})); + classPathJarEntries.put("META-INF/versions/8/multi/release/test/sub/TestClassAdd8.class", getBytes("multi/release/test/sub/TestClassAdd8.class", base)); + classPathJarEntries.put("META-INF/versions/8/multi/release/test/sub/testResource8.txt", getBytes("multi/release/test/sub/testResource8.txt", base, new byte[] {'0', '8'})); + classPathJarEntries.put("META-INF/versions/8/multi/release/test/sub/testResourceAdd8.txt", getBytes("multi/release/test/sub/testResourceAdd8.txt", base)); + + classPathJarEntries.put("META-INF/versions/9/", null); + classPathJarEntries.put("META-INF/versions/9/multi/", null); + classPathJarEntries.put("META-INF/versions/9/multi/release/", null); + classPathJarEntries.put("META-INF/versions/9/multi/release/test/", null); + classPathJarEntries.put("META-INF/versions/9/multi/release/test/sub/", null); + classPathJarEntries.put("META-INF/versions/9/multi/release/test/sub/TestClass9.class", getBytes("multi/release/test/sub/TestClass9.class", base, new byte[] {'0', '9'})); + classPathJarEntries.put("META-INF/versions/9/multi/release/test/sub/TestClassAdd9.class", getBytes("multi/release/test/sub/TestClassAdd9.class", base)); + classPathJarEntries.put("META-INF/versions/9/multi/release/test/sub/testResource9.txt", getBytes("multi/release/test/sub/testResource9.txt", base, new byte[] {'0', '9'})); + classPathJarEntries.put("META-INF/versions/9/multi/release/test/sub/testResourceAdd9.txt", getBytes("multi/release/test/sub/testResourceAdd9.txt", base)); + + classPathJarEntries.put("META-INF/versions/10/", null); + classPathJarEntries.put("META-INF/versions/10/multi/", null); + classPathJarEntries.put("META-INF/versions/10/multi/release/", null); + classPathJarEntries.put("META-INF/versions/10/multi/release/test/", null); + classPathJarEntries.put("META-INF/versions/10/multi/release/test/sub/", null); + classPathJarEntries.put("META-INF/versions/10/multi/release/test/sub/TestClass10.class", getBytes("multi/release/test/sub/TestClass10.class", base, new byte[] {'1', '0'})); + classPathJarEntries.put("META-INF/versions/10/multi/release/test/sub/TestClassAdd10.class", getBytes("multi/release/test/sub/TestClassAdd10.class", base)); + classPathJarEntries.put("META-INF/versions/10/multi/release/test/sub/testResource10.txt", getBytes("multi/release/test/sub/testResource10.txt", base, new byte[] {'1', '0'})); + classPathJarEntries.put("META-INF/versions/10/multi/release/test/sub/testResourceAdd10.txt", getBytes("multi/release/test/sub/testResourceAdd10.txt", base)); + + classPathJarEntries.put("META-INF/versions/11/", null); + classPathJarEntries.put("META-INF/versions/11/multi/", null); + classPathJarEntries.put("META-INF/versions/11/multi/release/", null); + classPathJarEntries.put("META-INF/versions/11/multi/release/test/", null); + classPathJarEntries.put("META-INF/versions/11/multi/release/test/sub/", null); + classPathJarEntries.put("META-INF/versions/11/multi/release/test/sub/TestClass11.class", getBytes("multi/release/test/sub/TestClass11.class", base, new byte[] {'1', '1'})); + classPathJarEntries.put("META-INF/versions/11/multi/release/test/sub/TestClassAdd11.class", getBytes("multi/release/test/sub/TestClassAdd11.class", base)); + classPathJarEntries.put("META-INF/versions/11/multi/release/test/sub/testResource11.txt", getBytes("multi/release/test/sub/testResource11.txt", base, new byte[] {'1', '1'})); + classPathJarEntries.put("META-INF/versions/11/multi/release/test/sub/testResourceAdd11.txt", getBytes("multi/release/test/sub/testResourceAdd11.txt", base)); + + createMRJar(classpathMrJar, Collections.<String, String> emptyMap(), classPathJarEntries); + bundleEntries.put(classpathMrJar.getName(), StorageUtil.getBytes(new FileInputStream(classpathMrJar), -1, 4000)); + + // This will not be required by the spec, but equinox does support exploded inner jars in a bundle + bundleEntries.put("classPathDir/", null); + bundleEntries.put("classPathDir/multi/", null); + bundleEntries.put("classPathDir/multi/release/", null); + bundleEntries.put("classPathDir/multi/release/test/", null); + bundleEntries.put("classPathDir/multi/release/test/sub2/", null); + bundleEntries.put("classPathDir/multi/release/test/sub2/TestClassBase.class", getBytes("multi/release/test/sub2/TestClassBase.class", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/TestClass8.class", getBytes("multi/release/test/sub2/TestClass8.class", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/TestClass9.class", getBytes("multi/release/test/sub2/TestClass9.class", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/TestClass10.class", getBytes("multi/release/test/sub2/TestClass10.class", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/TestClass11.class", getBytes("multi/release/test/sub2/TestClass11.class", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/testResourceBase.txt", getBytes("multi/release/test/sub2/testResourceBase.txt", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/testResource8.txt", getBytes("multi/release/test/sub2/testResource8.txt", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/testResource9.txt", getBytes("multi/release/test/sub2/testResource9.txt", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/testResource10.txt", getBytes("multi/release/test/sub2/testResource10.txt", base)); + bundleEntries.put("classPathDir/multi/release/test/sub2/testResource11.txt", getBytes("multi/release/test/sub2/testResource11.txt", base)); + + String classPathDirManifest = // + "Manifest-Version: 1\n" + // + "Multi-Release: true\n\n"; + bundleEntries.put("classPathDir/META-INF/", null); + bundleEntries.put("classPathDir/META-INF/MANIFEST.MF", classPathDirManifest.getBytes(Charset.forName("UTF-8"))); + bundleEntries.put("classPathDir/META-INF/versions/", null); + bundleEntries.put("classPathDir/META-INF/versions/8/", null); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/", null); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/", null); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/test/", null); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/test/sub2/", null); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/test/sub2/TestClass8.class", getBytes("multi/release/test/sub2/TestClass8.class", base, new byte[] {'0', '8'})); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/test/sub2/TestClassAdd8.class", getBytes("multi/release/test/sub2/TestClassAdd8.class", base)); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/test/sub2/testResource8.txt", getBytes("multi/release/test/sub2/testResource8.txt", base, new byte[] {'0', '8'})); + bundleEntries.put("classPathDir/META-INF/versions/8/multi/release/test/sub2/testResourceAdd8.txt", getBytes("multi/release/test/sub2/testResourceAdd8.txt", base)); + + bundleEntries.put("classPathDir/META-INF/versions/9/", null); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/", null); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/", null); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/test/", null); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/test/sub2/", null); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/test/sub2/TestClass9.class", getBytes("multi/release/test/sub2/TestClass9.class", base, new byte[] {'0', '9'})); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/test/sub2/TestClassAdd9.class", getBytes("multi/release/test/sub2/TestClassAdd9.class", base)); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/test/sub2/testResource9.txt", getBytes("multi/release/test/sub2/testResource9.txt", base, new byte[] {'0', '9'})); + bundleEntries.put("classPathDir/META-INF/versions/9/multi/release/test/sub2/testResourceAdd9.txt", getBytes("multi/release/test/sub2/testResourceAdd9.txt", base)); + + bundleEntries.put("classPathDir/META-INF/versions/10/", null); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/", null); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/", null); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/test/", null); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/test/sub2/", null); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/test/sub2/TestClass10.class", getBytes("multi/release/test/sub2/TestClass10.class", base, new byte[] {'1', '0'})); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/test/sub2/TestClassAdd10.class", getBytes("multi/release/test/sub2/TestClassAdd10.class", base)); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/test/sub2/testResource10.txt", getBytes("multi/release/test/sub2/testResource10.txt", base, new byte[] {'1', '0'})); + bundleEntries.put("classPathDir/META-INF/versions/10/multi/release/test/sub2/testResourceAdd10.txt", getBytes("multi/release/test/sub2/testResourceAdd10.txt", base)); + + bundleEntries.put("classPathDir/META-INF/versions/11/", null); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/", null); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/", null); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/test/", null); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/test/sub2/", null); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/test/sub2/TestClass11.class", getBytes("multi/release/test/sub2/TestClass11.class", base, new byte[] {'1', '1'})); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/test/sub2/TestClassAdd11.class", getBytes("multi/release/test/sub2/TestClassAdd11.class", base)); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/test/sub2/testResource11.txt", getBytes("multi/release/test/sub2/testResource11.txt", base, new byte[] {'1', '1'})); + bundleEntries.put("classPathDir/META-INF/versions/11/multi/release/test/sub2/testResourceAdd11.txt", getBytes("multi/release/test/sub2/testResourceAdd11.txt", base)); + + createMRJar(mrJarBundle, bundleHeaders, bundleEntries); + return mrJarBundle; + } + + static void createMRJar(File file, Map<String, String> headers, Map<String, byte[]> entries) throws IOException { + Manifest m = new Manifest(); + Attributes attributes = m.getMainAttributes(); + attributes.putValue("Manifest-Version", "1.0"); + attributes.putValue("Multi-Release", "true"); + for (Map.Entry<String, String> entry : headers.entrySet()) { + attributes.putValue(entry.getKey(), entry.getValue()); + } + JarOutputStream jos = new JarOutputStream(new FileOutputStream(file), m); + if (entries != null) { + for (Map.Entry<String, byte[]> entry : entries.entrySet()) { + jos.putNextEntry(new JarEntry(entry.getKey())); + if (entry.getValue() != null) { + jos.write(entry.getValue()); + } + jos.closeEntry(); + } + } + jos.flush(); + jos.close(); + } + + private static byte[] getBytes(String path, Bundle b) throws IOException { + return getBytes(path, b, null); + } + + private static byte[] getBytes(String path, Bundle b, byte[] replace) throws IOException { + URL entry = b.getEntry(path); + if (entry == null) { + throw new FileNotFoundException("No entry found for: " + path); + } + byte[] result = StorageUtil.getBytes(entry.openStream(), -1, 4000); + + if (replace != null) { + for (int i = 0; i < result.length - 1; i++) { + if (result[i] == 'X' && result[i + 1] == 'X') { + result[i] = replace[0]; + result[i + 1] = replace[1]; + } + } + } + return result; + } + + public void testMultiRelease8ClassLoad() throws Exception { + doTestMultiReleaseClassLoad(8); + } + + public void testMultiRelease9ClassLoad() throws Exception { + doTestMultiReleaseClassLoad(9); + } + + public void testMultiRelease10ClassLoad() throws Exception { + doTestMultiReleaseClassLoad(10); + } + + public void testMultiRelease11ClassLoad() throws Exception { + doTestMultiReleaseClassLoad(11); + } + + private void doTestMultiReleaseClassLoad(int rv) throws Exception { + if (rv < 9) { + System.setProperty("java.specification.version", "1." + rv); + } else { + System.setProperty("java.specification.version", Integer.toString(rv)); + } + + File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ + Equinox equinox = new Equinox(Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath())); + + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.installBundle(mrJarBundle.toURI().toString()); + mrBundle.start(); + assertEquals("Wrong class.", "BASEXX", loadClass("multi.release.test.TestClassBase", mrBundle, false)); + assertEquals("Wrong class.", "BASEXX", loadClass("multi.release.test.TestClass8", mrBundle, false)); + assertEquals("Wrong class.", CNFE, loadClass("multi.release.test.TestClassAdd8", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 9) ? "BASE09" : "BASEXX", loadClass("multi.release.test.TestClass9", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 9) ? "ADD09" : CNFE, loadClass("multi.release.test.TestClassAdd9", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 10) ? "BASE10" : "BASEXX", loadClass("multi.release.test.TestClass10", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 10) ? "ADD10" : CNFE, loadClass("multi.release.test.TestClassAdd10", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 11) ? "BASE11" : "BASEXX", loadClass("multi.release.test.TestClass11", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 11) ? "ADD11" : CNFE, loadClass("multi.release.test.TestClassAdd11", mrBundle, true)); + + assertEquals("Wrong class.", "BASEXX", loadClass("multi.release.test.sub.TestClassBase", mrBundle, false)); + assertEquals("Wrong class.", "BASEXX", loadClass("multi.release.test.sub.TestClass8", mrBundle, false)); + assertEquals("Wrong class.", CNFE, loadClass("multi.release.test.TestClassAdd8", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 9) ? "BASE09" : "BASEXX", loadClass("multi.release.test.sub.TestClass9", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 9) ? "ADD09" : CNFE, loadClass("multi.release.test.sub.TestClassAdd9", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 10) ? "BASE10" : "BASEXX", loadClass("multi.release.test.sub.TestClass10", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 10) ? "ADD10" : CNFE, loadClass("multi.release.test.sub.TestClassAdd10", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 11) ? "BASE11" : "BASEXX", loadClass("multi.release.test.sub.TestClass11", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 11) ? "ADD11" : CNFE, loadClass("multi.release.test.sub.TestClassAdd11", mrBundle, true)); + + assertEquals("Wrong class.", "BASEXX", loadClass("multi.release.test.sub2.TestClassBase", mrBundle, false)); + assertEquals("Wrong class.", "BASEXX", loadClass("multi.release.test.sub2.TestClass8", mrBundle, false)); + assertEquals("Wrong class.", CNFE, loadClass("multi.release.test.TestClassAdd8", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 9) ? "BASE09" : "BASEXX", loadClass("multi.release.test.sub2.TestClass9", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 9) ? "ADD09" : CNFE, loadClass("multi.release.test.sub2.TestClassAdd9", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 10) ? "BASE10" : "BASEXX", loadClass("multi.release.test.sub2.TestClass10", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 10) ? "ADD10" : CNFE, loadClass("multi.release.test.sub2.TestClassAdd10", mrBundle, true)); + assertEquals("Wrong class.", (rv >= 11) ? "BASE11" : "BASEXX", loadClass("multi.release.test.sub2.TestClass11", mrBundle, false)); + assertEquals("Wrong class.", (rv >= 11) ? "ADD11" : CNFE, loadClass("multi.release.test.sub2.TestClassAdd11", mrBundle, true)); + } finally { + try { + equinox.stop(); + equinox.waitForStop(10000); + } catch (Exception e) { + // ignore; + } + } + } + + private String loadClass(String name, Bundle mrBundle, boolean cnfeExpected) throws Exception { + try { + return mrBundle.loadClass(name).getConstructor().newInstance().toString(); + } catch (ClassNotFoundException e) { + if (cnfeExpected) { + return CNFE; + } + throw e; + } + } + + public void testMultiRelease8GetResource() throws Exception { + doTestMultiReleaseGetResource(8); + } + + public void testMultiRelease9GetResource() throws Exception { + doTestMultiReleaseGetResource(9); + } + + public void testMultiRelease10GetResource() throws Exception { + doTestMultiReleaseGetResource(10); + } + + public void testMultiRelease11GetResource() throws Exception { + doTestMultiReleaseGetResource(11); + } + + private void doTestMultiReleaseGetResource(int rv) throws Exception { + if (rv < 9) { + System.setProperty("java.specification.version", "1." + rv); + } else { + System.setProperty("java.specification.version", Integer.toString(rv)); + } + + File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ + Equinox equinox = new Equinox(Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath())); + + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.installBundle(mrJarBundle.toURI().toString()); + mrBundle.start(); + + assertEquals("Wrong resource.", "RESOURCE XX", readResource("multi/release/test/testResourceBase.txt", mrBundle)); + assertEquals("Wrong resource.", "RESOURCE XX", readResource("multi/release/test/testResource8.txt", mrBundle)); + assertEquals("Wrong resource.", RNF, readResource("multi/release/test/testResourceAdd8.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "RESOURCE 09" : "RESOURCE XX", readResource("multi/release/test/testResource9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "ADD 09" : RNF, readResource("multi/release/test/testResourceAdd9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "RESOURCE 10" : "RESOURCE XX", readResource("multi/release/test/testResource10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "ADD 10" : RNF, readResource("multi/release/test/testResourceAdd10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "RESOURCE 11" : "RESOURCE XX", readResource("multi/release/test/testResource11.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "ADD 11" : RNF, readResource("multi/release/test/testResourceAdd11.txt", mrBundle)); + + assertEquals("Wrong resource.", "RESOURCE XX", readResource("multi/release/test/sub/testResourceBase.txt", mrBundle)); + assertEquals("Wrong resource.", "RESOURCE XX", readResource("multi/release/test/sub/testResource8.txt", mrBundle)); + assertEquals("Wrong resource.", RNF, readResource("multi/release/test/testResourceAdd8.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "RESOURCE 09" : "RESOURCE XX", readResource("multi/release/test/sub/testResource9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "ADD 09" : RNF, readResource("multi/release/test/sub/testResourceAdd9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "RESOURCE 10" : "RESOURCE XX", readResource("multi/release/test/sub/testResource10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "ADD 10" : RNF, readResource("multi/release/test/sub/testResourceAdd10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "RESOURCE 11" : "RESOURCE XX", readResource("multi/release/test/sub/testResource11.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "ADD 11" : RNF, readResource("multi/release/test/sub/testResourceAdd11.txt", mrBundle)); + + assertEquals("Wrong resource.", "RESOURCE XX", readResource("multi/release/test/sub2/testResourceBase.txt", mrBundle)); + assertEquals("Wrong resource.", "RESOURCE XX", readResource("multi/release/test/sub2/testResource8.txt", mrBundle)); + assertEquals("Wrong resource.", RNF, readResource("multi/release/test/testResourceAdd8.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "RESOURCE 09" : "RESOURCE XX", readResource("multi/release/test/sub2/testResource9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "ADD 09" : RNF, readResource("multi/release/test/sub2/testResourceAdd9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "RESOURCE 10" : "RESOURCE XX", readResource("multi/release/test/sub2/testResource10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "ADD 10" : RNF, readResource("multi/release/test/sub2/testResourceAdd10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "RESOURCE 11" : "RESOURCE XX", readResource("multi/release/test/sub2/testResource11.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "ADD 11" : RNF, readResource("multi/release/test/sub2/testResourceAdd11.txt", mrBundle)); + + } finally { + try { + equinox.stop(); + equinox.waitForStop(10000); + } catch (Exception e) { + // ignore; + } + } + } + + private String readResource(String name, Bundle mrBundle) throws Exception { + BundleWiring wiring = mrBundle.adapt(BundleWiring.class); + URL url = wiring.getClassLoader().getResource(name); + String result = readURL(url); + + int lastSlash = name.lastIndexOf('/'); + Collection<String> resourcePaths = wiring.listResources(name.substring(0, lastSlash + 1), name.substring(lastSlash + 1), 0); + if (result == RNF) { + if (!resourcePaths.isEmpty()) { + fail("listResources found path for '" + name + "'"); + } + } else { + assertEquals("Found too many resource paths for '" + name + "'", 1, resourcePaths.size()); + assertEquals("Wrong path listed.", name, resourcePaths.iterator().next()); + assertURLCopy(result, url, mrBundle); + } + + return result; + } + + private void assertURLCopy(String expected, URL url, Bundle mrBundle) throws Exception { + Class<?> testClassBase = mrBundle.loadClass("multi.release.test.TestClassBase"); + URL copy = (URL) testClassBase.getDeclaredMethod("createURL", String.class).invoke(null, url.toExternalForm()); + String copyResult = readURL(copy); + assertEquals(expected, copyResult); + } + + private String readURL(URL url) throws IOException { + if (url == null) { + return RNF; + } + BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); + try { + return br.readLine(); + } finally { + br.close(); + } + } + + public void testMultiRelease8GetResources() throws Exception { + doTestMultiReleaseGetResources(8); + } + + public void testMultiRelease9GetResources() throws Exception { + doTestMultiReleaseGetResources(9); + } + + public void testMultiRelease10GetResources() throws Exception { + doTestMultiReleaseGetResources(10); + } + + public void testMultiRelease11GetResources() throws Exception { + doTestMultiReleaseGetResources(11); + } + + private void doTestMultiReleaseGetResources(int rv) throws Exception { + if (rv < 9) { + System.setProperty("java.specification.version", "1." + rv); + } else { + System.setProperty("java.specification.version", Integer.toString(rv)); + } + + File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ + Equinox equinox = new Equinox(Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath())); + + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.installBundle(mrJarBundle.toURI().toString()); + mrBundle.start(); + + assertEquals("Wrong resource.", "RESOURCE XX", readResources("multi/release/test/testResourceBase.txt", mrBundle)); + assertEquals("Wrong resource.", "RESOURCE XX", readResources("multi/release/test/testResource8.txt", mrBundle)); + assertEquals("Wrong resource.", RNF, readResources("multi/release/test/testResourceAdd8.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "RESOURCE 09" : "RESOURCE XX", readResources("multi/release/test/testResource9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "ADD 09" : RNF, readResources("multi/release/test/testResourceAdd9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "RESOURCE 10" : "RESOURCE XX", readResources("multi/release/test/testResource10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "ADD 10" : RNF, readResources("multi/release/test/testResourceAdd10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "RESOURCE 11" : "RESOURCE XX", readResources("multi/release/test/testResource11.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "ADD 11" : RNF, readResources("multi/release/test/testResourceAdd11.txt", mrBundle)); + + assertEquals("Wrong resource.", "RESOURCE XX", readResources("multi/release/test/sub/testResourceBase.txt", mrBundle)); + assertEquals("Wrong resource.", "RESOURCE XX", readResources("multi/release/test/sub/testResource8.txt", mrBundle)); + assertEquals("Wrong resource.", RNF, readResources("multi/release/test/testResourceAdd8.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "RESOURCE 09" : "RESOURCE XX", readResources("multi/release/test/sub/testResource9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "ADD 09" : RNF, readResources("multi/release/test/sub/testResourceAdd9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "RESOURCE 10" : "RESOURCE XX", readResources("multi/release/test/sub/testResource10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "ADD 10" : RNF, readResources("multi/release/test/sub/testResourceAdd10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "RESOURCE 11" : "RESOURCE XX", readResources("multi/release/test/sub/testResource11.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "ADD 11" : RNF, readResources("multi/release/test/sub/testResourceAdd11.txt", mrBundle)); + + assertEquals("Wrong resource.", "RESOURCE XX", readResources("multi/release/test/sub2/testResourceBase.txt", mrBundle)); + assertEquals("Wrong resource.", "RESOURCE XX", readResources("multi/release/test/sub2/testResource8.txt", mrBundle)); + assertEquals("Wrong resource.", RNF, readResources("multi/release/test/testResourceAdd8.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "RESOURCE 09" : "RESOURCE XX", readResources("multi/release/test/sub2/testResource9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 9) ? "ADD 09" : RNF, readResources("multi/release/test/sub2/testResourceAdd9.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "RESOURCE 10" : "RESOURCE XX", readResources("multi/release/test/sub2/testResource10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 10) ? "ADD 10" : RNF, readResources("multi/release/test/sub2/testResourceAdd10.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "RESOURCE 11" : "RESOURCE XX", readResources("multi/release/test/sub2/testResource11.txt", mrBundle)); + assertEquals("Wrong resource.", (rv >= 11) ? "ADD 11" : RNF, readResources("multi/release/test/sub2/testResourceAdd11.txt", mrBundle)); + + } finally { + try { + equinox.stop(); + equinox.waitForStop(10000); + } catch (Exception e) { + // ignore; + } + } + } + + private String readResources(String name, Bundle mrBundle) throws IOException { + BundleWiring wiring = mrBundle.adapt(BundleWiring.class); + List<URL> urls = Collections.list(wiring.getClassLoader().getResources(name)); + if (urls.isEmpty()) { + return RNF; + } + assertEquals("Wrong number of resources.", 1, urls.size()); + return readURL(urls.get(0)); + } + + public void testMultiRelease8ListResources() throws Exception { + doTestMultiReleaseListResources(8); + } + + public void testMultiRelease9ListResources() throws Exception { + doTestMultiReleaseListResources(9); + } + + public void testMultiRelease10ListResources() throws Exception { + doTestMultiReleaseListResources(10); + } + + public void testMultiRelease11ListResources() throws Exception { + doTestMultiReleaseListResources(11); + } + + private void doTestMultiReleaseListResources(int rv) throws Exception { + if (rv < 9) { + System.setProperty("java.specification.version", "1." + rv); + } else { + System.setProperty("java.specification.version", Integer.toString(rv)); + } + + Collection<String> expected = new ArrayList<String>(); + Collection<String> expectedRecurse = new ArrayList<String>(); + + expected.add("multi/release/test/testResourceBase.txt"); + expected.add("multi/release/test/testResource8.txt"); + expected.add("multi/release/test/testResource9.txt"); + expected.add("multi/release/test/testResource10.txt"); + expected.add("multi/release/test/testResource11.txt"); + + if (rv >= 9) { + expected.add("multi/release/test/testResourceAdd9.txt"); + } + if (rv >= 10) { + expected.add("multi/release/test/testResourceAdd10.txt"); + } + if (rv >= 11) { + expected.add("multi/release/test/testResourceAdd11.txt"); + } + + expectedRecurse.addAll(expected); + expectedRecurse.add("multi/release/test/sub/testResourceBase.txt"); + expectedRecurse.add("multi/release/test/sub/testResource8.txt"); + expectedRecurse.add("multi/release/test/sub/testResource9.txt"); + expectedRecurse.add("multi/release/test/sub/testResource10.txt"); + expectedRecurse.add("multi/release/test/sub/testResource11.txt"); + expectedRecurse.add("multi/release/test/sub2/testResourceBase.txt"); + expectedRecurse.add("multi/release/test/sub2/testResource8.txt"); + expectedRecurse.add("multi/release/test/sub2/testResource9.txt"); + expectedRecurse.add("multi/release/test/sub2/testResource10.txt"); + expectedRecurse.add("multi/release/test/sub2/testResource11.txt"); + + if (rv >= 9) { + expectedRecurse.add("multi/release/test/sub/testResourceAdd9.txt"); + expectedRecurse.add("multi/release/test/sub2/testResourceAdd9.txt"); + } + if (rv >= 10) { + expectedRecurse.add("multi/release/test/sub/testResourceAdd10.txt"); + expectedRecurse.add("multi/release/test/sub2/testResourceAdd10.txt"); + } + if (rv >= 11) { + expectedRecurse.add("multi/release/test/sub/testResourceAdd11.txt"); + expectedRecurse.add("multi/release/test/sub2/testResourceAdd11.txt"); + } + + File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ + Equinox equinox = new Equinox(Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath())); + + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.installBundle(mrJarBundle.toURI().toString()); + mrBundle.start(); + + listResources("multi/release/test", expected, mrBundle, 0); + listResources("multi/release/test", expectedRecurse, mrBundle, BundleWiring.LISTRESOURCES_RECURSE); + } finally { + try { + equinox.stop(); + equinox.waitForStop(10000); + } catch (Exception e) { + // ignore; + } + } + } + + private void listResources(String path, Collection<String> expected, Bundle mrBundle, int options) { + BundleWiring wiring = mrBundle.adapt(BundleWiring.class); + Collection<String> found = wiring.listResources(path, "*.txt", options); + assertEquals("Wrong resource listing.", expected.toArray(), found.toArray(), false); + } + + public void testMultiReleaseBundleManifest8() throws Exception { + doTestMultiReleaseBundleManifest(8); + } + + public void testMultiReleaseBundleManifest9() throws Exception { + doTestMultiReleaseBundleManifest(9); + } + + public void testMultiReleaseBundleManifest10() throws Exception { + doTestMultiReleaseBundleManifest(10); + } + + public void testMultiReleaseBundleManifest11() throws Exception { + doTestMultiReleaseBundleManifest(11); + } + + private void doTestMultiReleaseBundleManifest(int rv) throws Exception { + if (rv < 9) { + System.setProperty("java.specification.version", "1." + rv); + } else { + System.setProperty("java.specification.version", Integer.toString(rv)); + } + + String expectedCap; + String expectedPkg; + if (rv < 9) { + expectedCap = "capbase"; + expectedPkg = "pkgbase"; + } else { + expectedCap = "cap" + rv; + expectedPkg = "pkg" + rv; + } + + File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ + Equinox equinox = new Equinox(Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath())); + + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.installBundle(mrJarBundle.toURI().toString()); + mrBundle.start(); + + List<BundleWire> capWires = mrBundle.adapt(BundleWiring.class).getRequiredWires(expectedCap); + assertEquals("Wrong number of capability wires.", 1, capWires.size()); + + List<BundleRequirement> pkgReqs = mrBundle.adapt(BundleRevision.class).getDeclaredRequirements(PackageNamespace.PACKAGE_NAMESPACE); + assertEquals("Wrong number of package requiremens.", 1, pkgReqs.size()); + String filter = pkgReqs.get(0).getDirectives().get(Namespace.REQUIREMENT_FILTER_DIRECTIVE); + assertTrue("Wrong package filter: " + filter, filter.contains(expectedPkg)); + + } finally { + try { + equinox.stop(); + equinox.waitForStop(10000); + } catch (Exception e) { + // ignore; + } + } + } + + public void testMultiReleaseBundleManifestChangeRuntime() throws Exception { + File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ + Map<String, String> configMap = Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath() + " with space"); + Equinox equinox = new Equinox(configMap); + String location; + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.installBundle(mrJarBundle.toURI().toString()); + location = mrBundle.getLocation(); + mrBundle.start(); + } finally { + equinox.stop(); + equinox.waitForStop(1000); + } + + for (int rv = 8; rv <= 11; rv++) { + doTestMultiReleaseBundleManifestChangeRuntime(rv, configMap, location); + } + + equinox.start(); + try { + BundleContext systemContext = equinox.getBundleContext(); + Bundle toUninstall = systemContext.getBundle(location); + toUninstall.uninstall(); + Bundle mrBundle = systemContext.installBundle("reference:" + mrJarBundle.toURI().toString()); + location = mrBundle.getLocation(); + mrBundle.start(); + } finally { + equinox.stop(); + equinox.waitForStop(1000); + } + + for (int rv = 8; rv <= 11; rv++) { + doTestMultiReleaseBundleManifestChangeRuntime(rv, configMap, location); + } + } + + private void doTestMultiReleaseBundleManifestChangeRuntime(int rv, Map<String, String> configMap, String location) throws BundleException { + if (rv < 9) { + System.setProperty("java.specification.version", "1." + rv); + } else { + System.setProperty("java.specification.version", Integer.toString(rv)); + } + + String expectedCap; + String expectedPkg; + if (rv < 9) { + expectedCap = "capbase"; + expectedPkg = "pkgbase"; + } else { + expectedCap = "cap" + rv; + expectedPkg = "pkg" + rv; + } + + Equinox equinox = new Equinox(configMap); + + try { + equinox.start(); + BundleContext systemContext = equinox.getBundleContext(); + Bundle mrBundle = systemContext.getBundle(location); + assertNotNull("No mrBundle found: " + rv, mrBundle); + assertEquals("Wrong state of mrBundle: " + rv, Bundle.ACTIVE, mrBundle.getState()); + + List<BundleWire> capWires = mrBundle.adapt(BundleWiring.class).getRequiredWires(expectedCap); + assertEquals("Wrong number of capability wires: " + rv, 1, capWires.size()); + + List<BundleRequirement> pkgReqs = mrBundle.adapt(BundleRevision.class).getDeclaredRequirements(PackageNamespace.PACKAGE_NAMESPACE); + assertEquals("Wrong number of package requiremens: " + rv, 1, pkgReqs.size()); + String filter = pkgReqs.get(0).getDirectives().get(Namespace.REQUIREMENT_FILTER_DIRECTIVE); + assertTrue("Wrong package filter: " + rv + " " + filter, filter.contains(expectedPkg)); + + } finally { + try { + equinox.stop(); + equinox.waitForStop(10000); + } catch (Exception e) { + // ignore; + } + } + } + +} |