Improve code coverage for HttpClientProvider Exercise some uncovered branches related with retrying requests while reducing the total time it takes to run the tests. Change-Id: If0a50e4b1b2a3acf98a053b607e27417d6da197f
diff --git a/src/test/java/com/ericsson/gerrit/plugins/syncindex/HttpSessionTest.java b/src/test/java/com/ericsson/gerrit/plugins/syncindex/HttpSessionTest.java index 27f30d5..183f542 100644 --- a/src/test/java/com/ericsson/gerrit/plugins/syncindex/HttpSessionTest.java +++ b/src/test/java/com/ericsson/gerrit/plugins/syncindex/HttpSessionTest.java
@@ -16,6 +16,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.delete; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static com.google.common.truth.Truth.assertThat; import static org.easymock.EasyMock.expect; @@ -31,10 +32,12 @@ import org.junit.ClassRule; import org.junit.Test; +import java.net.SocketTimeoutException; + public class HttpSessionTest extends EasyMockSupport { - private static final int MAX_TRIES = 5; - private static final int RETRY_INTERVAL = 1000; - private static final int TIMEOUT = 1000; + private static final int MAX_TRIES = 3; + private static final int RETRY_INTERVAL = 250; + private static final int TIMEOUT = 500; private static final int ERROR = 500; private static final int OK = 204; private static final int NOT_FOUND = 404; @@ -43,6 +46,8 @@ private static final String ENDPOINT = "/plugins/sync-index/index/1"; private static final String ERROR_MESSAGE = "Error message"; private static final String REQUEST_MADE = "Request made"; + private static final String SECOND_TRY = "Second try"; + private static final String THIRD_TRY = "Third try"; private static final String RETRY_AT_ERROR = "Retry at error"; private static final String RETRY_AT_DELAY = "Retry at delay"; @@ -72,7 +77,7 @@ } @Test - public void testResponseOK() throws Exception { + public void testPostResponseOK() throws Exception { wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)) .willReturn(aResponse().withStatus(OK))); @@ -80,6 +85,14 @@ } @Test + public void testDeleteResponseOK() throws Exception { + wireMockRule.givenThat(delete(urlEqualTo(ENDPOINT)) + .willReturn(aResponse().withStatus(OK))); + + assertThat(httpSession.delete(ENDPOINT).isSuccessful()).isTrue(); + } + + @Test public void testNotAuthorized() throws Exception { String expected = "unauthorized"; wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)) @@ -136,6 +149,42 @@ } @Test + public void testRetryAfterTimeoutThenOK() throws Exception { + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(Scenario.STARTED).willSetStateTo(REQUEST_MADE) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(REQUEST_MADE).willSetStateTo(SECOND_TRY) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(SECOND_TRY).willSetStateTo(THIRD_TRY) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(THIRD_TRY) + .willReturn(aResponse().withStatus(OK))); + + assertThat(httpSession.post(ENDPOINT).isSuccessful()).isTrue(); + } + + @Test(expected = SocketTimeoutException.class) + public void testMaxRetriesAfterTimeoutThenGiveUp() throws Exception { + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(Scenario.STARTED).willSetStateTo(REQUEST_MADE) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(REQUEST_MADE).willSetStateTo(SECOND_TRY) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(SECOND_TRY).willSetStateTo(THIRD_TRY) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) + .whenScenarioStateIs(THIRD_TRY) + .willReturn(aResponse().withFixedDelay(TIMEOUT))); + + httpSession.post(ENDPOINT); + } + + @Test public void testGiveUpAtTimeout() throws Exception { wireMockRule.givenThat(post(urlEqualTo(ENDPOINT)).inScenario(RETRY_AT_DELAY) .whenScenarioStateIs(Scenario.STARTED).willSetStateTo(REQUEST_MADE)