package org.jboss.resteasy.test.client;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.logging.Logger;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine;
import org.jboss.resteasy.test.client.resource.ClientExecutorShutdownTestResource;
import org.jboss.resteasy.util.HttpResponseCodes;
import org.jboss.resteasy.utils.TestUtil;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import static org.junit.Assert.fail;
/**
* @tpSubChapter Resteasy-client
* @tpChapter Client tests
* @tpSince RESTEasy 3.0.16
* @tpTestCaseDetails https://issues.jboss.org/browse/RESTEASY-621
*/
@RunWith(Arquillian.class)
@RunAsClient
public class ClientExecutorShutdownTest extends ClientTestBase{
private static Logger log = Logger.getLogger(ClientExecutorShutdownTest.class);
@Path("/test")
public interface TestService {
@POST
Response post();
}
@Deployment
public static Archive<?> deploy() {
WebArchive war = TestUtil.prepareArchive(ClientExecutorShutdownTest.class.getSimpleName());
war.addClass(ClientExecutorShutdownTest.class);
war.addClass(ClientTestBase.class);
return TestUtil.finishContainerPrepare(war, null, ClientExecutorShutdownTestResource.class);
}
/**
* @tpTestDetails Verify that if ApacheHttpClient4Executor creates its own HttpClient,
* then ApacheHttpClient4Executor.finalize() will close the HttpClient's
* org.apache.http.conn.ClientConnectionManager.
* @tpPassCrit ApacheHttpClient4Executor.finalize() will close the connection
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testApacheHttpClient4ExecutorNonSharedHttpClientFinalize() throws Throwable {
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine();
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
Response response = client.target(generateURL("/test")).request().post(null);
Assert.assertEquals(HttpResponseCodes.SC_NO_CONTENT, response.getStatus());
engine.finalize();
HttpClient httpClient = engine.getHttpClient();
HttpPost post = new HttpPost(generateURL("/test"));
try {
httpClient.execute(post);
fail("Expected IllegalStateException");
} catch (IllegalStateException e) {
log.info("Got expected IllegalStateException");
}
}
/**
* @tpTestDetails Verify that if ApacheHttpClient4Executor creates its own HttpClient,
* then ApacheHttpClient4Executor.close() will close the HttpClient's
* org.apache.http.conn.ClientConnectionManager.
* @tpPassCrit ApacheHttpClient4Executor.close() will close the connection
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testApacheHttpClient4ExecutorNonSharedHttpClientClose() throws Throwable {
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine();
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
Response response = client.target(generateURL("/test")).request().post(null);
Assert.assertEquals(HttpResponseCodes.SC_NO_CONTENT, response.getStatus());
engine.close();
HttpClient httpClient = engine.getHttpClient();
HttpPost post = new HttpPost(generateURL("/test"));
try {
httpClient.execute(post);
fail("Expected IllegalStateException");
} catch (IllegalStateException e) {
log.info("Got expected IllegalStateException");
}
}
/**
* @tpTestDetails Verify that if ApacheHttpClient4Executor receives an HttpClient through
* a constructor, then ApacheHttpClient4Executor.finalize() will not close the
* HttpClient's org.apache.http.conn.ClientConnectionManager.
* @tpPassCrit ApacheHttpClient4Executor.finalize() will not close the connection
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testApacheHttpClient4ExecutorSharedHttpClientFinalize() throws Throwable {
HttpClient httpClient = HttpClientBuilder.create().build();
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
Response response = client.target(generateURL("/test")).request().post(null);
Assert.assertEquals(HttpResponseCodes.SC_NO_CONTENT, response.getStatus());
engine.finalize();
Assert.assertEquals("Original httpclient and engine httpclient are not the same instance",
httpClient, engine.getHttpClient());
HttpPost post = new HttpPost(generateURL("/test"));
HttpResponse httpResponse = httpClient.execute(post);
Assert.assertEquals("The httpclient was closed and it shouldn't", HttpResponseCodes.SC_NO_CONTENT,
httpResponse.getStatusLine().getStatusCode());
}
/**
* @tpTestDetails Verify that if ApacheHttpClient4Executor receives an HttpClient through
* a constructor, then ApacheHttpClient4Executor.close() will not close the
* HttpClient's org.apache.http.conn.ClientConnectionManager.
* @tpPassCrit ApacheHttpClient4Executor.close() will not close the connection
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testApacheHttpClient4ExecutorSharedHttpClientClose() throws Throwable {
HttpClient httpClient = HttpClientBuilder.create().build();
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
Response response = client.target(generateURL("/test")).request().post(null);
Assert.assertEquals("Original httpclient and engine httpclient are not the same instance",
HttpResponseCodes.SC_NO_CONTENT, response.getStatus());
engine.close();
Assert.assertEquals(httpClient, engine.getHttpClient());
HttpPost post = new HttpPost(generateURL("/test"));
HttpResponse httpResponse = httpClient.execute(post);
Assert.assertEquals("The httpclient was closed and it shouldn't", HttpResponseCodes.SC_NO_CONTENT,
httpResponse.getStatusLine().getStatusCode());
}
}