/*
* 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.application;
import static java.util.Collections.emptyMap;
import static java.util.Optional.of;
import static org.hamcrest.CoreMatchers.isA;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.rules.ExpectedException.none;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mule.runtime.module.deployment.impl.internal.application.MuleApplicationPolicyProvider.createPolicyRegistrationError;
import org.mule.runtime.core.policy.Policy;
import org.mule.runtime.core.policy.PolicyParametrization;
import org.mule.runtime.core.policy.PolicyPointcut;
import org.mule.runtime.deployment.model.api.application.Application;
import org.mule.runtime.deployment.model.api.policy.PolicyRegistrationException;
import org.mule.runtime.deployment.model.api.policy.PolicyTemplate;
import org.mule.runtime.deployment.model.api.policy.PolicyTemplateDescriptor;
import org.mule.runtime.module.artifact.classloader.ArtifactClassLoader;
import org.mule.runtime.module.artifact.classloader.RegionClassLoader;
import org.mule.runtime.module.artifact.descriptor.BundleDescriptor;
import org.mule.runtime.module.deployment.impl.internal.policy.ApplicationPolicyInstance;
import org.mule.runtime.module.deployment.impl.internal.policy.PolicyInstanceProviderFactory;
import org.mule.runtime.module.deployment.impl.internal.policy.PolicyTemplateFactory;
import org.mule.runtime.policy.api.PolicyPointcutParameters;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.io.File;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@SmallTest
public class MuleApplicationPolicyProviderTestCase extends AbstractMuleTestCase {
private static final String POLICY_NAME = "testPolicy";
private static final String POLICY_ID1 = "policyId1";
private static final String POLICY_ID2 = "policyId2";
private static final int ORDER_POLICY1 = 1;
private static final int ORDER_POLICY2 = 2;
private final PolicyInstanceProviderFactory policyInstanceProviderFactory = mock(PolicyInstanceProviderFactory.class);
private final PolicyTemplateFactory policyTemplateFactory = mock(PolicyTemplateFactory.class);
private final MuleApplicationPolicyProvider policyProvider =
new MuleApplicationPolicyProvider(policyTemplateFactory, policyInstanceProviderFactory);
private final Application application = mock(Application.class);
private final PolicyPointcut pointcut = mock(PolicyPointcut.class);
private final PolicyParametrization parametrization1 =
new PolicyParametrization(POLICY_ID1, pointcut, ORDER_POLICY1, emptyMap(), mock(File.class));
private final PolicyParametrization parametrization2 =
new PolicyParametrization(POLICY_ID2, pointcut, ORDER_POLICY2, emptyMap(), mock(File.class));
private final PolicyTemplateDescriptor policyTemplateDescriptor = new PolicyTemplateDescriptor(POLICY_NAME);
private final PolicyPointcutParameters policyPointcutParameters = mock(PolicyPointcutParameters.class);
private PolicyTemplate policyTemplate = mock(PolicyTemplate.class);
private final ApplicationPolicyInstance applicationPolicyInstance1 = mock(ApplicationPolicyInstance.class);
private final ApplicationPolicyInstance applicationPolicyInstance2 = mock(ApplicationPolicyInstance.class);
private final Policy policy1 = mock(Policy.class, POLICY_ID1);
private final Policy policy2 = mock(Policy.class, POLICY_ID2);
private RegionClassLoader regionClassLoader = mock(RegionClassLoader.class);
private ArtifactClassLoader policyClassLoader = mock(ArtifactClassLoader.class);
@Rule
public ExpectedException expectedException = none();
@Before
public void setUp() throws Exception {
policyProvider.setApplication(application);
when(application.getRegionClassLoader()).thenReturn(regionClassLoader);
policyClassLoader = null;
when(policyTemplate.getArtifactClassLoader()).thenReturn(policyClassLoader);
when(policyTemplateFactory.createArtifact(application, policyTemplateDescriptor)).thenReturn(policyTemplate);
when(applicationPolicyInstance1.getPointcut()).thenReturn(pointcut);
when(applicationPolicyInstance1.getOrder()).thenReturn(ORDER_POLICY1);
when(applicationPolicyInstance1.getOperationPolicy()).thenReturn(of(policy1));
when(applicationPolicyInstance1.getSourcePolicy()).thenReturn(of(policy1));
when(applicationPolicyInstance2.getPointcut()).thenReturn(pointcut);
when(applicationPolicyInstance2.getOrder()).thenReturn(ORDER_POLICY2);
when(applicationPolicyInstance2.getOperationPolicy()).thenReturn(of(policy2));
when(applicationPolicyInstance2.getSourcePolicy()).thenReturn(of(policy2));
when(policyInstanceProviderFactory.create(application, policyTemplate, parametrization1)).thenReturn(
applicationPolicyInstance1);
when(policyInstanceProviderFactory.create(application, policyTemplate, parametrization2)).thenReturn(
applicationPolicyInstance2);
policyTemplateDescriptor.setBundleDescriptor(new BundleDescriptor.Builder().setArtifactId(POLICY_NAME).setGroupId("test")
.setVersion("1.0").build());
when(policyTemplate.getDescriptor()).thenReturn(policyTemplateDescriptor);
}
@Test
public void addsOperationPolicy() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(1));
assertThat(parameterizedPolicies.get(0), is(policy1));
}
@Test
public void addsOperationPolicyWithPointCut() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(false);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(0));
}
@Test
public void addsOperationPoliciesInOrder() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(2));
assertThat(parameterizedPolicies.get(0), is(policy1));
assertThat(parameterizedPolicies.get(1), is(policy2));
}
@Test
public void addsOperationPoliciesDisordered() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(2));
assertThat(parameterizedPolicies.get(0), is(policy1));
assertThat(parameterizedPolicies.get(1), is(policy2));
}
@Test
public void addsOperationPoliciesWithAlwaysAcceptingPointCut() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(2));
assertThat(parameterizedPolicies.get(0), is(policy1));
assertThat(parameterizedPolicies.get(1), is(policy2));
}
@Test
public void addsOperationPoliciesWithAlwaysRejectingPointCut() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(false).thenReturn(false);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(0));
}
@Test
public void addsOperationPoliciesWithPointCutAcceptingThenRejecting() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(false);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(1));
assertThat(parameterizedPolicies.get(0), is(policy1));
}
@Test
public void addsOperationPoliciesWithPointCutRejectingThenAccepting() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(false).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findOperationParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(1));
assertThat(parameterizedPolicies.get(0), is(policy2));
}
@Test
public void addsSourcePolicy() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(1));
assertThat(parameterizedPolicies.get(0), is(policy1));
}
@Test
public void addsSourcePolicyWithPointCut() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(false);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(0));
}
@Test
public void addsSourcePoliciesInOrder() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(2));
assertThat(parameterizedPolicies.get(0), is(policy1));
assertThat(parameterizedPolicies.get(1), is(policy2));
}
@Test
public void addsSourcePoliciesDisordered() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(2));
assertThat(parameterizedPolicies.get(0), is(policy1));
assertThat(parameterizedPolicies.get(1), is(policy2));
}
@Test
public void addsSourcePoliciesWithAlwaysAcceptingPointCut() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(2));
assertThat(parameterizedPolicies.get(0), is(policy1));
assertThat(parameterizedPolicies.get(1), is(policy2));
}
@Test
public void addsSourcePoliciesWithAlwaysRejectingPointCut() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(false).thenReturn(false);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(0));
}
@Test
public void addsSourcePoliciesWithPointCutAcceptingThenRejecting() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(true).thenReturn(false);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(1));
assertThat(parameterizedPolicies.get(0), is(policy1));
}
@Test
public void addsSourcePoliciesWithPointCutRejectingThenAccepting() throws Exception {
when(pointcut.matches(policyPointcutParameters)).thenReturn(false).thenReturn(true);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
List<Policy> parameterizedPolicies = policyProvider.findSourceParameterizedPolicies(policyPointcutParameters);
assertThat(parameterizedPolicies.size(), equalTo(1));
assertThat(parameterizedPolicies.get(0), is(policy2));
}
@Test
public void reusesPolicyTemplates() throws Exception {
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
verify(policyTemplateFactory).createArtifact(application, policyTemplateDescriptor);
}
@Test
public void maintainsPolicyTemplatesWhileUsed() throws Exception {
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
assertThat(policyProvider.removePolicy(parametrization1.getId()), is(true));
verify(policyTemplate, never()).dispose();
}
@Test
public void disposesPolicyTemplatesWhenNotUsedAnymore() throws Exception {
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
policyProvider.addPolicy(policyTemplateDescriptor, parametrization2);
assertThat(policyProvider.removePolicy(parametrization1.getId()), is(true));
assertThat(policyProvider.removePolicy(parametrization2.getId()), is(true));
verify(policyTemplate).dispose();
verify(regionClassLoader).removeClassLoader(policyClassLoader);
}
@Test
public void detectsDuplicatePolicyId() throws Exception {
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
expectedException.expect(PolicyRegistrationException.class);
expectedException.expectMessage(createPolicyRegistrationError(POLICY_ID1));
expectedException.expectCause(isA(IllegalArgumentException.class));
policyProvider.addPolicy(policyTemplateDescriptor, parametrization1);
}
}