/*
* 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.module.deployment.impl.internal.policy;
import static java.util.Collections.emptySet;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.mockito.Matchers.anyVararg;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mule.runtime.module.artifact.classloader.DefaultArtifactClassLoaderFilter.NULL_CLASSLOADER_FILTER;
import static org.mule.runtime.module.deployment.impl.internal.policy.DefaultPolicyTemplateFactory.createPolicyTemplateCreationErrorMessage;
import org.mule.runtime.deployment.model.api.application.Application;
import org.mule.runtime.deployment.model.api.application.ApplicationDescriptor;
import org.mule.runtime.deployment.model.api.policy.PolicyTemplate;
import org.mule.runtime.deployment.model.api.policy.PolicyTemplateDescriptor;
import org.mule.runtime.deployment.model.internal.plugin.PluginDependenciesResolver;
import org.mule.runtime.deployment.model.internal.policy.PolicyTemplateClassLoaderBuilder;
import org.mule.runtime.module.artifact.classloader.ArtifactClassLoader;
import org.mule.runtime.module.artifact.classloader.ClassLoaderLookupPolicy;
import org.mule.runtime.module.artifact.classloader.MuleDeployableArtifactClassLoader;
import org.mule.runtime.module.artifact.classloader.RegionClassLoader;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.io.IOException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@SmallTest
public class DefaultPolicyTemplateFactoryTestCase extends AbstractMuleTestCase {
private static final String POLICY_ID = "policyId";
private static final String POLICY_NAME = "testPolicy";
private final PolicyTemplateClassLoaderBuilderFactory classLoaderBuilderFactory =
mock(PolicyTemplateClassLoaderBuilderFactory.class);
private final PluginDependenciesResolver pluginDependenciesResolver =
mock(PluginDependenciesResolver.class);
private final PolicyTemplateFactory policyTemplateFactory =
new DefaultPolicyTemplateFactory(classLoaderBuilderFactory, pluginDependenciesResolver);
@Rule
public ExpectedException expectedException = ExpectedException.none();
private final PolicyTemplateDescriptor descriptor = new PolicyTemplateDescriptor(POLICY_NAME);
@Test
public void createsPolicyTemplate() throws Exception {
RegionClassLoader regionClassLoader = createRegionClassLoader();
PolicyTemplateClassLoaderBuilder policyTemplateClassLoaderBuilder = createPolicyTemplateClassLoaderBuilder(regionClassLoader);
MuleDeployableArtifactClassLoader policyClassLoader = mock(MuleDeployableArtifactClassLoader.class);
when(policyClassLoader.getArtifactId()).thenReturn(POLICY_ID);
when(policyTemplateClassLoaderBuilder.build()).thenReturn(policyClassLoader);
when(classLoaderBuilderFactory.createArtifactClassLoaderBuilder()).thenReturn(policyTemplateClassLoaderBuilder);
PolicyTemplate policyTemplate = policyTemplateFactory.createArtifact(createApplication(regionClassLoader), descriptor);
assertThat(policyTemplate.getArtifactClassLoader(), is(policyClassLoader));
assertThat(policyTemplate.getDescriptor(), is(descriptor));
assertThat(policyTemplate.getArtifactId(), is(POLICY_ID));
assertThat(regionClassLoader.getArtifactPluginClassLoaders().size(), equalTo(1));
}
@Test
public void managesArtifactContextCreationFailure() throws Exception {
RegionClassLoader regionClassLoader = createRegionClassLoader();
PolicyTemplateClassLoaderBuilder policyTemplateClassLoaderBuilder = createPolicyTemplateClassLoaderBuilder(regionClassLoader);
final String errorMessage = "Error";
final IOException exceptionCause = new IOException(errorMessage);
when(policyTemplateClassLoaderBuilder.build()).thenThrow(exceptionCause);
when(classLoaderBuilderFactory.createArtifactClassLoaderBuilder()).thenReturn(policyTemplateClassLoaderBuilder);
this.expectedException.expect(PolicyTemplateCreationException.class);
this.expectedException.expectMessage(createPolicyTemplateCreationErrorMessage(POLICY_NAME));
this.expectedException.expectCause(equalTo(exceptionCause));
policyTemplateFactory.createArtifact(createApplication(regionClassLoader), descriptor);
// Checks that the region was not updated
assertThat(regionClassLoader.getArtifactPluginClassLoaders().size(), equalTo(0));
}
private Application createApplication(RegionClassLoader regionClassLoader) {
ApplicationDescriptor appDescriptor = mock(ApplicationDescriptor.class);
when(appDescriptor.getPlugins()).thenReturn(emptySet());
Application application = mock(Application.class);
when(application.getRegionClassLoader()).thenReturn(regionClassLoader);
when(application.getDescriptor()).thenReturn(appDescriptor);
return application;
}
private PolicyTemplateClassLoaderBuilder createPolicyTemplateClassLoaderBuilder(RegionClassLoader regionClassLoader) {
PolicyTemplateClassLoaderBuilder policyTemplateClassLoaderBuilder = mock(PolicyTemplateClassLoaderBuilder.class);
when(policyTemplateClassLoaderBuilder.setParentClassLoader(regionClassLoader)).thenReturn(policyTemplateClassLoaderBuilder);
when(policyTemplateClassLoaderBuilder.setArtifactDescriptor(descriptor)).thenReturn(policyTemplateClassLoaderBuilder);
when(policyTemplateClassLoaderBuilder.addArtifactPluginDescriptors(anyVararg())).thenReturn(policyTemplateClassLoaderBuilder);
return policyTemplateClassLoaderBuilder;
}
private RegionClassLoader createRegionClassLoader() {
ClassLoaderLookupPolicy lookupPolicy = mock(ClassLoaderLookupPolicy.class);
RegionClassLoader regionClassLoader =
new RegionClassLoader(descriptor.getName(), descriptor, this.getClass().getClassLoader(),
lookupPolicy);
// Adds the owner of the region
ArtifactClassLoader regionOwnerClassLoader = mock(ArtifactClassLoader.class);
regionClassLoader.addClassLoader(regionOwnerClassLoader, NULL_CLASSLOADER_FILTER);
return regionClassLoader;
}
}