diff --git a/pom.xml b/pom.xml index 0013af0..4f927ee 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ org.junit.jupiter junit-jupiter-engine - 5.2.0 + 5.10.5 test diff --git a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java index 758b1c7..d0f13c3 100644 --- a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java +++ b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java @@ -76,6 +76,7 @@ private List doPost(List statements, URI endpoint) responseBody, new TypeReference>(){}); } else { + EntityUtils.consumeQuietly(response.getEntity()); throw new StatementClientException(String.format( "Error, Non-200 Status. Received: %s", response.getStatusLine().getStatusCode())); @@ -119,6 +120,7 @@ private StatementResult doGetStatementResult(URI endpoint) String responseBody = EntityUtils.toString(response.getEntity()); return Mapper.getMapper().readValue(responseBody, StatementResult.class); } else { + EntityUtils.consumeQuietly(response.getEntity()); throw new StatementClientException(String.format( "Error, Non-200 Status. Received: %s", response.getStatusLine().getStatusCode())); @@ -134,6 +136,7 @@ private Statement doGetStatement(URI endpoint) String responseBody = EntityUtils.toString(response.getEntity()); return Mapper.getMapper().readValue(responseBody, Statement.class); } else { + EntityUtils.consumeQuietly(response.getEntity()); throw new StatementClientException(String.format( "Error, Non-200 Status. Received: %s", response.getStatusLine().getStatusCode())); diff --git a/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java b/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java index 2158ecd..3ed1e6d 100644 --- a/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java +++ b/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java @@ -19,12 +19,14 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.testcontainers.containers.GenericContainer; import com.fasterxml.jackson.core.exc.StreamReadException; import com.fasterxml.jackson.databind.DatabindException; import com.yetanalytics.xapi.client.filters.StatementFilters; +import com.yetanalytics.xapi.exception.StatementClientException; import com.yetanalytics.xapi.model.Agent; import com.yetanalytics.xapi.model.Statement; import com.yetanalytics.xapi.util.Mapper; @@ -216,5 +218,40 @@ public void testDateFilters() throws StreamReadException, DatabindException, IOE List result = client.getStatements(filters); assertNotNull(result); + } + + @Test + @Timeout(value = 30, unit = TimeUnit.SECONDS) + public void testConnectionPoolOnError() throws StreamReadException, DatabindException, IOException { + LRS lrs = new LRS(getMappedHost(), KEY, SECRET); + StatementClient client = new StatementClient(lrs); + + Statement statement = new Statement(); + statement.setId(UUID.randomUUID()); + + // Try 1, handled, no issue + try { + client.postStatement(statement); + } catch (StatementClientException e) { + assertTrue(e.getMessage().contains("Error, Non-200 Status. Received: 400")); + } + + // Try 2, handled, no issue + try { + client.postStatement(statement); + } catch (StatementClientException e) { + assertTrue(e.getMessage().contains("Error, Non-200 Status. Received: 400")); + } + + // Try 3, will await indefinitely if connection pool is not cleaned up properly (timeout will trigger) + // Test will finish successfully if client is handling conns right + try { + client.postStatement(statement); + } catch (StatementClientException e) { + assertTrue(e.getMessage().contains("Error, Non-200 Status. Received: 400")); + } + + + } }