blob: ec82216fa257b6963d031a7a664c9eb75ad339ac [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2021 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.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
import org.eclipse.osgi.service.resolver.PlatformAdmin;
import org.eclipse.osgi.service.resolver.State;
import org.eclipse.osgi.service.resolver.VersionConstraint;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.startlevel.BundleStartLevel;
import org.osgi.framework.wiring.FrameworkWiring;
public class PlatformAdminBundleTests extends AbstractBundleTests {
public static Test suite() {
return new TestSuite(PlatformAdminBundleTests.class);
}
public void testInstallUninstallBundle() throws BundleException {
PlatformAdmin pa = installer.getPlatformAdmin();
// get system state first to ensure it does not have the test bundle
State systemState = pa.getState(false);
BundleDescription testDesc = systemState.getBundleByLocation(installer.getBundleLocation("test"));
assertNull("Should not find bundle.", testDesc);
Bundle test = installer.installBundle("test");
testDesc = systemState.getBundleByLocation(installer.getBundleLocation("test"));
assertNotNull("Should find bundle.", testDesc);
test.uninstall();
testDesc = systemState.getBundleByLocation(installer.getBundleLocation("test"));
assertNull("Should not find bundle.", testDesc);
}
public void testResolveRefresh() throws BundleException {
PlatformAdmin pa = installer.getPlatformAdmin();
State systemState = pa.getState(false);
Bundle chainTestA = installer.installBundle("chain.test.a");
Bundle chainTestB = installer.installBundle("chain.test.b");
Bundle chainTestC = installer.installBundle("chain.test.c");
Bundle chainTestD = installer.installBundle("chain.test.d");
assertTrue("Could not resolve bundles.", getContext().getBundle(0).adapt(FrameworkWiring.class).resolveBundles(Arrays.asList(chainTestA, chainTestB, chainTestC, chainTestD)));
BundleDescription testADesc = systemState.getBundle(chainTestA.getBundleId());
BundleDescription testBDesc = systemState.getBundle(chainTestB.getBundleId());
BundleDescription testCDesc = systemState.getBundle(chainTestC.getBundleId());
BundleDescription testDDesc = systemState.getBundle(chainTestD.getBundleId());
assertNotNull("testADesc null!!", testADesc);
assertNotNull("testBDesc null!!", testBDesc);
assertNotNull("testCDesc null!!", testCDesc);
assertNotNull("testDDesc null!!", testDDesc);
assertTrue("testADesc is not resolved!!", testADesc.isResolved());
assertTrue("testBDesc is not resolved!!", testBDesc.isResolved());
assertTrue("testCDesc is not resolved!!", testCDesc.isResolved());
assertTrue("testCDesc is not resolved!!", testDDesc.isResolved());
chainTestD.uninstall();
installer.refreshPackages(new Bundle[] {chainTestD});
if (testADesc.isResolved()) {
// This is a hack to wait some time to allow package admin event to be fired
// to all listeners.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
fail("Test got interrupted.", e);
}
}
assertFalse("testADesc is resolved!!", testADesc.isResolved());
assertFalse("testBDesc is resolved!!", testBDesc.isResolved());
assertFalse("testCDesc is resolved!!", testCDesc.isResolved());
}
public void disableTestUnresolvedLeaves01() throws Exception {
Bundle chainTestA = installer.installBundle("chain.test.a");
Bundle chainTestB = installer.installBundle("chain.test.b");
Bundle chainTestC = installer.installBundle("chain.test.c");
Bundle[] allBundles = new Bundle[] {chainTestA, chainTestB, chainTestC};
PlatformAdmin pa = installer.getPlatformAdmin();
State systemState = pa.getState(false);
BundleDescription testADesc = systemState.getBundle(chainTestA.getBundleId());
BundleDescription testBDesc = systemState.getBundle(chainTestB.getBundleId());
BundleDescription testCDesc = systemState.getBundle(chainTestC.getBundleId());
assertNotNull("testADesc null!!", testADesc);
assertNotNull("testBDesc null!!", testBDesc);
assertNotNull("testCDesc null!!", testCDesc);
installer.resolveBundles(allBundles);
assertFalse("testADesc is resolved!!", testADesc.isResolved());
assertFalse("testBDesc is resolved!!", testBDesc.isResolved());
assertFalse("testCDesc is resolved!!", testCDesc.isResolved());
// ok finally we can start testing!!
VersionConstraint[] unsatifiedLeaves = pa.getStateHelper().getUnsatisfiedLeaves(new BundleDescription[] {testADesc});
assertNotNull("Unsatified constraints is null!!", unsatifiedLeaves);
assertEquals("Wrong number of constraints!!", 2, unsatifiedLeaves.length);
for (int i = 0; i < unsatifiedLeaves.length; i++) {
assertTrue("Constraint type is not import package: " + unsatifiedLeaves[i], unsatifiedLeaves[i] instanceof ImportPackageSpecification);
assertEquals("Package name is wrong: " + i, "chain.test.d", unsatifiedLeaves[i].getName());
if (unsatifiedLeaves[i].getBundle() != testBDesc && unsatifiedLeaves[i].getBundle() != testCDesc)
fail("Wrong bundle for the constraint: " + unsatifiedLeaves[i].getBundle());
}
}
public void testR3Bundle() throws BundleException, InvalidSyntaxException {
PlatformAdmin pa = installer.getPlatformAdmin();
State systemState = pa.getState(false);
BundleInstaller r3Installer = new BundleInstaller("test_files/platformAdmin", OSGiTestsActivator.getContext());
try {
Bundle b = r3Installer.installBundle("b1");
BundleDescription bDesc = systemState.getBundle(b.getBundleId());
assertNotNull("No bundle description.", bDesc);
ExportPackageDescription[] exports = bDesc.getExportPackages();
ImportPackageSpecification[] imports = bDesc.getImportPackages();
assertEquals("Wrong number of exports", 1, exports.length);
assertEquals("Wrong number of imports.", 2, imports.length);
} finally {
r3Installer.shutdown();
}
}
public void testNativeCodeFilterWithSpecialChars() throws BundleException, InterruptedException {
final AtomicReference<FrameworkEvent> error = new AtomicReference<>();
final CountDownLatch errorCnt = new CountDownLatch(1);
FrameworkListener errorListener = event -> {
if (event.getType() == FrameworkEvent.ERROR) {
error.set(event);
errorCnt.countDown();
}
};
getContext().addFrameworkListener(errorListener);
try {
PlatformAdmin pa = installer.getPlatformAdmin();
State systemState = pa.getState(false);
// just making sure the system state is fully created first
assertNotNull(systemState.getBundle(0));
Bundle nativeTestF = installer.installBundle("nativetest.f");
nativeTestF.start();
// expecting no errors
errorCnt.await(5, TimeUnit.SECONDS);
assertNull("Found an error: " + error.get(), error.get());
} finally {
getContext().removeFrameworkListener(errorListener);
}
}
public void testTimestamp() throws BundleException {
PlatformAdmin pa = installer.getPlatformAdmin();
// get system state first to ensure it does not have the test bundle
State systemState = pa.getState(false);
long initialTimeStamp = systemState.getTimeStamp();
Bundle test = installer.installBundle("test");
assertTrue("Timestamp has not changed.", initialTimeStamp != systemState.getTimeStamp());
initialTimeStamp = systemState.getTimeStamp();
test.adapt(BundleStartLevel.class).setStartLevel(1000);
assertTrue("Timestamp has not changed.", initialTimeStamp == systemState.getTimeStamp());
initialTimeStamp = systemState.getTimeStamp();
test.uninstall();
assertTrue("Timestamp has not changed.", initialTimeStamp != systemState.getTimeStamp());
}
}