diff --git a/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java b/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java index 6c5f5f896..fd9267e7a 100644 --- a/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java +++ b/mockwebserver/src/main/java/com/squareup/okhttp/mockwebserver/MockWebServer.java @@ -581,9 +581,20 @@ public final class MockWebServer { InputStream in = response.getBodyStream(); if (in == null) return; + sleepIfDelayed(response); throttledTransfer(response, socket, in, out, Long.MAX_VALUE); } + private void sleepIfDelayed(MockResponse response) { + if (response.getBodyDelayTimeMs() != 0) { + try { + Thread.sleep(response.getBodyDelayTimeMs()); + } catch (InterruptedException e) { + throw new AssertionError(e); + } + } + } + /** * Transfer bytes from {@code in} to {@code out} until either {@code length} * bytes have been transferred or {@code in} is exhausted. The transfer is diff --git a/mockwebserver/src/test/java/com/squareup/okhttp/mockwebserver/MockWebServerTest.java b/mockwebserver/src/test/java/com/squareup/okhttp/mockwebserver/MockWebServerTest.java index 2b1651f18..62e4ee8a3 100644 --- a/mockwebserver/src/test/java/com/squareup/okhttp/mockwebserver/MockWebServerTest.java +++ b/mockwebserver/src/test/java/com/squareup/okhttp/mockwebserver/MockWebServerTest.java @@ -338,4 +338,30 @@ public final class MockWebServerTest extends TestCase { assertTrue(String.format("Request + Response: %sms", elapsedMillis), elapsedMillis >= 500); assertTrue(String.format("Request + Response: %sms", elapsedMillis), elapsedMillis < 1000); } + + /** + * Delay the response body by sleeping 1000ms. + */ + public void testDelayResponse() throws IOException { + server.enqueue(new MockResponse() + .setBody("ABCDEF") + .setBodyDelayTimeMs(1000)); + server.play(); + + 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); + } }