@Test public void responseTimeout() throws Exception { server.enqueue(new MockResponse().setBody("ABC").clearHeaders().addHeader("Content-Length: 4")); server.enqueue(new MockResponse().setBody("DEF")); URLConnection urlConnection = server.getUrl("/").openConnection(); urlConnection.setReadTimeout(1000); InputStream in = urlConnection.getInputStream(); assertEquals('A', in.read()); assertEquals('B', in.read()); assertEquals('C', in.read()); try { in.read(); // if Content-Length was accurate, this would return -1 immediately fail(); } catch (SocketTimeoutException expected) { } URLConnection urlConnection2 = server.getUrl("/").openConnection(); InputStream in2 = urlConnection2.getInputStream(); assertEquals('D', in2.read()); assertEquals('E', in2.read()); assertEquals('F', in2.read()); assertEquals(-1, in2.read()); assertEquals(0, server.takeRequest().getSequenceNumber()); assertEquals(0, server.takeRequest().getSequenceNumber()); }
@Test public void disconnectAtStart() throws Exception { server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)); server.enqueue(new MockResponse()); // The jdk's HttpUrlConnection is a bastard. server.enqueue(new MockResponse()); try { server.getUrl("/a").openConnection().getInputStream(); } catch (IOException expected) { } server.getUrl("/b").openConnection().getInputStream(); // Should succeed. }
@Test public void bodySuccess200() { server.enqueue(new MockResponse().setBody("Hi")); BlockingObservable<String> o = service.body().toBlocking(); assertThat(o.first()).isEqualTo("Hi"); }
@Test public void regularResponse() throws Exception { server.enqueue(new MockResponse().setBody("hello world")); URL url = server.getUrl("/"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Accept-Language", "en-US"); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); assertEquals("hello world", reader.readLine()); RecordedRequest request = server.takeRequest(); assertEquals("GET / HTTP/1.1", request.getRequestLine()); assertEquals("en-US", request.getHeader("Accept-Language")); }
/** * Throttle the request body by sleeping 500ms after every 3 bytes. With a 6-byte request, this * should yield one sleep for a total delay of 500ms. */ @Test public void throttleRequest() throws Exception { server.enqueue(new MockResponse().throttleBody(3, 500, TimeUnit.MILLISECONDS)); long startNanos = System.nanoTime(); URLConnection connection = server.getUrl("/").openConnection(); connection.setDoOutput(true); connection.getOutputStream().write("ABCDEF".getBytes("UTF-8")); InputStream in = connection.getInputStream(); assertEquals(-1, in.read()); long elapsedNanos = System.nanoTime() - startNanos; long elapsedMillis = NANOSECONDS.toMillis(elapsedNanos); assertTrue(String.format("Request + Response: %sms", elapsedMillis), elapsedMillis >= 500); assertTrue(String.format("Request + Response: %sms", elapsedMillis), elapsedMillis < 1000); }
@Test public void nonHexadecimalChunkSize() throws Exception { server.enqueue( new MockResponse() .setBody("G\r\nxxxxxxxxxxxxxxxx\r\n0\r\n\r\n") .clearHeaders() .addHeader("Transfer-encoding: chunked")); URLConnection connection = server.getUrl("/").openConnection(); InputStream in = connection.getInputStream(); try { in.read(); fail(); } catch (IOException expected) { } }
@Test public void testHTTPSViaRibbon() { Client trustSSLSockets = new Client.Default(TrustingSSLSocketFactory.get(), null); server1.get().useHttps(TrustingSSLSocketFactory.get("localhost"), false); server1.enqueue(new MockResponse().setBody("success!")); getConfigInstance().setProperty(serverListKey(), hostAndPort(server1.getUrl(""))); TestInterface api = Feign.builder() .client(RibbonClient.builder().delegate(trustSSLSockets).build()) .target(TestInterface.class, "https://" + client()); api.post(); assertEquals(1, server1.getRequestCount()); }
@Test public void responseSuccess404() throws IOException { server.enqueue(new MockResponse().setResponseCode(404).setBody("Hi")); BlockingObservable<Response<String>> o = service.response().toBlocking(); Response<String> response = o.first(); assertThat(response.isSuccess()).isFalse(); assertThat(response.errorBody().string()).isEqualTo("Hi"); }
@Test public void resultFailure() { server.enqueue(new MockResponse().setSocketPolicy(DISCONNECT_AFTER_REQUEST)); BlockingObservable<Result<String>> o = service.result().toBlocking(); Result<String> result = o.first(); assertThat(result.isError()).isTrue(); assertThat(result.error()).isInstanceOf(IOException.class); }
@Test public void ioExceptionRetry() throws IOException, InterruptedException { server1.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)); server1.enqueue(new MockResponse().setBody("success!")); getConfigInstance().setProperty(serverListKey(), hostAndPort(server1.getUrl(""))); TestInterface api = Feign.builder() .client(RibbonClient.create()) .target(TestInterface.class, "http://" + client()); api.post(); assertEquals(2, server1.getRequestCount()); // TODO: verify ribbon stats match // assertEquals(target.lb().getLoadBalancerStats().getSingleServerStat()) }
@Test public void responseSuccess200() { server.enqueue(new MockResponse().setBody("Hi")); BlockingObservable<Response<String>> o = service.response().toBlocking(); Response<String> response = o.first(); assertThat(response.isSuccess()).isTrue(); assertThat(response.body()).isEqualTo("Hi"); }
@Before public void setUp() { Retrofit retrofit = new Retrofit.Builder() .endpoint(server.getUrl("/").toString()) .converterFactory(new StringConverterFactory()) .callAdapterFactory(ObservableCallAdapterFactory.create()) .build(); service = retrofit.create(Service.class); }
/** Delay the response body by sleeping 1s. */ @Test public void delayResponse() throws IOException { server.enqueue(new MockResponse().setBody("ABCDEF").setBodyDelay(1, SECONDS)); long startNanos = System.nanoTime(); URLConnection connection = server.getUrl("/").openConnection(); InputStream in = connection.getInputStream(); assertEquals('A', in.read()); assertEquals('B', in.read()); assertEquals('C', in.read()); assertEquals('D', in.read()); assertEquals('E', in.read()); assertEquals('F', in.read()); assertEquals(-1, in.read()); long elapsedNanos = System.nanoTime() - startNanos; long elapsedMillis = NANOSECONDS.toMillis(elapsedNanos); assertTrue(String.format("Request + Response: %sms", elapsedMillis), elapsedMillis >= 1000); assertTrue(String.format("Request + Response: %sms", elapsedMillis), elapsedMillis <= 1100); }
/* This test-case replicates a bug that occurs when using RibbonRequest with a query string. The querystrings would not be URL-encoded, leading to invalid HTTP-requests if the query string contained invalid characters (ex. space). */ @Test public void urlEncodeQueryStringParameters() throws IOException, InterruptedException { String queryStringValue = "some string with space"; String expectedQueryStringValue = "some+string+with+space"; String expectedRequestLine = String.format("GET /?a=%s HTTP/1.1", expectedQueryStringValue); server1.enqueue(new MockResponse().setBody("success!")); getConfigInstance().setProperty(serverListKey(), hostAndPort(server1.getUrl(""))); TestInterface api = Feign.builder() .client(RibbonClient.create()) .target(TestInterface.class, "http://" + client()); api.getWithQueryParameters(queryStringValue); final String recordedRequestLine = server1.takeRequest().getRequestLine(); assertEquals(recordedRequestLine, expectedRequestLine); }
@Test public void bodyFailure() { server.enqueue(new MockResponse().setSocketPolicy(DISCONNECT_AFTER_REQUEST)); BlockingObservable<String> o = service.body().toBlocking(); try { o.first(); fail(); } catch (RuntimeException e) { assertThat(e.getCause()).isInstanceOf(IOException.class); } }
@Test public void bodySuccess404() { server.enqueue(new MockResponse().setResponseCode(404)); BlockingObservable<String> o = service.body().toBlocking(); try { o.first(); fail(); } catch (RuntimeException e) { // TODO assert on some indicator of 404. } }
/** * Test that MockWebServer blocks for a call to enqueue() if a request is made before a mock * response is ready. */ @Test public void dispatchBlocksWaitingForEnqueue() throws Exception { new Thread() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException ignored) { } server.enqueue(new MockResponse().setBody("enqueued in the background")); } }.start(); URLConnection connection = server.getUrl("/").openConnection(); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); assertEquals("enqueued in the background", reader.readLine()); }
@Test public void redirect() throws Exception { server.enqueue( new MockResponse() .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) .addHeader("Location: " + server.getUrl("/new-path")) .setBody("This page has moved!")); server.enqueue(new MockResponse().setBody("This is the new location!")); URLConnection connection = server.getUrl("/").openConnection(); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); assertEquals("This is the new location!", reader.readLine()); RecordedRequest first = server.takeRequest(); assertEquals("GET / HTTP/1.1", first.getRequestLine()); RecordedRequest redirect = server.takeRequest(); assertEquals("GET /new-path HTTP/1.1", redirect.getRequestLine()); }