/****************************************************************************** * 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.ServiceReference; import org.eclipse.gemini.blueprint.iandt.tccl.TCCLService; /** * Test for TCCL handling from the server side. This test checks that the service provider has always priority no matter * the client setting. * * @author Costin Leau * */ public class ServiceTcclTest 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.ServiceTcclTest"; 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/service-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 testSanity() throws Exception { ServiceReference[] refs = bundleContext.getServiceReferences("org.eclipse.gemini.blueprint.iandt.tccl.TCCLService", "(tccl=service-provider)"); System.out.println(bundleContext.getService(refs[0])); } public void testServiceProviderTCCLAndUnmanagedClient() throws Exception { ClassLoader loader = Thread.currentThread().getContextClassLoader(); TCCLService tccl = getUnmanagedTCCL(); assertNotSame("service provide CL hasn't been set", loader, tccl.getTCCL()); } public void testServiceProviderTCCLWithUnmanagedClientWithNullClassLoader() throws Exception { ClassLoader previous = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(null); ClassLoader cl = getUnmanagedTCCL().getTCCL(); assertNotNull("service provide CL hasn't been set", cl); } finally { Thread.currentThread().setContextClassLoader(previous); } } public void testServiceProviderTCCLAndUnmanagedClientWithPredefinedClassLoader() throws Exception { URLClassLoader dummyCL = new URLClassLoader(new URL[0]); ClassLoader previous = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(dummyCL); ClassLoader cl = getUnmanagedTCCL().getTCCL(); assertNotSame(dummyCL, cl); } finally { Thread.currentThread().setContextClassLoader(previous); } } public void testServiceProviderTCCLWithClientTCCLOnClasses() throws Exception { failToLoadClass(getClientTCCL().getTCCL(), CLIENT_CLASS); } public void testServiceProviderTCCLWithClientTCCLOnResources() throws Exception { assertNull(getClientTCCL().getTCCL().getResource(CLIENT_RESOURCE)); } public void testServiceProviderTCCLWithClientTCCLWithServiceClasses() throws Exception { ClassLoader cl = getClientTCCL().getTCCL(); cl.loadClass(SERVICE_PUBLIC_CLASS); cl.loadClass(SERVICE_CLASS); } public void testServiceProviderTCCLWithClientTCCLWithServiceResource() throws Exception { assertNotNull(getClientTCCL().getTCCL().getResource(SERVICE_PUBLIC_CLASS.replace(".", "/").concat(".class"))); assertNotNull(getClientTCCL().getTCCL().getResource(SERVICE_RESOURCE)); } public void testServiceProvidedTCCLOnClasses() throws Exception { 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"); } // provide permission for loading class using the service bundle protected List getTestPermissions() { List perms = super.getTestPermissions(); perms.add(new AdminPermission("(name=org.eclipse.gemini.blueprint.iandt.tccl)", AdminPermission.CLASS)); perms.add(new AdminPermission("(name=org.eclipse.gemini.blueprint.iandt.tccl)", AdminPermission.RESOURCE)); return perms; } }