/*
* 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.functional.junit4;
import org.mule.runtime.api.message.Message;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.TransformationService;
import org.mule.runtime.core.api.config.ConfigurationBuilder;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.probe.PollingProber;
import org.mule.tck.probe.Probe;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
public abstract class DomainFunctionalTestCase extends AbstractMuleTestCase {
private final Map<String, MuleContext> muleContexts = new HashMap<>();
private final List<MuleContext> disposedContexts = new ArrayList<>();
private MuleContext domainContext;
protected String getDomainConfig() {
return null;
}
protected String[] getDomainConfigs() {
return new String[] {getDomainConfig()};
}
public synchronized void disposeMuleContext(final MuleContext muleContext) {
disposedContexts.add(muleContext);
muleContext.dispose();
new PollingProber(10000, 100).check(new Probe() {
@Override
public boolean isSatisfied() {
return muleContext.isDisposed();
}
@Override
public String describeFailure() {
return "mule context timeout during dispose";
}
});
}
@Before
public void setUpMuleContexts() throws Exception {
final DomainContextBuilder domainContextBuilder = new DomainContextBuilder() {
@Override
protected void addBuilders(List<ConfigurationBuilder> builders) {
super.addBuilders(builders);
if (getBuilder() != null) {
builders.add(getBuilder());
}
}
}.setDomainConfig(getDomainConfigs());
domainContext = domainContextBuilder.build();
ApplicationConfig[] applicationConfigs = getConfigResources();
for (ApplicationConfig applicationConfig : applicationConfigs) {
MuleContext muleContext = createAppMuleContext(applicationConfig.applicationResources);
muleContexts.put(applicationConfig.applicationName, muleContext);
}
}
@After
public void disposeMuleContexts() {
for (MuleContext muleContext : muleContexts.values()) {
try {
disposeMuleContext(muleContext);
} catch (Exception e) {
// Nothing to do
}
}
muleContexts.clear();
disposeMuleContext(domainContext);
}
protected MuleContext createAppMuleContext(String[] configResource) throws Exception {
return new ApplicationContextBuilder().setDomainContext(domainContext).setApplicationResources(configResource).build();
}
public abstract ApplicationConfig[] getConfigResources();
public MuleContext getMuleContextForApp(String applicationName) {
return muleContexts.get(applicationName);
}
public MuleContext getMuleContextForDomain() {
return domainContext;
}
protected ConfigurationBuilder getBuilder() {
return null;
}
public static class ApplicationConfig {
String applicationName;
String[] applicationResources;
public ApplicationConfig(String applicationName, String... applicationResources) {
this.applicationName = applicationName;
this.applicationResources = applicationResources;
}
}
/**
* Uses {@link TransformationService} to get a {@link String} representation of a message.
*
* @param message message to get payload from
* @return String representation of the message payload
* @throws Exception if there is an unexpected error obtaining the payload representation
*/
protected String getPayloadAsString(Message message, MuleContext muleContext) throws Exception {
return (String) muleContext.getTransformationService().transform(message, DataType.STRING).getPayload().getValue();
}
}