blob: 158ee59bd96f9358d4c256af9cfba89673792456 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.iandt.syntheticEvents;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Area;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
import org.eclipse.gemini.blueprint.util.OsgiServiceUtils;
import static org.junit.Assert.assertEquals;
/**
* Integration test for synthetic events delivery of service listeners during
* startup/shutdown.
*
* @author Costin Leau
*
*/
public class ServiceListenerSyntheticEvents extends BaseIntegrationTest {
private Shape area, rectangle, polygon;
private ServiceRegistration areaReg, rectangleReg, polygonReg;
private OsgiBundleXmlApplicationContext appCtx;
private static List referenceBindServices, referenceUnbindServices;
private static List collectionBindServices, collectionUnbindServices;
public static class ReferenceListener {
public void bind(Object service, Map properties) {
referenceBindServices.add(service.toString());
};
public void unbind(Object service, Map properties) {
referenceUnbindServices.add(service.toString());
};
}
public static class CollectionListener {
public void bind(Object service, Map properties) {
collectionBindServices.add(service.toString());
};
public void unbind(Object service, Map properties) {
collectionUnbindServices.add(service.toString());
};
}
// register multiple services of the same type inside OSGi space
private void registerMultipleServices() {
area = new Area();
rectangle = new Rectangle();
polygon = new Polygon();
Dictionary polygonProp = new Properties();
polygonProp.put(Constants.SERVICE_RANKING, new Integer(1));
// first register polygon
polygonReg = bundleContext.registerService(Shape.class.getName(), polygon, polygonProp);
// then rectangle
Dictionary rectangleProp = new Properties();
rectangleProp.put(Constants.SERVICE_RANKING, new Integer(10));
rectangleReg = bundleContext.registerService(Shape.class.getName(), rectangle, rectangleProp);
// then area
Dictionary areaProp = new Properties();
areaProp.put(Constants.SERVICE_RANKING, new Integer(100));
areaReg = bundleContext.registerService(Shape.class.getName(), area, areaProp);
}
protected void onSetUp() {
referenceBindServices = new ArrayList();
referenceUnbindServices = new ArrayList();
collectionBindServices = new ArrayList();
collectionUnbindServices = new ArrayList();
}
protected void onTearDown() {
OsgiServiceUtils.unregisterService(areaReg);
OsgiServiceUtils.unregisterService(rectangleReg);
OsgiServiceUtils.unregisterService(polygonReg);
try {
if (appCtx != null)
appCtx.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
referenceBindServices = null;
referenceUnbindServices = null;
collectionBindServices = null;
collectionUnbindServices = null;
}
private void createAppCtx() {
appCtx = new OsgiBundleXmlApplicationContext(
new String[] { "/org/eclipse/gemini/blueprint/iandt/syntheticEvents/importers.xml" });
appCtx.setBundleContext(bundleContext);
appCtx.refresh();
}
// create appCtx each time since we depend we test startup/shutdown behaviour
// and cannot have shared states
public void testServiceReferenceEventsOnStartupWithMultipleServicesPresent() throws Exception {
registerMultipleServices();
createAppCtx();
assertEquals("only one service bound at startup", 1, referenceBindServices.size());
assertEquals("wrong service bound", area.toString(), referenceBindServices.get(0).toString());
}
public void testServiceReferenceEventsDuringLifetimeWithMultipleServicesPresent() throws Exception {
createAppCtx();
registerMultipleServices();
assertEquals("multiple services should have been bound during runtime", 3, referenceBindServices.size());
assertEquals("wrong 1st service bound", polygon.toString(), referenceBindServices.get(0).toString());
assertEquals("wrong 2nd service bound", rectangle.toString(), referenceBindServices.get(1).toString());
assertEquals("wrong 3rd service bound", area.toString(), referenceBindServices.get(2).toString());
}
public void testServiceReferenceEventsOnShutdownWithMultipleServicesPresent() throws Exception {
createAppCtx();
registerMultipleServices();
appCtx.close();
assertEquals("only one service unbound at shutdown", 1, referenceUnbindServices.size());
assertEquals("wrong unbind at shutdown", area.toString(), referenceUnbindServices.get(0).toString());
appCtx = null;
}
public void testServiceCollectionEventsOnStartupWithMultipleServicesPresent() throws Exception {
registerMultipleServices();
createAppCtx();
assertEquals("all services should have been bound at startup", 3, collectionBindServices.size());
assertEquals("wrong service bound", polygon.toString(), collectionBindServices.get(0).toString());
assertEquals("wrong service bound", rectangle.toString(), collectionBindServices.get(1).toString());
assertEquals("wrong service bound", area.toString(), collectionBindServices.get(2).toString());
}
public void testServiceCollectionEventsDuringLifetimeWithMultipleServicesPresent() throws Exception {
createAppCtx();
registerMultipleServices();
assertEquals("multiple services should have been bound during runtime", 3, referenceBindServices.size());
assertEquals("wrong 1st service bound", polygon.toString(), collectionBindServices.get(0).toString());
assertEquals("wrong 2nd service bound", rectangle.toString(), collectionBindServices.get(1).toString());
assertEquals("wrong 3rd service bound", area.toString(), collectionBindServices.get(2).toString());
}
public void testServiceCollectionEventsOnShutdownWithMultipleServicesPresent() throws Exception {
createAppCtx();
registerMultipleServices();
appCtx.close();
assertEquals("all services should have been bound at startup", 3, collectionUnbindServices.size());
assertEquals("wrong 1st service bound", polygon.toString(), collectionUnbindServices.get(0).toString());
assertEquals("wrong 2nd service bound", rectangle.toString(), collectionUnbindServices.get(1).toString());
assertEquals("wrong 3rd service bound", area.toString(), collectionUnbindServices.get(2).toString());
appCtx = null;
}
}