package org.mockserver.proxy.http;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockserver.client.serialization.ExpectationSerializer;
import org.mockserver.client.serialization.HttpRequestSerializer;
import org.mockserver.client.serialization.VerificationSequenceSerializer;
import org.mockserver.client.serialization.VerificationSerializer;
import org.mockserver.filters.RequestLogFilter;
import org.mockserver.filters.RequestResponseLogFilter;
import org.mockserver.mock.Expectation;
import org.mockserver.mock.action.ActionHandler;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
import org.mockserver.proxy.Proxy;
import org.mockserver.verify.Verification;
import org.mockserver.verify.VerificationSequence;
import java.util.concurrent.TimeUnit;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.Parameter.param;
/**
* @author jamesdbloom
*/
public class HttpProxyHandlerGeneralOperationsTest extends HttpProxyHandlerTest {
@Test
public void shouldResetExpectations() {
// given
HttpRequest request = request("/reset").withMethod("PUT");
// when
embeddedChannel.writeInbound(request);
// then - filter and matcher is reset
verify(mockRequestLogFilter).reset();
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldClearExpectations() {
// given
HttpRequest request = request("/clear").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockHttpRequestSerializer).deserialize("some_content");
// then - filter and matcher is cleared
verify(mockRequestLogFilter).clear(mockHttpRequest);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldDumpExpectationsToLog() {
// given
HttpRequest request = request("/dumpToLog").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockHttpRequestSerializer).deserialize("some_content");
// then - expectations dumped to log
verify(mockRequestResponseLogFilter).dumpToLog(mockHttpRequest, false);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldDumpExpectationsToLogAsJava() {
// given
HttpRequest request = request("/dumpToLog").withQueryStringParameter(param("type", "java")).withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockHttpRequestSerializer).deserialize("some_content");
// then - expectations dumped to log
verify(mockRequestResponseLogFilter).dumpToLog(mockHttpRequest, true);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldReturnRecordedRequests() {
// given
HttpRequest[] requests = {};
when(mockRequestLogFilter.retrieve(mockHttpRequest)).thenReturn(requests);
when(mockHttpRequestSerializer.serialize(requests)).thenReturn("requests");
HttpRequest request = request("/retrieve").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockHttpRequestSerializer).deserialize("some_content");
// then - matching requests should be retrieved
verify(mockRequestLogFilter).retrieve(mockHttpRequest);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse) embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.OK.code()));
assertThat(httpResponse.getBodyAsString(), is("requests"));
}
@Test
public void shouldReturnBadRequestAfterException() {
// given
HttpRequest request = request("/randomPath").withMethod("GET").withBody("some_content");
when(mockRequestLogFilter.onRequest(request)).thenThrow(new RuntimeException("TEST EXCEPTION"));
// when
embeddedChannel.writeInbound(request);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.BAD_REQUEST.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldReturnNotFoundAfterNoMatch() {
// given
HttpRequest request = request("/randomPath").withMethod("GET").withBody("some_content");
when(mockRequestLogFilter.onRequest(request)).thenReturn(null);
// when
embeddedChannel.writeInbound(request);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.NOT_FOUND.code()));
assertThat(httpResponse.getBodyAsString(), nullValue());
}
@Test
public void shouldVerifyPassingRequest() {
// given
when(mockRequestLogFilter.verify(any(Verification.class))).thenReturn("");
// and - a request
HttpRequest request = request("/verify").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockVerificationSerializer).deserialize("some_content");
// and - log filter called
verify(mockRequestLogFilter).verify(mockVerification);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldVerifyFailingRequest() {
// given
when(mockRequestLogFilter.verify(any(Verification.class))).thenReturn("failure response");
// and - a request
HttpRequest request = request("/verify").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockVerificationSerializer).deserialize("some_content");
// and - log filter called
verify(mockRequestLogFilter).verify(mockVerification);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.NOT_ACCEPTABLE.code()));
assertThat(httpResponse.getBodyAsString(), is("failure response"));
}
@Test
public void shouldVerifySequencePassingRequest() {
// given
when(mockRequestLogFilter.verify(any(VerificationSequence.class))).thenReturn("");
// and - a request
HttpRequest request = request("/verifySequence").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockVerificationSequenceSerializer).deserialize("some_content");
// and - log filter called
verify(mockRequestLogFilter).verify(mockVerificationSequence);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
assertThat(httpResponse.getBodyAsString(), is(""));
}
@Test
public void shouldVerifySequenceFailingRequest() {
// given
when(mockRequestLogFilter.verify(any(VerificationSequence.class))).thenReturn("failure response");
// and - a request
HttpRequest request = request("/verifySequence").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// then - request deserialized
verify(mockVerificationSequenceSerializer).deserialize("some_content");
// and - log filter called
verify(mockRequestLogFilter).verify(mockVerificationSequence);
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.NOT_ACCEPTABLE.code()));
assertThat(httpResponse.getBodyAsString(), is("failure response"));
}
@Test
public void shouldStopMockServer() throws InterruptedException {
// given
HttpRequest request = request("/stop").withMethod("PUT").withBody("some_content");
// when
embeddedChannel.writeInbound(request);
// ensure that stop thread has run
TimeUnit.SECONDS.sleep(3);
// then - mock server is stopped
verify(mockHttpProxy).stop();
// and - correct response written to ChannelHandlerContext
HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound();
assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code()));
}
}