/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc., Oracle 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.
* Oracle Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.iandt.referenceProxy;
import java.util.List;
import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest;
import org.osgi.framework.AdminPermission;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.eclipse.gemini.blueprint.iandt.reference.proxy.ServiceReferer;
import org.eclipse.gemini.blueprint.iandt.simpleservice.MyService;
import org.eclipse.gemini.blueprint.service.importer.ServiceProxyDestroyedException;
import org.eclipse.gemini.blueprint.util.OsgiBundleUtils;
/**
* @author Glyn Normington
*/
public class ProxyDestructionTest extends BaseIntegrationTest {
protected String[] getTestBundlesNames() {
return new String[] { "org.eclipse.gemini.blueprint.iandt, simple.service," + getSpringDMVersion(),
"org.eclipse.gemini.blueprint.iandt, proxy.destruction," + getSpringDMVersion() };
}
/**
* Install the bundles, stop the one providing the service and then the one
* consuming the service, *after*, an invocation has been made. The test
* checks that shutting down the application context, causes all proxies
* waiting to be destroyed properly.
*
* @throws Exception
*/
public void testProxyDestruction() throws Exception {
MyService reference = ServiceReferer.serviceReference;
assertNotNull("reference not initialized", reference);
assertNotNull("no value specified in the reference", reference.stringValue());
Bundle simpleServiceBundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext,
"org.eclipse.gemini.blueprint.iandt.simpleservice");
assertNotNull("Cannot find the simple service bundle", simpleServiceBundle);
System.out.println("stopping service bundle");
simpleServiceBundle.stop();
while (simpleServiceBundle.getState() == Bundle.STOPPING) {
System.out.println("waiting for service bundle to stop...");
Thread.sleep(500);
}
System.out.println("service bundle stopped");
final Bundle proxyDestructionBundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext,
"org.eclipse.gemini.blueprint.iandt.proxy.destruction");
Thread t = new Thread() {
public void run() {
try {
// wait a bit so the proxy invocation executes
Thread.sleep(3000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
try {
System.out.println("Stopping referring bundle...");
proxyDestructionBundle.stop();
}
catch (BundleException e) {
e.printStackTrace();
}
}
};
t.start();
// Service should be unavailable
try {
System.out.println("Invoking method on OSGi service proxy...");
reference.stringValue();
fail("ServiceProxyDestroyedException should have been thrown!");
}
catch (ServiceProxyDestroyedException e) {
// Expected
}
}
protected long getDefaultWaitTime() {
return 60L;
}
protected List getTestPermissions() {
List perms = super.getTestPermissions();
// export package
perms.add(new AdminPermission("*", AdminPermission.EXECUTE));
perms.add(new AdminPermission("*", AdminPermission.LIFECYCLE));
return perms;
}
}