package org.jboss.resteasy.test.client.exception; import static org.junit.Assert.fail; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.ws.rs.ProcessingException; import javax.ws.rs.client.Invocation; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.Response; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation; import org.jboss.resteasy.test.client.exception.resource.ExceptionBufferingResource; import org.jboss.resteasy.utils.PortProviderUtil; import org.jboss.resteasy.utils.TestUtil; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * @tpSubChapter Resteasy-client * @tpChapter Client tests * @tpSince RESTEasy 3.0.16 * @tpTestCaseDetails Regression test for RESTEASY-981 */ @RunWith(Arquillian.class) @RunAsClient public class ExceptionBufferingTest { protected static final Logger logger = LogManager.getLogger(ExceptionBufferingTest.class.getName()); private static final String DEPLOYMENT_TRUE = "buffer"; private static final String DEPLOYMENT_FALSE = "nobuffer"; private static final String DEPLOYMENT_DEFAULT = "default"; protected static ResteasyClient client; @Deployment(name = DEPLOYMENT_TRUE) public static Archive<?> deployTrue() { WebArchive war = TestUtil.prepareArchive(DEPLOYMENT_TRUE); Map<String, String> params = new HashMap<>(); params.put("resteasy.buffer.exception.entity", "true"); return TestUtil.finishContainerPrepare(war, params, ExceptionBufferingResource.class); } @Deployment(name = DEPLOYMENT_FALSE) public static Archive<?> deployFalse() { WebArchive war = TestUtil.prepareArchive(DEPLOYMENT_FALSE); Map<String, String> params = new HashMap<>(); params.put("resteasy.buffer.exception.entity", "false"); return TestUtil.finishContainerPrepare(war, params, ExceptionBufferingResource.class); } @Deployment(name = DEPLOYMENT_DEFAULT) public static Archive<?> deployDefault() { WebArchive war = TestUtil.prepareArchive(DEPLOYMENT_DEFAULT); client = new ResteasyClientBuilder().build(); return TestUtil.finishContainerPrepare(war, null, ExceptionBufferingResource.class); } @AfterClass public static void init() throws Exception { client.close(); } /** * @tpTestDetails Test default value of resteasy.buffer.exception.entity property * @tpSince RESTEasy 3.0.16 */ @Test public void testBufferedResponseDefault() throws Exception { Response response = null; try { ResteasyWebTarget target = client.target(PortProviderUtil.generateURL("/test", DEPLOYMENT_DEFAULT)); Invocation invocation = target.request().buildGet(); response = invocation.invoke(); logger.info("status: " + response.getStatus()); String s = ClientInvocation.extractResult(new GenericType<String>(String.class), response, null); fail("Was expecting an exception: " + s); } catch (Exception e) { logger.info("caught: " + e); String entity = response.readEntity(String.class); logger.info("exception entity: " + entity); Assert.assertEquals("Wrong response content", "test", entity); } } /** * @tpTestDetails Test false value of resteasy.buffer.exception.entity property * @tpSince RESTEasy 3.0.16 */ @Test public void testBufferedResponseFalse() throws Exception { Response response = null; try { ResteasyWebTarget target = client.target(PortProviderUtil.generateURL("/test", DEPLOYMENT_FALSE)); Invocation invocation = target.request().buildGet(); response = invocation.invoke(); logger.info("status: " + response.getStatus()); String s = ClientInvocation.extractResult(new GenericType<String>(String.class), response, null); fail("Was expecting an exception: " + s); } catch (Exception e) { logger.info("caught: " + e); try { String s = response.readEntity(String.class); fail("Was expecting a second exception: " + s); } catch (ProcessingException e1) { logger.info("and caught: " + e1); Assert.assertTrue("Wrong exception thrown", e1.getCause() instanceof IOException); Assert.assertEquals("Attempted read on closed stream.", e1.getCause().getMessage()); } catch (Exception e1) { fail("Was expecting a ProcessingException instead of " + e1); } } } /** * @tpTestDetails Test true value of resteasy.buffer.exception.entity property * @tpSince RESTEasy 3.0.16 */ @Test public void testBufferedResponseTrue() throws Exception { Response response = null; try { ResteasyWebTarget target = client.target(PortProviderUtil.generateURL("/test", DEPLOYMENT_TRUE)); Invocation invocation = target.request().buildGet(); response = invocation.invoke(); logger.info("status: " + response.getStatus()); String s = ClientInvocation.extractResult(new GenericType<String>(String.class), response, null); fail("Was expecting an exception: " + s); } catch (Exception e) { logger.info("caught: " + e); String entity = response.readEntity(String.class); logger.info("exception entity: " + entity); Assert.assertEquals("Wrong responce content", "test", entity); } } }