blob: 7b693d9e7047c262160ec892f7ff7162e4f41681 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 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.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.launch.Equinox;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleListener;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.SynchronousBundleListener;
import org.osgi.framework.startlevel.FrameworkStartLevel;
public class ListenerTests extends AbstractBundleTests {
private String methodName;
private List<Bundle> bundles;
private Equinox equinox;
private BundleContext bundleContext;
public static Test suite() {
return new TestSuite(ListenerTests.class);
}
public void setUp() throws Exception {
methodName = getName();
simpleResults = new TestResults();
bundles = new ArrayList<>();
Map<String, Object> configuration = createConfiguration();
equinox = new Equinox(configuration);
initAndStart(equinox);
bundleContext = equinox.getBundleContext();
for (int i = 0; i < 50; i++) {
Bundle b = installBundle(methodName + i);
bundles.add(b);
b.start();
}
}
public void tearDown() throws Exception {
simpleResults = null;
for (Bundle b : bundles) {
if (b != null) {
b.stop();
b = null;
}
}
stopQuietly(equinox);
}
public void testBundleListenersOrder() throws Exception {
BundleListener[] expectedBundleListeners = new BundleListener[200];
int i = 100;
for (Bundle b : bundles) {
BundleListener bundleListener = createBundleListener();
b.getBundleContext().addBundleListener(bundleListener);
expectedBundleListeners[i] = bundleListener;
i = i + 2;
}
int j = 101;
for (Bundle b : bundles) {
BundleListener bundleListener = createBundleListener();
b.getBundleContext().addBundleListener(bundleListener);
expectedBundleListeners[j] = bundleListener;
j = j + 2;
}
//synchronous listener will be called first
i = 0;
for (Bundle b : bundles) {
BundleListener bundleListener = createSynchronousBundleListener();
b.getBundleContext().addBundleListener(bundleListener);
expectedBundleListeners[i] = bundleListener;
i = i + 2;
}
j = 1;
for (Bundle b : bundles) {
BundleListener bundleListener = createSynchronousBundleListener();
b.getBundleContext().addBundleListener(bundleListener);
expectedBundleListeners[j] = bundleListener;
j = j + 2;
}
installBundle(methodName + "51");
Object[] actualBundleListeners = simpleResults.getResults(200);
compareResults(expectedBundleListeners, actualBundleListeners);
}
public void testFrameworkListenersOrder() throws Exception {
FrameworkListener[] expectedFrameworkListeners = new FrameworkListener[100];
int i = 0;
for (Bundle b : bundles) {
FrameworkListener frameworkListener = createFrameworkListener();
b.getBundleContext().addFrameworkListener(frameworkListener);
expectedFrameworkListeners[i] = frameworkListener;
i = i + 2;
}
int j = 1;
for (Bundle b : bundles) {
FrameworkListener frameworkListener = createFrameworkListener();
b.getBundleContext().addFrameworkListener(frameworkListener);
expectedFrameworkListeners[j] = frameworkListener;
j = j + 2;
}
equinox.adapt(FrameworkStartLevel.class).setStartLevel(5);
Object[] actualFrameworkListeners = simpleResults.getResults(100);
compareResults(expectedFrameworkListeners, actualFrameworkListeners);
}
public void testServiceListenersOrder() throws Exception {
ServiceListener[] expectedServiceListeners = new ServiceListener[100];
int i = 0;
for (Bundle b : bundles) {
ServiceListener serviceListener = createServiceListener();
b.getBundleContext().addServiceListener(serviceListener);
expectedServiceListeners[i] = serviceListener;
i = i + 2;
}
int j = 1;
for (Bundle b : bundles) {
ServiceListener serviceListener = createServiceListener();
b.getBundleContext().addServiceListener(serviceListener);
expectedServiceListeners[j] = serviceListener;
j = j + 2;
}
Bundle bundle = installBundle(methodName + "51");
bundle.start();
ServiceRegistration<Object> reg = bundle.getBundleContext().registerService(Object.class, new Object(), null);
Object[] actualServiceListeners = simpleResults.getResults(100);
compareResults(expectedServiceListeners, actualServiceListeners);
if (reg != null) {
reg.unregister();
}
}
private BundleListener createBundleListener() {
BundleListener bundleListener = new BundleListener() {
public void bundleChanged(BundleEvent event) {
simpleResults.addEvent(this);
}
};
return bundleListener;
}
private BundleListener createSynchronousBundleListener() {
SynchronousBundleListener bundleListener = new SynchronousBundleListener() {
public void bundleChanged(BundleEvent event) {
simpleResults.addEvent(this);
}
};
return bundleListener;
}
private FrameworkListener createFrameworkListener() {
FrameworkListener frameworkListener = new FrameworkListener() {
@Override
public void frameworkEvent(FrameworkEvent event) {
simpleResults.addEvent(this);
}
};
return frameworkListener;
}
private ServiceListener createServiceListener() {
ServiceListener serviceListener = new ServiceListener() {
@Override
public void serviceChanged(ServiceEvent event) {
simpleResults.addEvent(this);
}
};
return serviceListener;
}
private Bundle installBundle(String name) throws BundleException, IOException {
Bundle bundle = bundleContext.installBundle(name, new BundleBuilder().symbolicName(name).build());
assertNotNull(name + " bundle does not exist", bundleContext.getBundle(name));
return bundle;
}
}