package org.mapfish.print.processor.http;
import com.google.common.base.Predicate;
import jsr166y.ForkJoinPool;
import org.json.JSONException;
import org.junit.Test;
import org.mapfish.print.AbstractMapfishSpringTest;
import org.mapfish.print.TestHttpClientFactory;
import org.mapfish.print.config.Configuration;
import org.mapfish.print.config.ConfigurationFactory;
import org.mapfish.print.config.Template;
import org.mapfish.print.output.Values;
import org.mapfish.print.processor.AbstractProcessor;
import org.mapfish.print.processor.InputOutputValue;
import org.mapfish.print.processor.ProcessorDependencyGraph;
import org.mapfish.print.processor.ProcessorGraphNode;
import org.mapfish.print.processor.map.CreateMapProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.mock.http.client.MockClientHttpRequest;
import org.springframework.test.annotation.DirtiesContext;
import java.net.URI;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import static org.junit.Assert.assertEquals;
public abstract class AbstractHttpProcessorTest extends AbstractMapfishSpringTest {
@Autowired
ConfigurationFactory configurationFactory;
@Autowired
TestHttpClientFactory httpClientFactory;
@Autowired
ForkJoinPool forkJoinPool;
protected abstract String baseDir();
protected abstract Class<? extends AbstractTestProcessor> testProcessorClass();
protected abstract Class<? extends HttpProcessor> classUnderTest();
@Test
@DirtiesContext
public void testExecute() throws Exception {
this.httpClientFactory.registerHandler(new Predicate<URI>() {
@Override
public boolean apply(@Nullable URI input) {
return true;
}
}, new TestHttpClientFactory.Handler() {
@Override
public MockClientHttpRequest handleRequest(URI uri, HttpMethod httpMethod) throws Exception {
return new MockClientHttpRequest(httpMethod, uri);
}
});
this.configurationFactory.setDoValidation(false);
final Configuration config = configurationFactory.getConfig(getFile(baseDir() + "/config.yaml"));
final Template template = config.getTemplate("main");
ProcessorDependencyGraph graph = template.getProcessorGraph();
List<ProcessorGraphNode> roots = graph.getRoots();
assertEquals(1, roots.size());
final ProcessorGraphNode processor = roots.get(0);
assertEquals(classUnderTest(), processor.getProcessor().getClass());
final Set dependencies = processor.getAllProcessors();
dependencies.remove(processor.getProcessor());
assertEquals(1, dependencies.size());
assertEquals(testProcessorClass(), dependencies.iterator().next().getClass());
Values values = new Values();
values.put(Values.CLIENT_HTTP_REQUEST_FACTORY_KEY, new MfClientHttpRequestFactoryProvider(this.httpClientFactory));
values.put(Values.VALUES_KEY, values);
addExtraValues(values);
forkJoinPool.invoke(graph.createTask(values));
}
protected void addExtraValues(Values values) throws JSONException {
// default does nothing
}
@Test
@DirtiesContext
public void testCreateMapDependency() throws Exception {
this.configurationFactory.setDoValidation(false);
final Configuration config = configurationFactory.getConfig(getFile(baseDir() + "/config-createmap.yaml"));
final Template template = config.getTemplate("main");
ProcessorDependencyGraph graph = template.getProcessorGraph();
List<ProcessorGraphNode> roots = graph.getRoots();
assertEquals(1, roots.size());
final ProcessorGraphNode compositeClientHttpRequestFactoryProcessor = roots.get(0);
assertEquals(classUnderTest(), compositeClientHttpRequestFactoryProcessor.getProcessor().getClass());
final Set dependencies = compositeClientHttpRequestFactoryProcessor.getAllProcessors();
dependencies.remove(compositeClientHttpRequestFactoryProcessor.getProcessor());
assertEquals(1, dependencies.size());
assertEquals(CreateMapProcessor.class, dependencies.iterator().next().getClass());
}
public static class TestParam {
@InputOutputValue
public MfClientHttpRequestFactoryProvider clientHttpRequestFactoryProvider;
}
public static abstract class AbstractTestProcessor extends AbstractProcessor<TestParam, Void> {
/**
* Constructor.
*/
protected AbstractTestProcessor() {
super(Void.class);
}
@Override
protected void extraValidation(List<Throwable> validationErrors, final Configuration configuration) {
// do nothing
}
@Nullable
@Override
public TestParam createInputParameter() {
return new TestParam();
}
}
}