blob: 7c33124f966f4915eed058f9290437a9da3d6579 [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.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.simpleservice.MyService;
import org.eclipse.gemini.blueprint.iandt.tccl.TCCLService;
import org.eclipse.gemini.blueprint.util.OsgiBundleUtils;
import org.springframework.util.Assert;
/**
* @author Costin Leau
*
*/
public class CollectionImporterTest extends BaseIntegrationTest {
private static final String TCCL_SYM_NAME = "org.eclipse.gemini.blueprint.iandt.tccl";
private static final String SERVICE_SYM_NAME = "org.eclipse.gemini.blueprint.iandt.simpleservice";
protected String[] getConfigLocations() {
return new String[] { "org/eclipse/gemini/blueprint/iandt/servicedependency/multi-export-multi-collection-import.xml" };
}
protected String[] getTestBundlesNames() {
// load the tccl bundle, plus simple.service
return new String[] { "org.eclipse.gemini.blueprint.iandt,tccl.intf," + getGeminiBlueprintVersion(),
"org.eclipse.gemini.blueprint.iandt, tccl," + getGeminiBlueprintVersion(),
"org.eclipse.gemini.blueprint.iandt, simple.service," + getGeminiBlueprintVersion() };
}
public void testExporterAWhenImporterAGoesDownAndUp() throws Exception {
assertTrue("exporterA should be running", isExporterAStarted());
logger.info("Taking down serviceA...");
takeDownServiceA();
assertFalse("serviceA should take exporterA down", isExporterAStarted());
logger.info("Putting up serviceA...");
putUpServiceA();
// check exporter
assertTrue("serviceA is up again, so should exporterA", isExporterAStarted());
}
public void testExporterBWhenImporterAGoesDownAndUp() throws Exception {
assertTrue("exporterB should be running", isExporterBStarted());
logger.info("Taking down serviceA...");
takeDownServiceA();
assertFalse("serviceA should take exporterB down", isExporterBStarted());
logger.info("Putting up serviceA...");
putUpServiceA();
// check exporter
assertTrue("service A is up again, so should exporterB", isExporterBStarted());
}
public void testExporterBWhenImporterAGoesDownThenImporterBThenBothUpAgain() throws Exception {
assertTrue("exporterB should be running", isExporterBStarted());
takeDownServiceA();
assertFalse("serviceA should take exporterB down", isExporterBStarted());
// take down B
takeDownServiceC();
// check exporter
assertFalse("serviceC down should keep exporterB down", isExporterBStarted());
putUpServiceA();
// check exporter
assertFalse("service C is still down and so should be exporterB", isExporterBStarted());
putUpServiceC();
// check exporter
assertTrue("service A,B up -> exporterB up", isExporterBStarted());
}
private void checkAndTakeDownService(String beanName, Class<?> type, String bundleSymName) throws Exception {
ServiceReference ref = bundleContext.getServiceReference(type.getName());
Object service = bundleContext.getService(ref);
Assert.isInstanceOf(type, service);
Bundle dependency = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, bundleSymName);
// stop dependency bundle -> no importer -> exporter goes down
dependency.stop();
}
private void putUpService(String bundleSymName) throws Exception {
Bundle dependency = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, bundleSymName);
dependency.start();
waitOnContextCreation(bundleSymName);
}
private void takeDownServiceA() throws Exception {
checkAndTakeDownService("serviceA", MyService.class, SERVICE_SYM_NAME);
}
private void putUpServiceA() throws Exception {
putUpService(SERVICE_SYM_NAME);
}
private void takeDownServiceC() throws Exception {
checkAndTakeDownService("serviceC", TCCLService.class, TCCL_SYM_NAME);
}
private void putUpServiceC() throws Exception {
putUpService(TCCL_SYM_NAME);
}
private boolean isExporterBStarted() throws Exception {
return (bundleContext.getServiceReference(SimpleBean.class.getName()) != null);
}
private boolean isExporterAStarted() throws Exception {
return (bundleContext.getServiceReference(Map.class.getName()) != null);
}
protected List getTestPermissions() {
List perms = super.getTestPermissions();
// export package
perms.add(new AdminPermission("*", AdminPermission.EXECUTE));
return perms;
}
}