package org.jboss.resteasy.springmvc.test.spring; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.core.AsynchronousDispatcher; import org.jboss.resteasy.spi.ResteasyDeployment; import org.jboss.resteasy.springmvc.tjws.TJWSEmbeddedSpringMVCServerBean; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.client.Client; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import java.net.URI; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/spring-test-async.xml" }) @DirtiesContext public class AsynchSpringTest { private static CountDownLatch latch; @Path("/") public static class MyResource { @POST public String post(String content) throws Exception { Thread.sleep(1500); latch.countDown(); return content; } @PUT public void put(String content) throws Exception { System.out.println("IN PUT!!!!"); Assert.assertEquals("content", content); Thread.sleep(500); System.out.println("******* countdown ****"); latch.countDown(); } } AsynchronousDispatcher dispatcher; @Autowired public void setServer(TJWSEmbeddedSpringMVCServerBean server) { ResteasyDeployment deployment = (ResteasyDeployment)server.getServer() .getApplicationContext().getBeansOfType( ResteasyDeployment.class).values().iterator().next(); dispatcher = (AsynchronousDispatcher)deployment.getDispatcher(); } @Test public void testOneway() throws Exception { latch = new CountDownLatch(1); Client client = ResteasyClientBuilder.newClient(); WebTarget target = client.target("http://localhost:9091?oneway=true"); long start = System.currentTimeMillis(); Response response = target.request().put(Entity.entity("content", "text/plain")); long end = System.currentTimeMillis() - start; Assert.assertEquals(HttpServletResponse.SC_ACCEPTED, response.getStatus()); Assert.assertTrue(end < 1000); Assert.assertTrue(latch.await(2, TimeUnit.SECONDS)); response.close(); } @Test public void testAsynch() throws Exception { Client client = ResteasyClientBuilder.newClient(); Response response = null; { latch = new CountDownLatch(1); long start = System.currentTimeMillis(); response = client.target("http://localhost:9091?asynch=true").request().post(Entity.entity("content", "text/plain")); long end = System.currentTimeMillis() - start; Assert.assertEquals(HttpServletResponse.SC_ACCEPTED, response.getStatus()); String jobUrl = response.getHeaderString(HttpHeaders.LOCATION); System.out.println("JOB: " + jobUrl); response.close(); Builder jobBuilder = client.target(jobUrl).request(); response = jobBuilder.get(); Assert.assertEquals(HttpServletResponse.SC_ACCEPTED, response.getStatus()); Assert.assertTrue(latch.await(3, TimeUnit.SECONDS)); response.close(); // there's a lag between when the latch completes and the executor // registers the completion of the call URI oldUri = new URI(jobUrl); String existingQueryString = oldUri.getQuery(); String newQuery = (existingQueryString == null ? "" : "&") + "wait=1000"; URI newUri = new URI(oldUri.getScheme(), oldUri.getAuthority(), oldUri.getPath(), newQuery, oldUri.getFragment()); response = client.target(newUri).request().get(); Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus()); Assert.assertEquals("content", response.readEntity(String.class)); // test its still there response = jobBuilder.get(); Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus()); Assert.assertEquals("content", response.readEntity(String.class)); // delete and test delete response = jobBuilder.delete(); Assert.assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); response = jobBuilder.get(); Assert.assertEquals(HttpServletResponse.SC_GONE, response.getStatus()); response.close(); } { dispatcher.setMaxCacheSize(1); latch = new CountDownLatch(1); Builder builder = client.target("http://localhost:9091?asynch=true").request(); response = builder.post(Entity.entity("content", "text/plain")); Assert.assertEquals(HttpServletResponse.SC_ACCEPTED, response.getStatus()); String jobUrl1 = response.getHeaderString(HttpHeaders.LOCATION); System.out.println("JOB: " + jobUrl1); Assert.assertTrue(latch.await(3, TimeUnit.SECONDS)); response.close(); latch = new CountDownLatch(1); response = builder.post(Entity.entity("content", "text/plain")); Assert.assertEquals(HttpServletResponse.SC_ACCEPTED, response.getStatus()); String jobUrl2 = response.getHeaderString(HttpHeaders.LOCATION); Assert.assertTrue(latch.await(3, TimeUnit.SECONDS)); Assert.assertTrue(!jobUrl1.equals(jobUrl2)); response.close(); builder = client.target(jobUrl1).request(); response = builder.get(); Assert.assertEquals(HttpServletResponse.SC_GONE, response.getStatus()); response.close(); // test its still there Thread.sleep(1000); builder = client.target(jobUrl2).request(); response = builder.get(); Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus()); Assert.assertEquals("content", response.readEntity(String.class)); // delete and test delete response = builder.delete(); Assert.assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); response = builder.get(); Assert.assertEquals(HttpServletResponse.SC_GONE, response.getStatus()); response.close(); } // test readAndRemove { dispatcher.setMaxCacheSize(10); latch = new CountDownLatch(1); Builder builder = client.target("http://localhost:9091?asynch=true").request(); response = builder.post(Entity.entity("content", "text/plain")); Assert.assertEquals(HttpServletResponse.SC_ACCEPTED, response.getStatus()); String jobUrl2 = response.getHeaderString(HttpHeaders.LOCATION); System.out.println("JOB: " + jobUrl2); Assert.assertTrue(latch.await(3, TimeUnit.SECONDS)); response.close(); Thread.sleep(1000); // test its still there builder = client.target(jobUrl2).request(); response = builder.post(Entity.entity("content", "text/plain")); Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatus()); Assert.assertEquals("content", response.readEntity(String.class)); builder = client.target(jobUrl2).request(); response = builder.get(); Assert.assertEquals(HttpServletResponse.SC_GONE, response.getStatus()); response.close(); } } }