Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MockWebServer's takeRequest() method takes long to response or hangs

I'm using MockWebServer library in my Android JUnit tests. I'm testing an SDK that makes calls to a server. So I'm using MockWebServer to override these server URLs and capture what the SDK is sending to make assertions on it.

The problem that I'm running into is that if I try to do server.takeRequest() and assign it to a new RecordedRequest variable, the test hangs up on the second server.takeRequest() and sometimes, even on the first one -- if I run it on an emulator it hangs on the first server.takeRequest() method but if I run it on my physical Android device, it freezes on the second server.takeRequest() method.

public void testSomething() {
  final MockWebServer server = new MockWebServer();

  try {
    server.play();
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_INTERNAL_ERROR));
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_OK));
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_OK));

    URL url = server.getUrl("/");
    // This internal method overrides some of the hardcoded URLs 
    // within the SDK that I'm testing.
    Util.overrideUrls(url.toString()) 

    // Do some server calls via the SDK utilizing the mock server url.

    RecordedRequest requestFor500 = server.takeRequest();
    // Do some assertions with 'requestFor500'

    // Do some more server calls via the SDK utilizing the mock server url.

    /* 
     * This is the part where the JUnit test hangs or seems to go into 
     * an infinite loop and never recovers 
     */
    RecordedRequest requestAfter500Before200 = server.takeRequest();
  } catch {
    ...
  }
}

Am I doing something wrong or is this some type of bug with MockWebServer?

like image 692
FilmiHero Avatar asked Sep 11 '13 20:09

FilmiHero


1 Answers

Add timeout to MockWebServer so that it does not hang server.takeRequest(1, TimeUnit.SECONDS);

like image 127
Prayag Avatar answered Nov 15 '22 19:11

Prayag