package org.springframework.http.client; import java.util.Collections; import okhttp3.mockwebserver.Dispatcher; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import org.hamcrest.Matchers; import org.junit.After; import org.junit.Before; import org.springframework.http.MediaType; import org.springframework.util.StringUtils; import static org.hamcrest.MatcherAssert.assertThat; /** * @author Brian Clozel */ public class AbstractMockWebServerTestCase { private MockWebServer server; protected int port; protected String baseUrl; protected static final MediaType textContentType = new MediaType("text", "plain", Collections.singletonMap("charset", "UTF-8")); @Before public void setUp() throws Exception { this.server = new MockWebServer(); this.server.setDispatcher(new TestDispatcher()); this.server.start(); this.port = this.server.getPort(); this.baseUrl = "http://localhost:" + this.port; } @After public void tearDown() throws Exception { this.server.shutdown(); } protected class TestDispatcher extends Dispatcher { @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { try { if (request.getPath().equals("/echo")) { MockResponse response = new MockResponse() .setHeaders(request.getHeaders()) .setHeader("Content-Length", request.getBody().size()) .setResponseCode(200) .setBody(request.getBody()); request.getBody().flush(); return response; } else if(request.getPath().equals("/status/ok")) { return new MockResponse(); } else if(request.getPath().equals("/status/notfound")) { return new MockResponse().setResponseCode(404); } else if(request.getPath().startsWith("/params")) { assertThat(request.getPath(), Matchers.containsString("param1=value")); assertThat(request.getPath(), Matchers.containsString("param2=value1¶m2=value2")); return new MockResponse(); } else if(request.getPath().equals("/methods/post")) { assertThat(request.getMethod(), Matchers.is("POST")); String transferEncoding = request.getHeader("Transfer-Encoding"); if(StringUtils.hasLength(transferEncoding)) { assertThat(transferEncoding, Matchers.is("chunked")); } else { long contentLength = Long.parseLong(request.getHeader("Content-Length")); assertThat("Invalid content-length", request.getBody().size(), Matchers.is(contentLength)); } return new MockResponse().setResponseCode(200); } else if(request.getPath().startsWith("/methods/")) { String expectedMethod = request.getPath().replace("/methods/","").toUpperCase(); assertThat(request.getMethod(), Matchers.is(expectedMethod)); return new MockResponse(); } return new MockResponse().setResponseCode(404); } catch (Throwable exc) { return new MockResponse().setResponseCode(500).setBody(exc.toString()); } } } }