blob: 029f856a6fbd648f14e200636ff7d8e56d2371c1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.bundles;
import java.io.*;
import java.net.*;
import java.util.*;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.osgi.framework.*;
import org.osgi.framework.hooks.bundle.CollisionHook;
public class BundleInstallUpdateTests extends AbstractBundleTests {
public static Test suite() {
return new TestSuite(BundleInstallUpdateTests.class);
}
// test installing with location
public void testInstallWithLocation01() {
Bundle test = null;
try {
String location = installer.getBundleLocation("test"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location);
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (BundleException e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
// test installing with location and null stream
public void testInstallWithLocation02() {
Bundle test = null;
try {
String location = installer.getBundleLocation("test"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location, null);
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (BundleException e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
// test installing with location and non-null stream
public void testInstallWithStream03() {
Bundle test = null;
try {
String location1 = installer.getBundleLocation("test"); //$NON-NLS-1$
String location2 = installer.getBundleLocation("test2"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location1, new URL(location2).openStream());
assertEquals("Wrong BSN", "test2", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (Exception e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
// test update with null stream
public void testUpdateNoStream01() {
Bundle test = null;
try {
String location = installer.getBundleLocation("test"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location);
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
test.update();
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (BundleException e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
// test update with null stream
public void testUpdateNoStream02() {
Bundle test = null;
try {
String location = installer.getBundleLocation("test"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location);
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
test.update(null);
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (BundleException e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
// test update with null stream
public void testUpdateWithStream01() {
Bundle test = null;
try {
String location1 = installer.getBundleLocation("test"); //$NON-NLS-1$
String location2 = installer.getBundleLocation("test2"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location1);
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
test.update(new URL(location2).openStream());
assertEquals("Wrong BSN", "test2", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
} catch (Exception e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
// test update with null stream
public void testUpdateWithStream02() {
Bundle test = null;
try {
String location1 = installer.getBundleLocation("test"); //$NON-NLS-1$
String location2 = installer.getBundleLocation("test2"); //$NON-NLS-1$
test = OSGiTestsActivator.getContext().installBundle(location1);
Bundle b1 = installer.installBundle("chain.test"); //$NON-NLS-1$
assertEquals("Wrong BSN", "test1", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
test.update(new URL(location2).openStream());
assertEquals("Wrong BSN", "test2", test.getSymbolicName()); //$NON-NLS-1$ //$NON-NLS-2$
// make sure b1 is still last bundle in bundles list
Bundle[] bundles = OSGiTestsActivator.getContext().getBundles();
assertTrue("Wrong bundle at the end: " + bundles[bundles.length - 1], bundles[bundles.length - 1] == b1); //$NON-NLS-1$
Bundle[] tests = installer.getPackageAdmin().getBundles(test.getSymbolicName(), null);
assertNotNull("null tests", tests); //$NON-NLS-1$
assertEquals("Wrong number", 1, tests.length); //$NON-NLS-1$
assertTrue("Wrong bundle: " + tests[0], tests[0] == test); //$NON-NLS-1$
} catch (Exception e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
public void testBug290193() {
Bundle test = null;
try {
URL testBundle = OSGiTestsActivator.getContext().getBundle().getEntry("test_files/security/bundles/signed.jar");
File testFile = OSGiTestsActivator.getContext().getDataFile("test with space/test.jar");
assertTrue(testFile.getParentFile().mkdirs());
readFile(testBundle.openStream(), testFile);
test = OSGiTestsActivator.getContext().installBundle("reference:" + testFile.toURI().toString());
} catch (Exception e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
public static void readFile(InputStream in, File file) throws IOException {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
byte buffer[] = new byte[1024];
int count;
while ((count = in.read(buffer, 0, buffer.length)) > 0) {
fos.write(buffer, 0, count);
}
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ee) {
// nothing to do here
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException ee) {
// nothing to do here
}
}
}
}
public void testCollisionHook() throws BundleException, MalformedURLException, IOException {
Bundle test1 = installer.installBundle("test");
installer.installBundle("test2");
try {
test1.update(new URL(installer.getBundleLocation("test2")).openStream());
fail("Expected to fail to update to another bsn/version that causes collision");
} catch (BundleException e) {
// expected;
}
Bundle junk = null;
try {
junk = OSGiTestsActivator.getContext().installBundle("junk", new URL(installer.getBundleLocation("test2")).openStream());
fail("Expected to fail to install duplication bsn/version that causes collision");
} catch (BundleException e) {
// expected;
} finally {
if (junk != null)
junk.uninstall();
junk = null;
}
CollisionHook hook = new CollisionHook() {
public void filterCollisions(int operationType, Bundle target, Collection collisionCandidates) {
collisionCandidates.clear();
}
};
ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(CollisionHook.class, hook, null);
try {
try {
test1.update(new URL(installer.getBundleLocation("test2")).openStream());
} catch (BundleException e) {
fail("Expected to succeed in updating to a duplicate bsn/version", e);
}
try {
junk = OSGiTestsActivator.getContext().installBundle("junk", new URL(installer.getBundleLocation("test2")).openStream());
} catch (BundleException e) {
fail("Expected to succeed to install duplication bsn/version that causes collision", e);
} finally {
if (junk != null)
junk.uninstall();
junk = null;
}
} finally {
reg.unregister();
}
}
public void testInstallWithInterruption() {
Bundle test = null;
Thread.currentThread().interrupt();
try {
test = installer.installBundle("test"); //$NON-NLS-1$
} catch (BundleException e) {
fail("Unexpected failure", e); //$NON-NLS-1$
} finally {
Thread.interrupted();
try {
if (test != null)
test.uninstall();
} catch (BundleException e) {
// nothing
}
}
}
public void testPercentLocation() throws BundleException, IOException {
doTestSpecialChars('%', false);
doTestSpecialChars('%', true);
}
public void testSpaceLocation() throws BundleException, IOException {
doTestSpecialChars(' ', false);
doTestSpecialChars(' ', true);
}
private void doTestSpecialChars(char c, boolean encode) throws BundleException, IOException {
File bundlesDirectory = OSGiTestsActivator.getContext().getDataFile("file_with_" + c + "_char");
bundlesDirectory.mkdirs();
File testBundleJarFile = SystemBundleTests.createBundle(bundlesDirectory, getName() + 1, false, false);
@SuppressWarnings("deprecation")
String testBundleJarFileURL = encode ? testBundleJarFile.toURI().toString() : testBundleJarFile.toURL().toString();
File testBundleDirFile = SystemBundleTests.createBundle(bundlesDirectory, getName() + 2, false, true);
@SuppressWarnings("deprecation")
String testBundleDirFileURL = encode ? testBundleDirFile.toURI().toString() : testBundleDirFile.toURL().toString();
// Test with reference URL to jar bundle
Bundle testBundleJarRef = getContext().installBundle("reference:" + testBundleJarFileURL);
testBundleJarRef.start();
testBundleJarRef.uninstall();
// Test with reference URL to dir bundle
Bundle testBundleDirRef = getContext().installBundle("reference:" + testBundleDirFileURL);
testBundleDirRef.start();
testBundleDirRef.uninstall();
// Test with jar bundle
Bundle testBundleJar = getContext().installBundle(testBundleJarFileURL);
testBundleJar.start();
testBundleJar.uninstall();
// Test with dir bundle
Bundle testBundleDir = getContext().installBundle(testBundleDirFileURL);
testBundleDir.start();
testBundleDir.uninstall();
}
public void testPercentCharBundleEntry() throws IOException, BundleException {
doTestSpaceCharsBundleEntry('%');
}
public void testSpaceCharBundleEntry() throws IOException, BundleException {
doTestSpaceCharsBundleEntry(' ');
}
public void testPlusCharBundleEntry() throws IOException, BundleException {
doTestSpaceCharsBundleEntry('+');
}
public void doTestSpaceCharsBundleEntry(char c) throws IOException, BundleException {
String entryName = "file_with_" + c + "_char";
File bundlesDirectory = OSGiTestsActivator.getContext().getDataFile(getName());
bundlesDirectory.mkdirs();
Map<String, String> headers = new HashMap<String, String>();
headers.put(Constants.BUNDLE_MANIFESTVERSION, "2");
headers.put(Constants.BUNDLE_SYMBOLICNAME, getName());
Map<String, String> entry = Collections.singletonMap(entryName, "value");
File testBundleJarFile = SystemBundleTests.createBundle(bundlesDirectory, getName(), headers, entry);
Bundle testBundle = getContext().installBundle(getName(), new FileInputStream(testBundleJarFile));
URL entryURL = testBundle.getEntry(entryName);
assertNotNull("Entry not found.", entryURL);
InputStream is = entryURL.openStream();
is.close();
String encodeEntry = URLEncoder.encode(entryName, "UTF-8");
String urlString = entryURL.toExternalForm();
urlString = urlString.substring(0, urlString.indexOf(entryName)) + encodeEntry;
URL encodedURL = new URL(urlString);
is = encodedURL.openStream();
is.close();
}
}