/******************************************************************************
* 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.tcclManagement;
import java.net.URL;
import java.net.URLClassLoader;
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.tccl.TCCLService;
import org.eclipse.gemini.blueprint.util.OsgiBundleUtils;
/**
* Test for TCCL handling only on the client side. That is the service doesn't provide any handling.
*
* @author Costin Leau
*
*/
public class ClientOnlyTcclTest extends BaseIntegrationTest {
private static final String CLIENT_RESOURCE =
"/org/eclipse/gemini/blueprint/iandt/tcclManagement/client-resource.properties";
private static final String SERVICE_RESOURCE =
"/org/eclipse/gemini/blueprint/iandt/tccl/internal/internal-resource.file";
private static final String SERVICE_PUBLIC_RESOURCE = "/org/eclipse/gemini/blueprint/iandt/tccl/service-resource.file";
private static final String CLIENT_CLASS = "org.eclipse.gemini.blueprint.iandt.tcclManagement.ClientOnlyTcclTest";
private static final String SERVICE_CLASS =
"org.eclipse.gemini.blueprint.iandt.tccl.internal.PrivateTCCLServiceImplementation";
private static final String SERVICE_PUBLIC_CLASS = "org.eclipse.gemini.blueprint.iandt.tccl.TCCLService";
protected String[] getConfigLocations() {
return new String[] { "/org/eclipse/gemini/blueprint/iandt/tcclManagement/client-context.xml" };
}
protected String[] getTestBundlesNames() {
return new String[] { "org.eclipse.gemini.blueprint.iandt,tccl.intf," + getSpringDMVersion(),
"org.eclipse.gemini.blueprint.iandt,tccl," + getSpringDMVersion() };
}
public void testTCCLUnmanaged() throws Exception {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
TCCLService tccl = getUnmanagedTCCL();
assertSame(loader, tccl.getTCCL());
}
public void testTCCLUnmanagedWithNullClassLoader() throws Exception {
ClassLoader previous = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(null);
ClassLoader cl = getUnmanagedTCCL().getTCCL();
assertNull(cl);
} finally {
Thread.currentThread().setContextClassLoader(previous);
}
}
public void testTCCLUnmanagedWithPredefinedClassLoader() throws Exception {
URLClassLoader dummyCL = new URLClassLoader(new URL[0]);
ClassLoader previous = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(dummyCL);
ClassLoader cl = getUnmanagedTCCL().getTCCL();
assertSame(dummyCL, cl);
} finally {
Thread.currentThread().setContextClassLoader(previous);
}
}
public void testClientTCCLOnClientClasses() throws Exception {
ClassLoader clientCL = getClientTCCL().getTCCL();
assertNotNull(clientCL);
assertNotNull(clientCL.loadClass(CLIENT_CLASS));
}
public void testClientTCCLOnClientResources() throws Exception {
ClassLoader clientCL = getClientTCCL().getTCCL();
assertNotNull(clientCL);
assertNotNull(clientCL.getResource(CLIENT_RESOURCE));
}
public void testClientTCCLWithServiceClasses() throws Exception {
ClassLoader current = Thread.currentThread().getContextClassLoader();
ClassLoader cl = getClientTCCL().getTCCL();
System.out.println("current :" + current);
System.out.println("cl : " + cl);
cl.loadClass(SERVICE_PUBLIC_CLASS);
failToLoadClass(cl, SERVICE_CLASS);
}
public void testClientTCCLWithServiceResource() throws Exception {
assertNull(getClientTCCL().getTCCL().getResource(SERVICE_RESOURCE));
}
public void testServiceProvidedTCCLOnClasses() throws Exception {
refreshTCCLBundle();
ClassLoader cl = getServiceProviderTCCL().getTCCL();
cl.loadClass(SERVICE_PUBLIC_CLASS);
cl.loadClass(SERVICE_CLASS);
}
public void testServiceProvidedTCCLOnResources() throws Exception {
assertNotNull(getServiceProviderTCCL().getTCCL().getResource(SERVICE_RESOURCE));
}
public void testServiceProviderTCCLOnClientClasses() throws Exception {
failToLoadClass(getServiceProviderTCCL().getTCCL(), CLIENT_CLASS);
}
public void testServiceProviderTCCLOnClientResources() throws Exception {
assertNull(getServiceProviderTCCL().getTCCL().getResource(CLIENT_RESOURCE));
}
private void failToLoadClass(ClassLoader cl, String className) {
try {
cl.loadClass(className);
fail("shouldn't be able to load class " + className);
} catch (ClassNotFoundException cnfe) {
// expected
}
}
private TCCLService getUnmanagedTCCL() {
return (TCCLService) applicationContext.getBean("unmanaged");
}
private TCCLService getServiceProviderTCCL() {
return (TCCLService) applicationContext.getBean("service-provider");
}
private TCCLService getClientTCCL() {
return (TCCLService) applicationContext.getBean("client");
}
private void refreshTCCLBundle() {
Bundle bundle = OsgiBundleUtils.findBundleBySymbolicName(bundleContext, "org.eclipse.gemini.blueprint.iandt.tccl");
try {
bundle.update();
} catch (BundleException be) {
}
}
protected List getTestPermissions() {
List perms = super.getTestPermissions();
perms.add(new AdminPermission("(name=org.eclipse.gemini.blueprint.iandt.tccl)", AdminPermission.RESOURCE));
perms.add(new AdminPermission("(name=org.eclipse.gemini.blueprint.iandt.tccl)", AdminPermission.CLASS));
return perms;
}
}