/****************************************************************************** * 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.servicedependency; import java.util.List; import java.util.Map; import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest; import org.osgi.framework.AdminPermission; import org.osgi.framework.Bundle; import org.osgi.framework.ServiceReference; import org.eclipse.gemini.blueprint.iandt.tccl.TCCLService; import org.eclipse.gemini.blueprint.util.OsgiBundleUtils; import org.springframework.util.Assert; /** * Integration test for the dependency between exporters and importers. Tests multiple exports relying on the same * importer. * * @author Costin Leau * */ public class MultipleExportersDependingOnOneImporterTest extends BaseIntegrationTest { private static final String DEP_SYN_NAME = "org.eclipse.gemini.blueprint.iandt.tccl"; protected String[] getTestBundlesNames() { // load the tccl bundle as it exposes a simple service return new String[] { "org.eclipse.gemini.blueprint.iandt,tccl.intf," + getSpringDMVersion(), "org.eclipse.gemini.blueprint.iandt,tccl," + getSpringDMVersion() }; } protected synchronized String[] getConfigLocations() { // trigger loading of TCCLService if (TCCLService.class != null) { this.notify(); } return new String[] { "org/eclipse/gemini/blueprint/iandt/servicedependency/multi-export-single-import.xml" }; } // test map-exporter public void testDirectExporterImporterDependency() throws Exception { doServiceTestOn("map", Map.class); } // test simple-bean public void testTransitiveExporterImporterDependency() throws Exception { doServiceTestOn("simple-bean", SimpleBean.class); } protected void doServiceTestOn(String beanName, Class<?> type) throws Exception { ServiceReference ref = bundleContext.getServiceReference(type.getName()); Object service = bundleContext.getService(ref); Assert.isInstanceOf(type, service); assertSame(applicationContext.getBean(beanName), service); Bundle dependency = getDependencyBundle(); // stop bundle (and thus the exposed service) dependency.stop(); // check if map is still published assertNull("exported for " + beanName + " should have been unpublished", ref.getBundle()); // double check the service space assertNull(beanName + " service should be unregistered", bundleContext.getServiceReference(type.getName())); dependency.start(); waitOnContextCreation(DEP_SYN_NAME); // the old reference remains invalid assertNull("the reference should remain invalid", ref.getBundle()); // but the service should be back again assertSame(applicationContext.getBean(beanName), service); } public void testTwoExportersWithTheSameImporter() throws Exception { // check that both exporters go down one mandatory goes down ServiceReference exporterARef = bundleContext.getServiceReference(Map.class.getName()); ServiceReference exporterBRef = bundleContext.getServiceReference(SimpleBean.class.getName()); Bundle dependency = getDependencyBundle(); dependency.stop(); // check if services are still published assertNull("exportedA should have been unpublished", exporterARef.getBundle()); assertNull("exportedB should have been unpublished", exporterBRef.getBundle()); // double check the service space assertNull("exporterA service should be unregistered", bundleContext.getServiceReference(Map.class.getName())); assertNull("exporterB service should be unregistered", bundleContext.getServiceReference(SimpleBean.class .getName())); dependency.start(); waitOnContextCreation(DEP_SYN_NAME); // the old reference remains invalid assertNull("the reference should remain invalid", exporterARef.getBundle()); assertNull("the reference should remain invalid", exporterBRef.getBundle()); assertNotNull(bundleContext.getServiceReference(Map.class.getName())); assertNotNull(bundleContext.getServiceReference(SimpleBean.class.getName())); } protected Bundle getDependencyBundle() { return OsgiBundleUtils.findBundleBySymbolicName(bundleContext, DEP_SYN_NAME); } protected List getTestPermissions() { List perms = super.getTestPermissions(); // export package perms.add(new AdminPermission("*", AdminPermission.EXECUTE)); return perms; } }