Skip to content

Commit

Permalink
#32 - first part of supporting selective request forwarding
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesdbloom committed May 12, 2014
1 parent 1d1ff5f commit 667c751
Show file tree
Hide file tree
Showing 39 changed files with 1,531 additions and 184 deletions.
Expand Up @@ -2,6 +2,7 @@

import com.google.common.annotations.VisibleForTesting;
import org.mockserver.mock.Expectation;
import org.mockserver.model.HttpForward;
import org.mockserver.model.HttpResponse;

/**
Expand All @@ -22,6 +23,11 @@ public void respond(HttpResponse httpResponse) {
mockServerClient.sendExpectation(expectation);
}

public void forward(HttpForward httpForward) {
expectation.thenForward(httpForward);
mockServerClient.sendExpectation(expectation);
}

@VisibleForTesting
Expectation getExpectation() {
return expectation;
Expand Down
Expand Up @@ -6,10 +6,7 @@
import org.mockito.Mock;
import org.mockserver.client.http.ApacheHttpClient;
import org.mockserver.client.serialization.ExpectationSerializer;
import org.mockserver.client.serialization.model.ExpectationDTO;
import org.mockserver.client.serialization.model.HttpRequestDTO;
import org.mockserver.client.serialization.model.HttpResponseDTO;
import org.mockserver.client.serialization.model.TimesDTO;
import org.mockserver.client.serialization.model.*;
import org.mockserver.matchers.Times;
import org.mockserver.mock.Expectation;
import org.mockserver.model.*;
Expand Down Expand Up @@ -42,7 +39,7 @@ public void setupTestFixture() throws Exception {
}

@Test
public void shouldSetupExpectation() {
public void shouldSetupExpectationWithResponse() {
// given
HttpRequest httpRequest =
new HttpRequest()
Expand All @@ -64,6 +61,30 @@ public void shouldSetupExpectation() {
assertEquals(Times.unlimited(), expectation.getTimes());
}

@Test
public void shouldSetupExpectationWithForward() {
// given
HttpRequest httpRequest =
new HttpRequest()
.withPath("/some_path")
.withBody(new StringBody("some_request_body", Body.Type.EXACT));
HttpForward httpForward =
new HttpForward()
.withHost("some_host")
.withPort(9090)
.withScheme(HttpForward.Scheme.HTTPS);

// when
ForwardChainExpectation forwardChainExpectation = mockServerClient.when(httpRequest);
forwardChainExpectation.forward(httpForward);

// then
Expectation expectation = forwardChainExpectation.getExpectation();
assertTrue(expectation.matches(httpRequest));
assertSame(httpForward, expectation.getHttpForward());
assertEquals(Times.unlimited(), expectation.getTimes());
}

@Test
public void shouldSendExpectationRequestWithExactTimes() throws Exception {
// when
Expand All @@ -90,6 +111,38 @@ public void shouldSendExpectationRequestWithExactTimes() throws Exception {
.withBody("some_response_body")
.withHeaders(new Header("responseName", "responseValue"))))
.setTimes(new TimesDTO(Times.exactly(3)))
.buildObject()
);
}

@Test
public void shouldSendExpectationWithForward() throws Exception {
// when
mockServerClient
.when(
new HttpRequest()
.withPath("/some_path")
.withBody(new StringBody("some_request_body", Body.Type.EXACT)),
Times.exactly(3)
)
.forward(
new HttpForward()
.withHost("some_host")
.withPort(9090)
.withScheme(HttpForward.Scheme.HTTPS)
);

// then
verify(expectationSerializer).serialize(
new ExpectationDTO()
.setHttpRequest(new HttpRequestDTO(new HttpRequest()
.withPath("/some_path")
.withBody(new StringBody("some_request_body", Body.Type.EXACT))))
.setHttpForward(new HttpForwardDTO(new HttpForward()
.withHost("some_host")
.withPort(9090)
.withScheme(HttpForward.Scheme.HTTPS)))
.setTimes(new TimesDTO(Times.exactly(3)))
.buildObject());
}

Expand Down
Expand Up @@ -3,10 +3,7 @@
import org.apache.commons.io.Charsets;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.mockserver.client.serialization.model.ExpectationDTO;
import org.mockserver.mock.Expectation;
import org.mockserver.model.*;
Expand Down Expand Up @@ -41,6 +38,7 @@ public String serializeAsJava(Expectation expectation) {
if (expectation != null) {
HttpRequest httpRequest = expectation.getHttpRequest();
HttpResponse httpResponse = expectation.getHttpResponse();
HttpForward httpForward = expectation.getHttpForward();
output.append("\n" +
"new MockServerClient()\n" +
" .when(\n" +
Expand Down Expand Up @@ -74,22 +72,38 @@ public String serializeAsJava(Expectation expectation) {
}
output.append(",\n" +
" Times.once()\n" +
" )\n" +
" .thenRespond(\n" +
" response()\n");
if (httpResponse.getStatusCode() != null) {
output.append(" .withStatusCode(").append(httpResponse.getStatusCode()).append(")");
}
if (httpResponse.getHeaders().size() > 0) {
serializeAsJavaKeyToMultiValue(output, "Header", new ArrayList<KeyToMultiValue>(httpResponse.getHeaders()));
}
if (httpResponse.getCookies().size() > 0) {
serializeAsJavaKeyToMultiValue(output, "Cookie", new ArrayList<KeyToMultiValue>(httpResponse.getCookies()));
" )\n");
if (httpResponse != null) {
output.append(" .thenRespond(\n" +
" response()\n");
if (httpResponse.getStatusCode() != null) {
output.append(" .withStatusCode(").append(httpResponse.getStatusCode()).append(")");
}
if (httpResponse.getHeaders().size() > 0) {
serializeAsJavaKeyToMultiValue(output, "Header", new ArrayList<KeyToMultiValue>(httpResponse.getHeaders()));
}
if (httpResponse.getCookies().size() > 0) {
serializeAsJavaKeyToMultiValue(output, "Cookie", new ArrayList<KeyToMultiValue>(httpResponse.getCookies()));
}
if (httpResponse.getBody() != null && httpResponse.getBody().length > 0) {
output.append("\n .withBody(\"").append(StringEscapeUtils.escapeJava(new String(httpResponse.getBody(), Charsets.UTF_8))).append("\")");
}
output.append("\n );");
}
if (httpResponse.getBody() != null && httpResponse.getBody().length > 0) {
output.append("\n .withBody(\"").append(StringEscapeUtils.escapeJava(new String(httpResponse.getBody(), Charsets.UTF_8))).append("\")");
if (httpForward != null) {
output.append(" .thenForward(\n" +
" forward()\n");
if (httpForward.getHost() != null) {
output.append(" .withHost(").append(httpForward.getHost()).append(")");
}
if (httpForward.getPort() != null) {
output.append(" .withPort(").append(httpForward.getPort()).append(")");
}
if (httpForward.getScheme() != null) {
output.append(" .withScheme(").append(httpForward.getScheme()).append(")");
}
output.append("\n );");
}
output.append("\n );");
}

return output.toString();
Expand Down
Expand Up @@ -3,17 +3,18 @@
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.deser.std.StdDeserializer;
import org.codehaus.jackson.map.module.SimpleModule;
import org.mockserver.client.serialization.model.BinaryBodyDTO;
import org.mockserver.client.serialization.model.BodyDTO;
import org.mockserver.client.serialization.model.ParameterBodyDTO;
import org.mockserver.client.serialization.model.StringBodyDTO;
import org.mockserver.model.Body;
import org.mockserver.model.Parameter;
import org.mockserver.model.ParameterBody;
import org.mockserver.model.StringBody;
import org.mockserver.model.*;

import java.io.IOException;
import java.util.ArrayList;
Expand Down Expand Up @@ -69,57 +70,74 @@ public BodyDTO deserialize(JsonParser jp, DeserializationContext ctxt) throws IO
if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
Body.Type type = Body.Type.valueOf(jp.getText());
jp.nextToken();
if (type != Body.Type.PARAMETERS) {
if (jp.getCurrentToken() == JsonToken.FIELD_NAME && jp.getText().equals("value")) {
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
String value = jp.getText();
switch (type) {
case EXACT:
case REGEX:
case XPATH:
if (jp.getCurrentToken() == JsonToken.FIELD_NAME && jp.getText().equals("value")) {
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.END_OBJECT) {
return new StringBodyDTO(new StringBody(value, type));
if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
String value = jp.getText();
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.END_OBJECT) {
return new StringBodyDTO(new StringBody(value, type));
}
}
}
break;
case BINARY:
if (jp.getCurrentToken() == JsonToken.FIELD_NAME && jp.getText().equals("value")) {
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
String value = jp.getText();
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.END_OBJECT) {
return new BinaryBodyDTO(new BinaryBody(value.getBytes()));
}
}
}
}
} else {
if (jp.getCurrentToken() == JsonToken.FIELD_NAME && jp.getText().equals("parameters")) {
jp.nextToken();
if (jp.isExpectedStartArrayToken()) {
List<Parameter> parameters = new ArrayList<Parameter>();
boolean inObject = false;
while (inObject || jp.getCurrentToken() != JsonToken.END_ARRAY) {
JsonToken token = jp.nextToken();
switch (token) {
case START_OBJECT:
inObject = true;
break;
case END_OBJECT:
inObject = false;
break;
case FIELD_NAME:
if (jp.getText().equals("name")) {
if (jp.nextToken() == JsonToken.VALUE_STRING) {
String name = jp.getText();
jp.nextToken();
if (jp.nextToken() == JsonToken.START_ARRAY) {
List<String> values = new ArrayList<String>();
while (jp.nextToken() != null && jp.getCurrentToken() != JsonToken.END_ARRAY) {
if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
values.add(jp.getText());
break;
case PARAMETERS:
if (jp.getCurrentToken() == JsonToken.FIELD_NAME && jp.getText().equals("parameters")) {
jp.nextToken();
if (jp.isExpectedStartArrayToken()) {
List<Parameter> parameters = new ArrayList<Parameter>();
boolean inObject = false;
while (inObject || jp.getCurrentToken() != JsonToken.END_ARRAY) {
JsonToken token = jp.nextToken();
switch (token) {
case START_OBJECT:
inObject = true;
break;
case END_OBJECT:
inObject = false;
break;
case FIELD_NAME:
if (jp.getText().equals("name")) {
if (jp.nextToken() == JsonToken.VALUE_STRING) {
String name = jp.getText();
jp.nextToken();
if (jp.nextToken() == JsonToken.START_ARRAY) {
List<String> values = new ArrayList<String>();
while (jp.nextToken() != null && jp.getCurrentToken() != JsonToken.END_ARRAY) {
if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
values.add(jp.getText());
}
}
parameters.add(new Parameter(name, values));
}
parameters.add(new Parameter(name, values));
}
}
}
break;
break;
}
}
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.END_OBJECT) {
return new ParameterBodyDTO(new ParameterBody(parameters));
}
}
jp.nextToken();
if (jp.getCurrentToken() == JsonToken.END_OBJECT) {
return new ParameterBodyDTO(new ParameterBody(parameters));
}
}
}
break;
}
}
}
Expand Down
Expand Up @@ -11,9 +11,9 @@ public class BinaryBodyDTO extends BodyDTO {

private String value;

public BinaryBodyDTO(BinaryBody stringBody) {
super(stringBody.getType());
value = stringBody.getValue();
public BinaryBodyDTO(BinaryBody binaryBody) {
super(binaryBody.getType());
value = DatatypeConverter.printBase64Binary(binaryBody.getValue());
}

protected BinaryBodyDTO() {
Expand Down

0 comments on commit 667c751

Please sign in to comment.