Skip to content

Commit c8d0d50

Browse files
committed
[test] Close ClassicHttpResponse in exist-core HC5 integration tests
1 parent 2844e67 commit c8d0d50

16 files changed

Lines changed: 247 additions & 388 deletions

exist-core/src/test/java/org/exist/dom/persistent/CDataIntergationTest.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,9 @@
2424

2525
import org.apache.hc.client5.http.fluent.Executor;
2626
import org.apache.hc.client5.http.fluent.Request;
27-
import org.exist.http.AbstractHttpTest;
28-
import org.apache.hc.core5.http.ClassicHttpResponse;
2927
import org.exist.TestUtils;
28+
import org.exist.http.AbstractHttpTest;
3029
import org.exist.test.ExistWebServer;
31-
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
3230
import org.exist.xmldb.DatabaseImpl;
3331
import org.exist.xmldb.XmldbURI;
3432
import org.junit.ClassRule;
@@ -45,13 +43,14 @@
4543

4644
import static java.nio.charset.StandardCharsets.UTF_8;
4745
import static org.apache.hc.core5.http.HttpStatus.SC_CREATED;
46+
import static org.apache.hc.core5.http.HttpStatus.SC_OK;
4847
import static org.junit.Assert.*;
4948

5049
/**
5150
* Tests for retrieving a document containing CDATA via
5251
* various APIs.
5352
*/
54-
public class CDataIntergationTest {
53+
public class CDataIntergationTest extends AbstractHttpTest {
5554

5655
@ClassRule
5756
public static final ExistWebServer existWebServer = new ExistWebServer(true, false, true, true);
@@ -71,23 +70,17 @@ public void cdataRestApi() throws IOException {
7170
existWebServer, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD);
7271

7372
// store document
74-
final ClassicHttpResponse storeResponse = (ClassicHttpResponse) executor.execute(
73+
assertEquals(SC_CREATED, executeForStatus(executor,
7574
Request
7675
.put(docUri)
7776
.addHeader("Content-Type", "application/xml")
7877
.bodyByteArray(cdata_xml.getBytes(UTF_8))
79-
).returnResponse();
80-
assertEquals(SC_CREATED, storeResponse.getCode());
78+
));
8179

8280
// retrieve document
83-
final ClassicHttpResponse retrieveResponse = (ClassicHttpResponse) executor.execute(
84-
Request
85-
.get(docUri)
86-
).returnResponse();
87-
try (final UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream()) {
88-
retrieveResponse.getEntity().writeTo(baos);
89-
assertEquals(cdata_xml, baos.toString(UTF_8));
90-
}
81+
final HttpResponseResult retrieved = executeForStatusAndBody(executor, Request.get(docUri));
82+
assertEquals(SC_OK, retrieved.statusCode());
83+
assertEquals(cdata_xml, retrieved.body());
9184
}
9285

9386
@Test

exist-core/src/test/java/org/exist/http/AbstractHttpTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,33 @@
2424

2525
import com.evolvedbinary.j8fu.function.FunctionE;
2626
import org.apache.hc.client5.http.fluent.Executor;
27+
import org.apache.hc.client5.http.fluent.Request;
2728
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
2829
import org.apache.hc.client5.http.impl.classic.HttpClients;
30+
import org.apache.hc.core5.http.ClassicHttpResponse;
2931
import org.apache.hc.core5.http.HttpHeaders;
3032
import org.apache.hc.core5.http.HttpHost;
33+
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
3134
import org.exist.TestUtils;
3235
import org.exist.test.ExistWebServer;
3336

3437
import java.io.IOException;
3538
import java.nio.charset.StandardCharsets;
3639
import java.util.Base64;
3740

41+
import static org.junit.Assert.assertEquals;
42+
3843
/**
3944
* @author <a href="mailto:adam@evolvedbinary.com">Adam Retter</a>
4045
*/
4146
public abstract class AbstractHttpTest {
4247

48+
/**
49+
* HTTP status and body from a single fluent request execution.
50+
*/
51+
public record HttpResponseResult(int statusCode, String body) {
52+
}
53+
4354
/**
4455
* Get the Server URI.
4556
*
@@ -169,4 +180,63 @@ protected static <T> T withHttpExecutor(final ExistWebServer existWebServer, fin
169180
return fn.apply(Executor.newInstance(client));
170181
}
171182
}
183+
184+
/**
185+
* Execute a request and return its status code, closing the response.
186+
*/
187+
protected static int executeForStatus(final Executor executor, final Request request) throws IOException {
188+
try (ClassicHttpResponse response = (ClassicHttpResponse) executor.execute(request).returnResponse()) {
189+
return response.getCode();
190+
}
191+
}
192+
193+
/**
194+
* Execute a request and return its status code, closing the response.
195+
*/
196+
protected static int executeForStatus(final Request request) throws IOException {
197+
try (ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse()) {
198+
return response.getCode();
199+
}
200+
}
201+
202+
/**
203+
* Execute a request and return status code and body, closing the response.
204+
*/
205+
public static HttpResponseResult executeForStatusAndBody(final Executor executor, final Request request)
206+
throws IOException {
207+
try (ClassicHttpResponse response = (ClassicHttpResponse) executor.execute(request).returnResponse()) {
208+
return new HttpResponseResult(response.getCode(), readResponseBody(response));
209+
}
210+
}
211+
212+
/**
213+
* Execute a request and return status code and body, closing the response.
214+
*/
215+
public static HttpResponseResult executeForStatusAndBody(final Request request) throws IOException {
216+
try (ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse()) {
217+
return new HttpResponseResult(response.getCode(), readResponseBody(response));
218+
}
219+
}
220+
221+
protected static String readResponseBody(final ClassicHttpResponse response) throws IOException {
222+
if (response.getEntity() == null) {
223+
return "";
224+
}
225+
try (UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream()) {
226+
response.getEntity().writeTo(baos);
227+
return baos.toString(StandardCharsets.UTF_8);
228+
}
229+
}
230+
231+
/**
232+
* Execute a fluent request and assert status and body, closing the response.
233+
*/
234+
public static void assertRequestResponse(
235+
final Request request,
236+
final int expectedStatus,
237+
final String expectedBody) throws IOException {
238+
final HttpResponseResult result = executeForStatusAndBody(request);
239+
assertEquals(expectedStatus, result.statusCode());
240+
assertEquals(expectedBody, result.body());
241+
}
172242
}

exist-core/src/test/java/org/exist/http/RESTTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.exist.xmldb.XmldbURI;
2626
import org.junit.ClassRule;
2727

28-
public abstract class RESTTest {
28+
public abstract class RESTTest extends AbstractHttpTest {
2929

3030
@ClassRule
3131
public static final ExistWebServer existWebServer = new ExistWebServer(true, false, true, true);

exist-core/src/test/java/org/exist/http/urlrewrite/ControllerTest.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323
package org.exist.http.urlrewrite;
2424

2525
import com.evolvedbinary.j8fu.tuple.Tuple2;
26-
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
2726
import org.apache.hc.client5.http.fluent.Request;
28-
import org.apache.hc.core5.http.ClassicHttpResponse;
2927
import org.apache.hc.core5.http.ContentType;
3028
import org.apache.hc.core5.http.HttpStatus;
3129
import org.exist.http.AbstractHttpTest;
@@ -97,22 +95,16 @@ private void store(final String testCollectionName, final String documentMediaTy
9795
final Request request = Request
9896
.put(getRestUri(existWebServer) + "/db/apps/" + testCollectionName + "/" + documentName)
9997
.bodyString(documentContent, ContentType.create(documentMediaType));
100-
int statusCode = withHttpExecutor(existWebServer, executor ->
101-
executor.execute(request).returnResponse().getCode()
102-
);
98+
int statusCode = withHttpExecutor(existWebServer, executor -> executeForStatus(executor, request));
10399
assertEquals(HttpStatus.SC_CREATED, statusCode);
104100
}
105101

106102
private Tuple2<Integer, String> get(final String testCollectionName, final String documentName) throws IOException {
107103
final Request request = Request
108104
.get(getAppsUri(existWebServer) + "/" + testCollectionName + "/" + documentName);
109105
final Tuple2<Integer, String> responseCodeAndBody = withHttpExecutor(existWebServer, executor -> {
110-
final ClassicHttpResponse response = (ClassicHttpResponse) executor.execute(request).returnResponse();
111-
final int sc = response.getCode();
112-
try (final UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream()) {
113-
response.getEntity().writeTo(baos);
114-
return Tuple(sc, baos.toString(UTF_8));
115-
}
106+
final HttpResponseResult r = executeForStatusAndBody(executor, request);
107+
return Tuple(r.statusCode(), r.body());
116108
});
117109
return responseCodeAndBody;
118110
}

exist-core/src/test/java/org/exist/http/urlrewrite/URLRewritingTest.java

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@
2424

2525
import com.evolvedbinary.j8fu.tuple.Tuple2;
2626
import org.apache.hc.client5.http.fluent.Request;
27-
import org.apache.hc.core5.http.ClassicHttpResponse;
2827
import org.apache.hc.core5.http.ContentType;
2928
import org.apache.hc.core5.http.HttpStatus;
3029
import org.exist.http.AbstractHttpTest;
3130
import org.exist.test.ExistWebServer;
32-
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
3331
import org.exist.xmldb.XmldbURI;
3432
import org.junit.AfterClass;
3533
import org.junit.BeforeClass;
@@ -39,7 +37,6 @@
3937
import java.io.IOException;
4038

4139
import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple;
42-
import static java.nio.charset.StandardCharsets.UTF_8;
4340
import static org.exist.http.urlrewrite.XQueryURLRewrite.XQUERY_CONTROLLER_FILENAME;
4441
import static org.junit.Assert.assertEquals;
4542
import static org.junit.Assert.assertTrue;
@@ -67,20 +64,15 @@ public void findsParentController() throws IOException {
6764
final Request storeRequest = Request
6865
.put(storeDocUri)
6966
.bodyString(testDocument, ContentType.APPLICATION_XML);
70-
final int storeResponseStatusCode = withHttpExecutor(existWebServer, executor -> executor.execute(storeRequest).returnResponse().getCode());
67+
final int storeResponseStatusCode = withHttpExecutor(existWebServer, executor -> executeForStatus(executor, storeRequest));
7168
assertEquals(HttpStatus.SC_CREATED, storeResponseStatusCode);
7269

7370
final String retrieveDocUri = getAppsUri(existWebServer) + "/" + TEST_COLLECTION_NAME.append(nestedCollectionName).append(docName);
7471
final Request retrieveRequest = Request
7572
.get(retrieveDocUri);
76-
final Tuple2<Integer, String> retrieveResponseStatusCodeAndBody = withHttpExecutor(existWebServer, executor -> {
77-
final ClassicHttpResponse response = (ClassicHttpResponse) executor.execute(retrieveRequest).returnResponse();
78-
final String responseBody;
79-
try (final UnsynchronizedByteArrayOutputStream baos = new UnsynchronizedByteArrayOutputStream((int)response.getEntity().getContentLength())) {
80-
response.getEntity().writeTo(baos);
81-
responseBody = baos.toString(UTF_8);
82-
}
83-
return Tuple(response.getCode(), responseBody);
73+
final Tuple2<Integer, String> retrieveResponseStatusCodeAndBody = withHttpExecutor(existWebServer, executor -> {
74+
final HttpResponseResult r = executeForStatusAndBody(executor, retrieveRequest);
75+
return Tuple(r.statusCode(), r.body());
8476
});
8577
assertEquals(HttpStatus.SC_OK, retrieveResponseStatusCodeAndBody._1.intValue());
8678
assertTrue(retrieveResponseStatusCodeAndBody._2.matches("<controller>.+</controller>"));
@@ -92,9 +84,7 @@ public static void setup() throws IOException {
9284
.put(getRestUri(existWebServer) + TEST_COLLECTION + "/" + XQUERY_CONTROLLER_FILENAME)
9385
.bodyString(TEST_CONTROLLER, ContentType.create("application/xquery"));
9486

95-
final int statusCode = withHttpExecutor(existWebServer, executor ->
96-
executor.execute(request).returnResponse().getCode()
97-
);
87+
final int statusCode = withHttpExecutor(existWebServer, executor -> executeForStatus(executor, request));
9888

9989
assertEquals(HttpStatus.SC_CREATED, statusCode);
10090
}
@@ -104,9 +94,7 @@ public static void cleanup() throws IOException {
10494
final Request request = Request
10595
.delete(getRestUri(existWebServer) + TEST_COLLECTION);
10696

107-
final int statusCode = withHttpExecutor(existWebServer, executor ->
108-
executor.execute(request).returnResponse().getCode()
109-
);
97+
final int statusCode = withHttpExecutor(existWebServer, executor -> executeForStatus(executor, request));
11098

11199
assertEquals(HttpStatus.SC_OK, statusCode);
112100
}

exist-core/src/test/java/org/exist/management/JmxRemoteTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,9 @@ public void checkBasicRequest() throws IOException {
104104
.addHeader(new BasicHeader("Accept", ContentType.APPLICATION_XML.toString()));
105105

106106
final Tuple2<Integer, String> codeAndMediaType = withHttpExecutor(executor -> {
107-
final ClassicHttpResponse response = (ClassicHttpResponse) executor.execute(request).returnResponse();
108-
return Tuple(response.getCode(), response.getEntity().getContentType());
107+
try (final ClassicHttpResponse response = (ClassicHttpResponse) executor.execute(request).returnResponse()) {
108+
return Tuple(response.getCode(), response.getEntity().getContentType());
109+
}
109110
});
110111

111112
assertEquals(Tuple(HttpStatus.SC_OK, "application/xml"), codeAndMediaType);

exist-core/src/test/java/org/exist/security/RestApiSecurityTest.java

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ protected void removeCol(final String collectionName, final String uid, final St
6161

6262
final Executor exec = getExecutor(uid, pwd);
6363
try {
64-
final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(Request.delete(collectionUri)).returnResponse();
65-
66-
if(resp.getCode() != HttpStatus.SC_OK) {
67-
throw new ApiException("Could not remove collection: " + collectionUri + ". " + getResponseBody(resp.getEntity()));
64+
try (final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(Request.delete(collectionUri)).returnResponse()) {
65+
if(resp.getCode() != HttpStatus.SC_OK) {
66+
throw new ApiException("Could not remove collection: " + collectionUri + ". " + getResponseBody(resp.getEntity()));
67+
}
6868
}
6969
} catch(final IOException ioe) {
7070
throw new ApiException(ioe);
@@ -103,12 +103,12 @@ protected void addCollectionUserAce(final String collectionUri, final String use
103103
protected String getXmlResourceContent(final String resourceUri, final String uid, final String pwd) throws ApiException {
104104
final Executor exec = getExecutor(uid, pwd);
105105
try {
106-
final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(Request.get(getServerUri() + resourceUri)).returnResponse();
107-
108-
if(resp.getCode() != HttpStatus.SC_OK) {
109-
throw new ApiException("Could not get XML resource from uri: " + resourceUri + ". " + getResponseBody(resp.getEntity()));
110-
} else {
111-
return getResponseBody(resp.getEntity());
106+
try (final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(Request.get(getServerUri() + resourceUri)).returnResponse()) {
107+
if(resp.getCode() != HttpStatus.SC_OK) {
108+
throw new ApiException("Could not get XML resource from uri: " + resourceUri + ". " + getResponseBody(resp.getEntity()));
109+
} else {
110+
return getResponseBody(resp.getEntity());
111+
}
112112
}
113113
} catch(final IOException ioe) {
114114
throw new ApiException(ioe);
@@ -139,14 +139,15 @@ protected void createGroup(final String group_gid, final String uid, final Strin
139139
protected void createXmlResource(final String resourceUri, final String content, final String uid, final String pwd) throws ApiException {
140140
final Executor exec = getExecutor(uid, pwd);
141141
try {
142-
final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(
142+
try (final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(
143143
Request.put(getServerUri() + resourceUri)
144144
.addHeader("Content-Type", "application/xml")
145145
.bodyByteArray(content.getBytes())
146-
).returnResponse();
147-
148-
if(resp.getCode() != HttpStatus.SC_CREATED) {
149-
throw new ApiException("Could not store XML resource to uri: " + resourceUri + ". " + getResponseBody(resp.getEntity()));
146+
).returnResponse()) {
147+
148+
if(resp.getCode() != HttpStatus.SC_CREATED) {
149+
throw new ApiException("Could not store XML resource to uri: " + resourceUri + ". " + getResponseBody(resp.getEntity()));
150+
}
150151
}
151152
} catch(final IOException ioe) {
152153
throw new ApiException(ioe);
@@ -157,14 +158,15 @@ protected void createXmlResource(final String resourceUri, final String content,
157158
protected void createBinResource(final String resourceUri, final byte[] content, final String uid, final String pwd) throws ApiException {
158159
final Executor exec = getExecutor(uid, pwd);
159160
try {
160-
final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(
161+
try (final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(
161162
Request.put(getServerUri() + resourceUri)
162163
.addHeader("Content-Type", "application/octet-stream")
163164
.bodyByteArray(content)
164-
).returnResponse();
165-
166-
if(resp.getCode() != HttpStatus.SC_CREATED) {
167-
throw new ApiException("Could not store Binary resource to uri: " + resourceUri + ". " + getResponseBody(resp.getEntity()));
165+
).returnResponse()) {
166+
167+
if(resp.getCode() != HttpStatus.SC_CREATED) {
168+
throw new ApiException("Could not store Binary resource to uri: " + resourceUri + ". " + getResponseBody(resp.getEntity()));
169+
}
168170
}
169171
} catch(final IOException ioe) {
170172
throw new ApiException(ioe);
@@ -175,12 +177,12 @@ private void executeQuery(final String xquery, final String uid, final String pw
175177
final Executor exec = getExecutor(uid, pwd);
176178
try {
177179
final String queryUri = createQueryUri(xquery);
178-
179-
final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(Request.get(queryUri)).returnResponse();
180180

181-
final int status = resp.getCode();
182-
if(status != HttpStatus.SC_OK) {
183-
throw new ApiException("HTTP " + status + " could not execute query uri: " + queryUri + ". " + getResponseBody(resp.getEntity()));
181+
try (final ClassicHttpResponse resp = (ClassicHttpResponse) exec.execute(Request.get(queryUri)).returnResponse()) {
182+
final int status = resp.getCode();
183+
if(status != HttpStatus.SC_OK) {
184+
throw new ApiException("HTTP " + status + " could not execute query uri: " + queryUri + ". " + getResponseBody(resp.getEntity()));
185+
}
184186
}
185187
} catch(final IOException ioe) {
186188
throw new ApiException(ioe);

0 commit comments

Comments
 (0)