blob: e9fad2f343050dd5bf3378e07af640b74d01385e [file] [log] [blame]
/******************************************************************************
* 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.duplicateClass;
import java.io.FilePermission;
import java.util.List;
import java.util.PropertyPermission;
import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest;
import org.osgi.framework.AdminPermission;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceReference;
import org.eclipse.gemini.blueprint.iandt.simpleservice.MyService;
import org.eclipse.gemini.blueprint.util.OsgiStringUtils;
/**
* Test which installs twice a bundle with the same symbolic name but with
* different classes to check that proper reloading occurs.
*
* @author Andy Piper
*/
public class DuplicateClassTest extends BaseIntegrationTest {
private static final String DEPENDENT_CLASS_NAME = "org.eclipse.gemini.blueprint.iandt.simpleservice.MyService";
protected String getManifestLocation() {
return "classpath:org/eclipse/gemini/blueprint/iandt/duplicateClass/DuplicateClassTest.MF";
}
public void testDependencies() throws Exception {
// Simple Service bundle (provides the base package + 1 service)
Bundle simpleServiceBundle = bundleContext.installBundle(getLocator().locateArtifact(
"org.eclipse.gemini.blueprint.iandt", "simple.service", getGeminiBlueprintVersion()).getURL().toExternalForm());
assertNotNull("Cannot find the simple service bundle", simpleServiceBundle);
assertNotSame("simple service bundle is in the activated state!", new Integer(Bundle.ACTIVE), new Integer(
simpleServiceBundle.getState()));
startDependency(simpleServiceBundle);
// Identical Simple Service bundle (+1 service)
Bundle simpleServiceDuplicateBundle = bundleContext.installBundle(getLocator().locateArtifact(
"org.eclipse.gemini.blueprint.iandt", "simple.service.identical", getGeminiBlueprintVersion()).getURL().toExternalForm());
assertNotNull("Cannot find the simple service duplicate bundle", simpleServiceDuplicateBundle);
assertNotSame("simple service 2 bundle is in the activated state!", new Integer(Bundle.ACTIVE), new Integer(
simpleServiceDuplicateBundle.getState()));
startDependency(simpleServiceDuplicateBundle);
ServiceReference[] refs = bundleContext.getServiceReferences(DEPENDENT_CLASS_NAME, null);
assertEquals(2, refs.length);
MyService service1 = (MyService) bundleContext.getService(refs[0]);
MyService service2 = (MyService) bundleContext.getService(refs[1]);
assertNotNull(service1);
assertNotNull(service2);
String msg1 = service1.stringValue();
String msg2 = service2.stringValue();
String jmsg = "Bond. James Bond.";
String cmsg = "Connery. Sean Connery #1";
System.out.println(msg1);
System.out.println(msg2);
assertNotSame(msg1, msg2);
assertTrue(msg1.equals(jmsg) || msg1.equals(cmsg));
assertTrue(msg2.equals(jmsg) || msg2.equals(cmsg));
bundleContext.ungetService(refs[0]);
bundleContext.ungetService(refs[1]);
// Uninstall duplicate 1
simpleServiceDuplicateBundle.uninstall();
// stop base bundle so that the package is still around but its service
// is not
simpleServiceBundle.stop();
// Install something subtley different
simpleServiceDuplicateBundle = bundleContext.installBundle(getLocator().locateArtifact(
"org.eclipse.gemini.blueprint.iandt", "simple.service.2.identical", getGeminiBlueprintVersion()).getURL().toExternalForm());
assertNotNull("Cannot find the simple service duplicate 2 bundle", simpleServiceDuplicateBundle);
startDependency(simpleServiceDuplicateBundle);
refs = bundleContext.getServiceReferences(DEPENDENT_CLASS_NAME, null);
assertEquals(1, refs.length);
service1 = (MyService) bundleContext.getService(refs[0]);
assertNotNull(service1);
msg1 = service1.stringValue();
System.out.println(msg1);
assertTrue(msg1.equals("Dalton. Timothy Dalton #1"));
}
private void startDependency(Bundle bundle) throws BundleException, InterruptedException {
bundle.start();
waitOnContextCreation(bundle.getSymbolicName());
System.out.println("started bundle [" + OsgiStringUtils.nullSafeSymbolicName(bundle) + "]");
}
protected boolean shouldWaitForSpringBundlesContextCreation() {
return true;
}
protected long getDefaultWaitTime() {
return 60L;
}
protected List getTestPermissions() {
List list = super.getTestPermissions();
list.add(new FilePermission("<<ALL FILES>>", "read"));
list.add(new AdminPermission("*", AdminPermission.EXECUTE));
list.add(new AdminPermission("*", AdminPermission.LIFECYCLE));
list.add(new AdminPermission("*", AdminPermission.RESOLVE));
list.add(new AdminPermission("*", AdminPermission.METADATA));
return list;
}
protected List getIAndTPermissions() {
List perms = super.getIAndTPermissions();
perms.add(new PropertyPermission("*", "read"));
perms.add(new PropertyPermission("*", "write"));
return perms;
}
}