/* * 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.deployment.model.internal.policy; import static java.util.Collections.emptyList; import static junit.framework.TestCase.fail; import static org.hamcrest.Matchers.contains; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mule.runtime.module.artifact.classloader.ParentFirstLookupStrategy.PARENT_FIRST; import org.mule.runtime.deployment.model.api.policy.PolicyTemplateDescriptor; import org.mule.runtime.module.artifact.classloader.ArtifactClassLoader; import org.mule.runtime.module.artifact.classloader.ClassLoaderLookupPolicy; import org.mule.runtime.module.artifact.classloader.MuleArtifactClassLoader; import org.mule.runtime.module.artifact.classloader.MuleDeployableArtifactClassLoader; import org.mule.tck.junit4.AbstractMuleTestCase; import org.mule.tck.size.SmallTest; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @SmallTest public class PolicyTemplateClassLoaderFactoryTestCase extends AbstractMuleTestCase { private static final String POLICY_ID = "policy/policyId"; private final ClassLoaderLookupPolicy lookupPolicy = mock(ClassLoaderLookupPolicy.class); @Rule public TemporaryFolder policyFolder = new TemporaryFolder(); private PolicyTemplateClassLoaderFactory factory = new PolicyTemplateClassLoaderFactory(); private PolicyTemplateDescriptor descriptor; private ArtifactClassLoader parentClassLoader; @Before public void setUp() throws Exception { descriptor = new PolicyTemplateDescriptor("testPolicy"); descriptor.setRootFolder(policyFolder.getRoot()); parentClassLoader = mock(ArtifactClassLoader.class); when(parentClassLoader.getClassLoader()).thenReturn(getClass().getClassLoader()); when(lookupPolicy.getClassLookupStrategy(anyString())).thenReturn(PARENT_FIRST); when(parentClassLoader.getClassLoaderLookupPolicy()).thenReturn(lookupPolicy); } @Test public void createsEmptyClassLoader() throws Exception { final ArtifactClassLoader artifactClassLoader = factory.create(POLICY_ID, parentClassLoader, descriptor, emptyList()); final MuleArtifactClassLoader classLoader = (MuleArtifactClassLoader) artifactClassLoader.getClassLoader(); assertThat(classLoader.getURLs(), equalTo(new URL[0])); } @Test(expected = IllegalArgumentException.class) public void validatesPolicyFolder() throws Exception { File fakePolicyFolder = new File("./fake/folder/for/test"); descriptor.setRootFolder(fakePolicyFolder); factory.create(POLICY_ID, null, descriptor, emptyList()); } @Test public void usesClassLoaderLookupPolicy() throws Exception { final ArtifactClassLoader artifactClassLoader = factory.create(POLICY_ID, parentClassLoader, descriptor, emptyList()); final MuleArtifactClassLoader classLoader = (MuleArtifactClassLoader) artifactClassLoader.getClassLoader(); final String className = "com.dummy.Foo"; try { classLoader.loadClass(className); fail("Able to load an un-existent class"); } catch (ClassNotFoundException e) { // Expected } verify(lookupPolicy).getClassLookupStrategy(className); } @Test public void createsClassLoaderWithPlugins() throws Exception { ArtifactClassLoader pluginClassLoader1 = mock(ArtifactClassLoader.class); ArtifactClassLoader pluginClassLoader2 = mock(ArtifactClassLoader.class); List<ArtifactClassLoader> artifactPluginClassLoaders = new ArrayList<>(); artifactPluginClassLoaders.add(pluginClassLoader1); artifactPluginClassLoaders.add(pluginClassLoader2); final ArtifactClassLoader artifactClassLoader = factory.create(POLICY_ID, parentClassLoader, descriptor, artifactPluginClassLoaders); final MuleDeployableArtifactClassLoader classLoader = (MuleDeployableArtifactClassLoader) artifactClassLoader.getClassLoader(); assertThat(classLoader.getArtifactPluginClassLoaders(), contains(pluginClassLoader1, pluginClassLoader2)); } }