/*
* Copyright (c) 2012 - 2016 Jadler contributors
* This program is made available under the terms of the MIT License.
*/
package net.jadler.junit.rule;
import java.nio.charset.Charset;
import net.jadler.Jadler;
import net.jadler.Jadler.OngoingConfiguration;
import net.jadler.JadlerConfiguration;
import net.jadler.KeyValues;
import net.jadler.stubbing.server.StubHttpServer;
import org.junit.rules.ExternalResource;
import static org.apache.commons.lang.Validate.isTrue;
import static org.apache.commons.lang.Validate.notNull;
/**
* JUnit rule which simplifies the creation of a Jadler instance.
*
* @author Christian Galsterer
*/
public class JadlerRule extends ExternalResource implements JadlerConfiguration {
private static final int DEFAULT_PORT = -1;
private final int port;
private final StubHttpServer server;
private String defaultContentType;
private Charset defaultEncoding;
private int defaultStatus = -1;
private boolean skipsRequestsRecording = false;
private KeyValues defaultHeaders = KeyValues.EMPTY;
/**
* Instructs Jadler to use a default stub server {@link net.jadler.stubbing.server.jetty.JettyStubHttpServer}
* serving the http protocol listening on any free port.
*
* See also {@link net.jadler.Jadler#initJadler()}
*/
public JadlerRule() {
this.port = DEFAULT_PORT;
this.server = null;
}
/**
* Instructs Jadler to use a default stub server {@link net.jadler.stubbing.server.jetty.JettyStubHttpServer}
* serving the http protocol listening on the given port.
*
* See also {@link net.jadler.Jadler#initJadlerListeningOn(int)}
*
* @param port port the stub server should be listening on (must be bigger than 0)
*/
public JadlerRule(final int port) {
isTrue(port > 0, "port must be an integer bigger than 0");
this.port = port;
this.server = null;
}
/**
* Instructs Jadler to use use the given stub server instance.
*
* See also {@link net.jadler.Jadler#initJadlerUsing(net.jadler.stubbing.server.StubHttpServer)}
*
* @param server stub server to use
*/
public JadlerRule(final StubHttpServer server) {
notNull(server, "server cannot be null");
this.port = DEFAULT_PORT;
this.server = server;
}
@Override
protected void before() {
final OngoingConfiguration conf;
if (port == DEFAULT_PORT) {
if (server == null) {
conf = Jadler.initJadler();
}
else {
conf = Jadler.initJadlerUsing(server);
}
}
else {
conf = Jadler.initJadlerListeningOn(port);
}
if (this.defaultContentType != null) {
conf.withDefaultResponseContentType(defaultContentType);
}
if (this.defaultEncoding != null) {
conf.withDefaultResponseEncoding(defaultEncoding);
}
if (this.defaultStatus > -1) {
conf.withDefaultResponseStatus(defaultStatus);
}
for (final String name: this.defaultHeaders.getKeys()) {
for (final String value: this.defaultHeaders.getValues(name)) {
conf.withDefaultResponseHeader(name, value);
}
}
if (this.skipsRequestsRecording) {
conf.withRequestsRecordingDisabled();
}
}
@Override
protected void after() {
Jadler.closeJadler();
}
/**
* {@inheritDoc}
*/
@Override
public JadlerRule withDefaultResponseContentType(final String defaultContentType) {
this.defaultContentType = defaultContentType;
return this;
}
/**
* {@inheritDoc}
*/
@Override
public JadlerRule withDefaultResponseEncoding(final Charset defaultEncoding) {
this.defaultEncoding = defaultEncoding;
return this;
}
/**
* {@inheritDoc}
*/
@Override
public JadlerRule withDefaultResponseHeader(final String name, final String value) {
this.defaultHeaders = this.defaultHeaders.add(name, value);
return this;
}
/**
* {@inheritDoc}
*/
@Override
public JadlerRule withDefaultResponseStatus(final int defaultStatus) {
this.defaultStatus = defaultStatus;
return this;
}
/**
* {@inheritDoc}
*/
@Override
public JadlerRule withRequestsRecordingDisabled() {
this.skipsRequestsRecording = true;
return this;
}
}