/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.container.internal; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static java.util.Collections.singletonMap; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.sameInstance; import static org.junit.rules.ExpectedException.none; import static org.mule.runtime.container.internal.MuleClassLoaderLookupPolicy.invalidLookupPolicyOverrideError; import static org.mule.runtime.module.artifact.classloader.ChildFirstLookupStrategy.CHILD_FIRST; import static org.mule.runtime.module.artifact.classloader.ParentFirstLookupStrategy.PARENT_FIRST; import static org.mule.runtime.module.artifact.classloader.ParentOnlyLookupStrategy.PARENT_ONLY; import org.mule.runtime.module.artifact.classloader.ClassLoaderLookupPolicy; import org.mule.runtime.module.artifact.classloader.LookupStrategy; import org.mule.tck.junit4.AbstractMuleTestCase; import org.mule.tck.size.SmallTest; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @SmallTest public class MuleClassLoaderLookupPolicyProviderTestCase extends AbstractMuleTestCase { private static final String FOO_PACKAGE = "org.foo"; private static final String FOO_PACKAGE_PREFIX = FOO_PACKAGE + "."; private static final String FOO_CLASS = FOO_PACKAGE_PREFIX + "Object"; private static final String SYSTEM_PACKAGE = "java"; private static final String JAVA_PACKAGE = SYSTEM_PACKAGE + ".lang"; private static final String JAVA_PACKAGE_PREFIX = JAVA_PACKAGE + "."; @Rule public ExpectedException expectedException = none(); @Test public void extendingCustomLookupStrategyForSystemPackage() throws Exception { final String overrideClassName = Object.class.getName(); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(invalidLookupPolicyOverrideError(overrideClassName)); new MuleClassLoaderLookupPolicy(emptyMap(), singleton(SYSTEM_PACKAGE)) .extend(singletonMap(overrideClassName, CHILD_FIRST)); } @Test public void returnsConfiguredLookupStrategy() throws Exception { MuleClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(singletonMap(JAVA_PACKAGE, CHILD_FIRST), emptySet()); LookupStrategy lookupStrategy = lookupPolicy.getClassLookupStrategy(Object.class.getName()); assertThat(lookupStrategy, sameInstance(CHILD_FIRST)); lookupPolicy = new MuleClassLoaderLookupPolicy(singletonMap(JAVA_PACKAGE_PREFIX, CHILD_FIRST), emptySet()); lookupStrategy = lookupPolicy.getClassLookupStrategy(Object.class.getName()); assertThat(lookupStrategy, sameInstance(CHILD_FIRST)); } @Test public void usesParentOnlyForSystemPackage() throws Exception { ClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(emptyMap(), singleton(SYSTEM_PACKAGE)); assertThat(lookupPolicy.getClassLookupStrategy(Object.class.getName()), sameInstance(PARENT_ONLY)); lookupPolicy = new MuleClassLoaderLookupPolicy(emptyMap(), singleton(JAVA_PACKAGE)); assertThat(lookupPolicy.getClassLookupStrategy(Object.class.getName()), sameInstance(PARENT_ONLY)); } @Test public void usesChildFirstForNoConfiguredPackage() throws Exception { ClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(emptyMap(), emptySet()); assertThat(lookupPolicy.getClassLookupStrategy(FOO_CLASS), sameInstance(CHILD_FIRST)); } @Test public void extendsPolicy() throws Exception { ClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(emptyMap(), emptySet()); final ClassLoaderLookupPolicy extendedPolicy = lookupPolicy.extend(singletonMap(FOO_PACKAGE, PARENT_FIRST)); assertThat(extendedPolicy.getClassLookupStrategy(FOO_CLASS), sameInstance(PARENT_FIRST)); } @Test public void maintainsOriginalLookupStrategy() throws Exception { ClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(singletonMap(FOO_PACKAGE, new ContainerOnlyLookupStrategy(getClass().getClassLoader())), emptySet()); final ClassLoaderLookupPolicy extendedPolicy = lookupPolicy.extend(singletonMap(FOO_PACKAGE, PARENT_FIRST)); assertThat(extendedPolicy.getClassLookupStrategy(FOO_CLASS), instanceOf(ContainerOnlyLookupStrategy.class)); assertThat(extendedPolicy.getClassLookupStrategy(FOO_CLASS).getClassLoaders(getClass().getClassLoader()), contains(getClass().getClassLoader())); } @Test public void normalizesLookupStrategies() throws Exception { ClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(singletonMap(FOO_PACKAGE, new ContainerOnlyLookupStrategy(getClass().getClassLoader())), emptySet()); final ClassLoaderLookupPolicy extendedPolicy = lookupPolicy.extend(singletonMap(FOO_PACKAGE_PREFIX, PARENT_FIRST)); assertThat(extendedPolicy.getClassLookupStrategy(FOO_CLASS), instanceOf(ContainerOnlyLookupStrategy.class)); assertThat(extendedPolicy.getClassLookupStrategy(FOO_CLASS).getClassLoaders(getClass().getClassLoader()), contains(getClass().getClassLoader())); } @Test public void cannotExtendPolicyWithSystemPackage() throws Exception { ClassLoaderLookupPolicy lookupPolicy = new MuleClassLoaderLookupPolicy(emptyMap(), singleton(SYSTEM_PACKAGE)); final String overrideClassName = Object.class.getName(); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(invalidLookupPolicyOverrideError(overrideClassName)); lookupPolicy.extend(singletonMap(overrideClassName, PARENT_FIRST)); } }