| /******************************************************************************* |
| * Copyright (c) 2017 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * 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.StandardCharsets; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.ServiceLoader; |
| 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<>(); |
| 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<>(); |
| 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/TestService.class", getBytes("multi/release/test/TestService.class", base)); |
| bundleEntries.put("multi/release/test/TestService9.class", getBytes("multi/release/test/TestService9.class", base)); |
| bundleEntries.put("multi/release/test/TestServiceBase.class", getBytes("multi/release/test/TestServiceBase.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/services/", null); |
| bundleEntries.put("META-INF/services/multi.release.test.TestService", "multi.release.test.TestServiceBase".getBytes(StandardCharsets.UTF_8)); |
| 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/META-INF/", null); |
| bundleEntries.put("META-INF/versions/9/META-INF/addedFor9.txt", "added for 9".getBytes(StandardCharsets.UTF_8)); |
| bundleEntries.put("META-INF/versions/9/META-INF/addedDirFor9/", null); |
| bundleEntries.put("META-INF/versions/9/META-INF/addedDirFor9/addedFor9.txt", "added for 9".getBytes(StandardCharsets.UTF_8)); |
| bundleEntries.put("META-INF/versions/9/META-INF/services/", null); |
| bundleEntries.put("META-INF/versions/9/META-INF/services/multi.release.test.TestService", "multi.release.test.TestService9".getBytes(StandardCharsets.UTF_8)); |
| 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<>(); |
| 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(StandardCharsets.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<>(); |
| Collection<String> expectedRecurse = new ArrayList<>(); |
| |
| 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()); |
| 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(10000); |
| } |
| System.out.println("Equinox state: " + equinox.getState()); |
| for (int rv = 8; rv <= 11; rv++) { |
| doTestMultiReleaseBundleManifestChangeRuntime(rv, configMap, location); |
| } |
| |
| try { |
| equinox.start(); |
| 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(10000); |
| } |
| |
| 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(); |
| System.out.println("Bundles: " + Arrays.toString(systemContext.getBundles())); |
| 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; |
| } |
| } |
| } |
| |
| public void testMultiReleaseBundleDeletedRestart() throws Exception { |
| File copyMrJarBundle = OSGiTestsActivator.getContext().getDataFile("copy-" + mrJarBundle.getName()); |
| StorageUtil.readFile(new FileInputStream(mrJarBundle), copyMrJarBundle); |
| |
| System.setProperty("java.specification.version", "9"); |
| |
| File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ |
| Map<String, String> configMap = Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath()); |
| Equinox equinox = new Equinox(configMap); |
| |
| try { |
| equinox.start(); |
| BundleContext systemContext = equinox.getBundleContext(); |
| Bundle mrBundle = systemContext.installBundle("reference:" + copyMrJarBundle.toURI().toString()); |
| mrBundle.start(); |
| } finally { |
| equinox.stop(); |
| equinox.waitForStop(1000); |
| } |
| |
| copyMrJarBundle.delete(); |
| |
| System.setProperty("java.specification.version", "10"); |
| |
| equinox = new Equinox(configMap); |
| try { |
| equinox.start(); |
| } finally { |
| equinox.stop(); |
| equinox.waitForStop(1000); |
| } |
| } |
| |
| public void testMultiReleasePreventMetaInfServiceVersions() throws Exception { |
| System.setProperty("java.specification.version", "9"); |
| |
| File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ |
| Map<String, String> configMap = Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath()); |
| Equinox equinox = new Equinox(configMap); |
| |
| try { |
| equinox.start(); |
| BundleContext systemContext = equinox.getBundleContext(); |
| Bundle mrBundle = systemContext.installBundle("reference:" + mrJarBundle.toURI().toString()); |
| mrBundle.start(); |
| |
| Class<?> testServiceClass = mrBundle.loadClass("multi.release.test.TestService"); |
| ServiceLoader<?> loader = ServiceLoader.load(testServiceClass, mrBundle.adapt(BundleWiring.class).getClassLoader()); |
| Object testService = loader.iterator().next(); |
| assertEquals("Wrong service found.", "SERVICE_BASE", testService.toString()); |
| } finally { |
| equinox.stop(); |
| equinox.waitForStop(1000); |
| } |
| } |
| |
| public void testMultiReleasePreventMetaInfResourceURLs() throws Exception { |
| System.setProperty("java.specification.version", "9"); |
| |
| File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ |
| Map<String, String> configMap = Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath()); |
| Equinox equinox = new Equinox(configMap); |
| |
| try { |
| equinox.start(); |
| BundleContext systemContext = equinox.getBundleContext(); |
| Bundle mrBundle = systemContext.installBundle("reference:" + mrJarBundle.toURI().toString()); |
| mrBundle.start(); |
| |
| URL existingResource = mrBundle.getResource("multi/release/test/testResourceAdd9.txt"); |
| assertNotNull("Did not find Java 9 added resource.", existingResource); |
| URL metaInfResource = new URL(existingResource, "/META-INF/addedFor9.txt"); |
| try { |
| metaInfResource.openStream().close(); |
| fail("Expected error opening versioned META-INF resource."); |
| } catch (IOException e) { |
| // expected |
| } |
| |
| } finally { |
| equinox.stop(); |
| equinox.waitForStop(1000); |
| } |
| } |
| |
| public void testMultiReleasePreventMetaInfVersionListing() throws Exception { |
| System.setProperty("java.specification.version", "9"); |
| |
| File config = OSGiTestsActivator.getContext().getDataFile(getName()); //$NON-NLS-1$ |
| Map<String, String> configMap = Collections.singletonMap(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath()); |
| Equinox equinox = new Equinox(configMap); |
| |
| try { |
| equinox.start(); |
| BundleContext systemContext = equinox.getBundleContext(); |
| Bundle mrBundle = systemContext.installBundle("reference:" + mrJarBundle.toURI().toString()); |
| mrBundle.start(); |
| |
| Collection<String> list = mrBundle.adapt(BundleWiring.class).listResources("/META-INF/", "*.txt", 0); |
| assertTrue("Found versioned META-INF resources: " + list, list.isEmpty()); |
| } finally { |
| equinox.stop(); |
| equinox.waitForStop(1000); |
| } |
| } |
| } |