package org.jboss.resteasy.test.client; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.client.AsyncInvoker; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.core.MediaType; 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.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; @RunWith(Arquillian.class) @RunAsClient public class ClientInvocationBuilderTest extends ClientTestBase{ @Path("/") public static class ClientInvocationBuilderResource { @POST @Produces("text/plain") public String post(String s) { return s; } @GET @Produces("text/plain") public String get() { String s = "default"; return s; } } @Deployment public static Archive<?> deploy() { WebArchive war = TestUtil.prepareArchive(ClientInvocationBuilderTest.class.getSimpleName()); war.addClass(ClientInvocationBuilderTest.class); war.addClass(ClientTestBase.class); return TestUtil.finishContainerPrepare(war, null, ClientInvocationBuilderResource.class); } @Test public void testBuildMethodReturnNewInstance() { ResteasyClient client = new ResteasyClientBuilder().build(); try { ResteasyWebTarget webTarget = client.target(generateURL("")); Builder invocationBuilder = webTarget.request(); // GET invocation ClientInvocation getInvocation = (ClientInvocation) invocationBuilder.accept(MediaType.TEXT_PLAIN_TYPE) .build("GET"); Assert.assertEquals("default", getInvocation.invoke(String.class)); // Alter invocationBuilder invocationBuilder.accept(MediaType.APPLICATION_XML_TYPE); invocationBuilder.property("property1", "property1Value"); // Previously built getInvocation must not have been altered.(Those // tests are not about immutability of // getInvocation instance but about Builder pattern behavior). Assert.assertFalse(getInvocation.getHeaders().getAcceptableMediaTypes() .contains(MediaType.APPLICATION_XML_TYPE)); Assert.assertFalse(getInvocation.getConfiguration().getProperties().containsKey("property1")); // POST invocation ClientInvocation postInvocation = (ClientInvocation) invocationBuilder.accept(MediaType.TEXT_PLAIN_TYPE) .build("POST", Entity.text("test")); // Previous lines must build a new postInvocation instance and not // modify previously built getInvocation instance. // (It's all about Builder pattern behavior not immutability since // Invocation is a mutable object.) Assert.assertNotSame(getInvocation, postInvocation); Assert.assertEquals("default", getInvocation.invoke(String.class)); Assert.assertTrue(postInvocation.getConfiguration().getProperties().containsKey("property1")); Assert.assertEquals("test", postInvocation.invoke(String.class)); } finally { client.close(); } } @Test public void testBuildMethodResetEntity() throws InterruptedException, ExecutionException { ResteasyClient client = new ResteasyClientBuilder().build(); try { ResteasyWebTarget webTarget = client.target(generateURL("")); Builder invocationBuilder = webTarget.request().accept(MediaType.TEXT_PLAIN_TYPE); // POST invocation ClientInvocation postInvocation = (ClientInvocation) invocationBuilder.build("POST", Entity.text("test")); Assert.assertEquals("test", postInvocation.invoke(String.class)); // GET invocation ClientInvocation getInvocation = (ClientInvocation) invocationBuilder.build("GET"); // In order the request to be OK, invocation instance built from // invocationBuilder must not contain the previous entity used for // post request. Assert.assertNull(getInvocation.getEntity()); Assert.assertEquals("default", getInvocation.invoke(String.class)); // Same test for async request AsyncInvoker async = invocationBuilder.async(); // POST invocation Future<String> postFuture = async.post(Entity.text("test"), String.class); Assert.assertEquals("test", postFuture.get()); // GET invocation Future<String> getFuture = async.get(String.class); Assert.assertEquals("default", getFuture.get()); } finally { client.close(); } } }