/*
* 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 java.util.Collections.singleton;
import static java.util.Optional.empty;
import static java.util.Optional.of;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.is;
import static org.junit.rules.ExpectedException.none;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.mule.runtime.api.meta.model.ExtensionModel;
import org.mule.runtime.api.meta.model.operation.OperationModel;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.extension.ExtensionManager;
import org.mule.runtime.extension.api.runtime.ConfigurationInstance;
import org.mule.runtime.extension.api.runtime.ConfigurationProvider;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.util.Optional;
import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@SmallTest
public class CompositeArtifactExtensionManagerTestCase extends AbstractMuleTestCase {
public static final String PROVIDER_NAME = "providerName";
private final ExtensionManager parentExtensionManager = mock(ExtensionManager.class);
private final ExtensionManager childExtensionManager = mock(ExtensionManager.class);
private final OperationModel operationModel = mock(OperationModel.class);
@Rule
public ExpectedException expectedException = none();
@Test
public void providesComposedExtensions() throws Exception {
ExtensionModel parentExtension = mock(ExtensionModel.class);
Set<ExtensionModel> parentExtensions = singleton(parentExtension);
when(parentExtensionManager.getExtensions()).thenReturn(parentExtensions);
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Set<ExtensionModel> extensions = extensionManager.getExtensions();
assertThat(extensions.size(), equalTo(2));
assertThat(extensions, hasItem(parentExtension));
assertThat(extensions, hasItem(childExtension));
}
@Test
public void providesRegisteredExtension() throws Exception {
ExtensionModel parentExtension = mock(ExtensionModel.class);
when(parentExtension.getName()).thenReturn("testExtension");
Set<ExtensionModel> parentExtensions = singleton(parentExtension);
when(parentExtensionManager.getExtensions()).thenReturn(parentExtensions);
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Optional<ExtensionModel> extension = extensionManager.getExtension("testExtension");
assertThat(extension.get(), is(parentExtension));
}
@Test
public void returnsEmptyExtensionWhenNonRegistered() throws Exception {
ExtensionModel parentExtension = mock(ExtensionModel.class);
when(parentExtension.getName()).thenReturn("testExtension");
Set<ExtensionModel> parentExtensions = singleton(parentExtension);
when(parentExtensionManager.getExtensions()).thenReturn(parentExtensions);
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Optional<ExtensionModel> extension = extensionManager.getExtension("fooExtension");
assertThat(extension.isPresent(), is(false));
}
@Test
public void returnsChildConfigurationProviderFromModel() throws Exception {
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
when(parentExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
ConfigurationProvider childConfigurationProvider = mock(ConfigurationProvider.class);
when(childExtensionManager.getConfigurationProvider(childExtension, operationModel))
.thenReturn(of(childConfigurationProvider));
when(parentExtensionManager.getConfigurationProvider(childExtension, operationModel)).thenReturn(empty());
Optional<ConfigurationProvider> configurationProvider =
extensionManager.getConfigurationProvider(childExtension, operationModel);
assertThat(configurationProvider.get(), is(childConfigurationProvider));
}
@Test
public void returnsParentConfigurationProviderFromModel() throws Exception {
ExtensionModel parentExtension = mock(ExtensionModel.class);
Set<ExtensionModel> parentExtensions = singleton(parentExtension);
when(parentExtensionManager.getExtensions()).thenReturn(parentExtensions);
when(childExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
ConfigurationProvider parentConfigurationProvider = mock(ConfigurationProvider.class);
when(parentExtensionManager.getConfigurationProvider(parentExtension, operationModel))
.thenReturn(of(parentConfigurationProvider));
when(childExtensionManager.getConfigurationProvider(parentExtension, operationModel)).thenReturn(empty());
Optional<ConfigurationProvider> configurationProvider =
extensionManager.getConfigurationProvider(parentExtension, operationModel);
assertThat(configurationProvider.get(), is(parentConfigurationProvider));
}
@Test
public void returnsChildConfigurationProviderFromProviderName() throws Exception {
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
when(parentExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
ConfigurationProvider childConfigurationProvider = mock(ConfigurationProvider.class);
when(childExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(of(childConfigurationProvider));
when(parentExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(empty());
Optional<ConfigurationProvider> configurationProvider = extensionManager.getConfigurationProvider(PROVIDER_NAME);
assertThat(configurationProvider.get(), is(childConfigurationProvider));
}
@Test
public void returnsParentConfigurationProviderFromProviderName() throws Exception {
ExtensionModel parentExtension = mock(ExtensionModel.class);
Set<ExtensionModel> parentExtensions = singleton(parentExtension);
when(parentExtensionManager.getExtensions()).thenReturn(parentExtensions);
when(childExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
ConfigurationProvider parentConfigurationProvider = mock(ConfigurationProvider.class);
when(parentExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(of(parentConfigurationProvider));
when(childExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(empty());
Optional<ConfigurationProvider> configurationProvider = extensionManager.getConfigurationProvider(PROVIDER_NAME);
assertThat(configurationProvider.get(), is(parentConfigurationProvider));
}
@Test
public void returnsConfigurationFromProviderName() throws Exception {
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
when(parentExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Event event = mock(Event.class);
ConfigurationProvider childConfigurationProvider = mock(ConfigurationProvider.class);
ConfigurationInstance configurationInstance = mock(ConfigurationInstance.class);
when(childConfigurationProvider.get(event)).thenReturn(configurationInstance);
when(childExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(of(childConfigurationProvider));
when(parentExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(empty());
ConfigurationInstance configuration = extensionManager.getConfiguration(PROVIDER_NAME, event);
assertThat(configuration, is(configurationInstance));
}
@Test
public void failsToObtainMissingConfigurationFromProviderName() throws Exception {
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
when(parentExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Event event = mock(Event.class);
ConfigurationProvider childConfigurationProvider = mock(ConfigurationProvider.class);
ConfigurationInstance configurationInstance = mock(ConfigurationInstance.class);
when(childConfigurationProvider.get(event)).thenReturn(configurationInstance);
when(childExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(empty());
when(parentExtensionManager.getConfigurationProvider(PROVIDER_NAME)).thenReturn(empty());
expectedException.expect(IllegalArgumentException.class);
extensionManager.getConfiguration(PROVIDER_NAME, event);
}
@Test
public void returnsConfigurationFromModel() throws Exception {
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
when(parentExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Event event = mock(Event.class);
ConfigurationProvider childConfigurationProvider = mock(ConfigurationProvider.class);
ConfigurationInstance configurationInstance = mock(ConfigurationInstance.class);
when(childConfigurationProvider.get(event)).thenReturn(configurationInstance);
when(childExtensionManager.getConfigurationProvider(childExtension, operationModel))
.thenReturn(of(childConfigurationProvider));
when(parentExtensionManager.getConfigurationProvider(childExtension, operationModel)).thenReturn(empty());
Optional<ConfigurationInstance> configuration = extensionManager.getConfiguration(childExtension, operationModel, event);
assertThat(configuration.isPresent(), is(true));
assertThat(configuration.get(), is(configurationInstance));
}
@Test
public void failsToObtainMissingConfigurationFromModel() throws Exception {
ExtensionModel childExtension = mock(ExtensionModel.class);
Set<ExtensionModel> childExtensions = singleton(childExtension);
when(childExtensionManager.getExtensions()).thenReturn(childExtensions);
when(parentExtensionManager.getExtensions()).thenReturn(emptySet());
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
Event event = mock(Event.class);
ConfigurationProvider childConfigurationProvider = mock(ConfigurationProvider.class);
ConfigurationInstance configurationInstance = mock(ConfigurationInstance.class);
when(childConfigurationProvider.get(event)).thenReturn(configurationInstance);
when(childExtensionManager.getConfigurationProvider(childExtension, operationModel)).thenReturn(empty());
when(parentExtensionManager.getConfigurationProvider(childExtension, operationModel)).thenReturn(empty());
expectedException.expect(IllegalArgumentException.class);
extensionManager.getConfiguration(childExtension, operationModel, event);
}
@Test
public void doesNotRegisterExtension() throws Exception {
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
expectedException.expect(UnsupportedOperationException.class);
extensionManager.registerExtension(mock(ExtensionModel.class));
}
@Test
public void doesNotParsesExtensionManifestXml() throws Exception {
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
expectedException.expect(UnsupportedOperationException.class);
extensionManager.parseExtensionManifestXml(null);
}
@Test
public void doesNotRegisterConfigurationProviders() throws Exception {
CompositeArtifactExtensionManager extensionManager = new CompositeArtifactExtensionManager(parentExtensionManager,
childExtensionManager);
expectedException.expect(UnsupportedOperationException.class);
extensionManager.registerConfigurationProvider(mock(ConfigurationProvider.class));
}
}