This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch 3.3.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 1525974f5b6de5dc9a6c9a8ca81daa91317e19c3 Author: Colm O hEigeartaigh <cohei...@apache.org> AuthorDate: Thu Aug 22 11:44:01 2019 +0100 CXF-8086,CXF-8087 - Fix flaky jaxrs system tests (cherry picked from commit d47f3a587d4982b9eeccd8b974fbde6bc996530f) --- ...=> AbstractJAXRSClientServerWebSocketTest.java} | 17 +- ...JAXRSClientServerWebSocketNoAtmosphereTest.java | 4 +- ...lientServerWebSocketSpringNoAtmosphereTest.java | 2 +- .../JAXRSClientServerWebSocketSpringTest.java | 5 +- ...erverWebSocketSpringWebAppNoAtmosphereTest.java | 58 ++- ...JAXRSClientServerWebSocketSpringWebAppTest.java | 5 +- .../websocket/JAXRSClientServerWebSocketTest.java | 450 +-------------------- 7 files changed, 70 insertions(+), 471 deletions(-) diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/AbstractJAXRSClientServerWebSocketTest.java similarity index 97% copy from systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java copy to systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/AbstractJAXRSClientServerWebSocketTest.java index 12ab68f..96dca4b 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/AbstractJAXRSClientServerWebSocketTest.java @@ -23,12 +23,10 @@ import java.util.List; import java.util.UUID; import org.apache.cxf.jaxrs.client.WebClient; -import org.apache.cxf.jaxrs.model.AbstractResourceInfo; import org.apache.cxf.systest.jaxrs.Book; import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; import org.apache.cxf.transport.websocket.WebSocketConstants; -import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -37,15 +35,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -public class JAXRSClientServerWebSocketTest extends AbstractBusClientServerTestBase { - private static final String PORT = BookServerWebSocket.PORT; - - @BeforeClass - public static void startServers() throws Exception { - AbstractResourceInfo.clearAllMaps(); - assertTrue("server did not launch correctly", launchServer(new BookServerWebSocket())); - createStaticBus(); - } +abstract class AbstractJAXRSClientServerWebSocketTest extends AbstractBusClientServerTestBase { @Test public void testBookWithWebSocket() throws Exception { @@ -480,9 +470,8 @@ public class JAXRSClientServerWebSocketTest extends AbstractBusClientServerTestB } } - protected String getPort() { - return PORT; - } + abstract String getPort(); + protected String getContext() { return ""; } diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketNoAtmosphereTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketNoAtmosphereTest.java index f0c5cb7..32d363b 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketNoAtmosphereTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketNoAtmosphereTest.java @@ -29,7 +29,7 @@ import static org.junit.Assert.assertTrue; /** * JAXRSClientServerWebSocketTest without atmosphere */ -public class JAXRSClientServerWebSocketNoAtmosphereTest extends JAXRSClientServerWebSocketTest { +public class JAXRSClientServerWebSocketNoAtmosphereTest extends AbstractJAXRSClientServerWebSocketTest { private static final String PORT = BookServerWebSocket.PORT2; @BeforeClass @@ -42,7 +42,7 @@ public class JAXRSClientServerWebSocketNoAtmosphereTest extends JAXRSClientServe @AfterClass public static void cleanup() { - //System.clearProperty("org.apache.cxf.transport.websocket.atmosphere.disabled"); + System.clearProperty("org.apache.cxf.transport.websocket.atmosphere.disabled"); } protected String getPort() { diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringNoAtmosphereTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringNoAtmosphereTest.java index da72cc1..3d99b3a 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringNoAtmosphereTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringNoAtmosphereTest.java @@ -44,7 +44,7 @@ public class JAXRSClientServerWebSocketSpringNoAtmosphereTest extends JAXRSClien @AfterClass public static void cleanup() { - //System.clearProperty("org.apache.cxf.transport.websocket.atmosphere.disabled"); + System.clearProperty("org.apache.cxf.transport.websocket.atmosphere.disabled"); } protected String getPort() { diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringTest.java index 588dfd9..a06f7f3 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringTest.java @@ -19,6 +19,7 @@ package org.apache.cxf.systest.jaxrs.websocket; +import org.apache.cxf.jaxrs.model.AbstractResourceInfo; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -27,10 +28,12 @@ import org.junit.BeforeClass; /** * JAXRSClientServerWebSocket test with jaxrs:server using the embedded jetty server. */ -public class JAXRSClientServerWebSocketSpringTest extends JAXRSClientServerWebSocketTest { +public class JAXRSClientServerWebSocketSpringTest extends AbstractJAXRSClientServerWebSocketTest { private static final String PORT = BookServerWebSocket.PORT_SPRING; + @BeforeClass public static void startServers() throws Exception { + AbstractResourceInfo.clearAllMaps(); @SuppressWarnings({ "unused", "resource" }) ApplicationContext appctxt = diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppNoAtmosphereTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppNoAtmosphereTest.java index 6d1ade5..937b5d1 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppNoAtmosphereTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppNoAtmosphereTest.java @@ -19,27 +19,79 @@ package org.apache.cxf.systest.jaxrs.websocket; +import java.net.URISyntaxException; + +import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.jaxrs.model.AbstractResourceInfo; +import org.apache.cxf.systest.jaxrs.Book; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.handler.DefaultHandler; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.webapp.WebAppContext; + import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; /** * JAXRSClientServerWebSocketSpringWebAppTest without atmosphere */ -public class JAXRSClientServerWebSocketSpringWebAppNoAtmosphereTest extends JAXRSClientServerWebSocketSpringWebAppTest { +public class JAXRSClientServerWebSocketSpringWebAppNoAtmosphereTest extends AbstractJAXRSClientServerWebSocketTest { private static final String PORT = BookServerWebSocket.PORT2_WAR; + private static org.eclipse.jetty.server.Server server; @BeforeClass public static void startServers() throws Exception { System.setProperty("org.apache.cxf.transport.websocket.atmosphere.disabled", "true"); + AbstractResourceInfo.clearAllMaps(); + startServers(PORT); } + protected static void startServers(String port) throws Exception { + server = new org.eclipse.jetty.server.Server(Integer.parseInt(port)); + + WebAppContext webappcontext = new WebAppContext(); + String contextPath = null; + try { + contextPath = JAXRSClientServerWebSocketSpringWebAppTest.class + .getResource("/jaxrs_websocket").toURI().getPath(); + } catch (URISyntaxException e1) { + e1.printStackTrace(); + } + webappcontext.setContextPath("/webapp"); + + webappcontext.setWar(contextPath); + HandlerCollection handlers = new HandlerCollection(); + handlers.setHandlers(new Handler[] {webappcontext, new DefaultHandler()}); + server.setHandler(handlers); + server.start(); + } + @AfterClass - public static void cleanup() { - //System.clearProperty("org.apache.cxf.transport.websocket.atmosphere.disabled"); + public static void stopServers() throws Exception { + server.stop(); + server.destroy(); + System.clearProperty("org.apache.cxf.transport.websocket.atmosphere.disabled"); + } + + @Test + public void testGetBookHTTP() throws Exception { + String address = "http://localhost:" + getPort() + getContext() + "/http/web/bookstore/books/1"; + WebClient wc = WebClient.create(address); + wc.accept("application/xml"); + Book book = wc.get(Book.class); + assertEquals(1L, book.getId()); } protected String getPort() { return PORT; } + + @Override + protected String getContext() { + return "/webapp"; + } } diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppTest.java index dc8c5a7..bb84c92 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketSpringWebAppTest.java @@ -22,6 +22,7 @@ package org.apache.cxf.systest.jaxrs.websocket; import java.net.URISyntaxException; import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.jaxrs.model.AbstractResourceInfo; import org.apache.cxf.systest.jaxrs.Book; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.handler.DefaultHandler; @@ -37,12 +38,14 @@ import static org.junit.Assert.assertEquals; /** * JAXRSClientServerWebSocket test with jaxrs:server using the jetty webapp server. */ -public class JAXRSClientServerWebSocketSpringWebAppTest extends JAXRSClientServerWebSocketTest { +public class JAXRSClientServerWebSocketSpringWebAppTest extends AbstractJAXRSClientServerWebSocketTest { private static final String PORT = BookServerWebSocket.PORT_WAR; private static org.eclipse.jetty.server.Server server; @BeforeClass public static void startServers() throws Exception { + AbstractResourceInfo.clearAllMaps(); + startServers(PORT); } diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java index 12ab68f..ee8eab2 100644 --- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java +++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java @@ -19,25 +19,13 @@ package org.apache.cxf.systest.jaxrs.websocket; -import java.util.List; -import java.util.UUID; - -import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.model.AbstractResourceInfo; -import org.apache.cxf.systest.jaxrs.Book; -import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; -import org.apache.cxf.transport.websocket.WebSocketConstants; import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -public class JAXRSClientServerWebSocketTest extends AbstractBusClientServerTestBase { +public class JAXRSClientServerWebSocketTest extends AbstractJAXRSClientServerWebSocketTest { private static final String PORT = BookServerWebSocket.PORT; @BeforeClass @@ -47,443 +35,7 @@ public class JAXRSClientServerWebSocketTest extends AbstractBusClientServerTestB createStaticBus(); } - @Test - public void testBookWithWebSocket() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - // call the GET service - wsclient.sendMessage(("GET " + getContext() + "/websocket/web/bookstore/booknames").getBytes()); - assertTrue("one book must be returned", wsclient.await(30000)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(1, received.size()); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - String value = resp.getTextEntity(); - assertEquals("CXF in Action", value); - - // call the same GET service in the text mode - wsclient.reset(1); - wsclient.sendTextMessage("GET " + getContext() + "/websocket/web/bookstore/booknames"); - assertTrue("one book must be returned", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - assertEquals(1, received.size()); - resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - value = resp.getTextEntity(); - assertEquals("CXF in Action", value); - - // call another GET service - wsclient.reset(1); - wsclient.sendMessage(("GET " + getContext() + "/websocket/web/bookstore/books/123").getBytes()); - assertTrue("response expected", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("application/xml", resp.getContentType()); - value = resp.getTextEntity(); - assertTrue(value.startsWith("<?xml ") && value.endsWith("</Book>")); - - // call the POST service - wsclient.reset(1); - wsclient.sendMessage( - ("POST " + getContext() + "/websocket/web/bookstore/booksplain\r\nContent-Type: text/plain\r\n\r\n123") - .getBytes()); - assertTrue("response expected", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - value = resp.getTextEntity(); - assertEquals("123", value); - - // call the same POST service in the text mode - wsclient.reset(1); - wsclient.sendTextMessage( - "POST " + getContext() + "/websocket/web/bookstore/booksplain\r\nContent-Type: text/plain\r\n\r\n123"); - assertTrue("response expected", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - value = resp.getTextEntity(); - assertEquals("123", value); - - // call the GET service returning a continous stream output - wsclient.reset(6); - wsclient.sendMessage(("GET " + getContext() + "/websocket/web/bookstore/bookbought").getBytes()); - assertTrue("response expected", wsclient.await(5)); - received = wsclient.getReceivedResponses(); - assertEquals(6, received.size()); - resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("application/octet-stream", resp.getContentType()); - value = resp.getTextEntity(); - assertTrue(value.startsWith("Today:")); - for (int r = 2, i = 1; i < 6; r *= 2, i++) { - // subsequent data should not carry the headers nor the status. - resp = received.get(i); - assertEquals(0, resp.getStatusCode()); - assertEquals(r, Integer.parseInt(resp.getTextEntity())); - } - } finally { - wsclient.close(); - } - } - - @Test - public void testGetBookStream() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - wsclient.reset(5); - wsclient.sendMessage( - ("GET " + getContext() + "/websocket/web/bookstore/bookstream\r\nAccept: application/json\r\n\r\n") - .getBytes()); - assertTrue("response expected", wsclient.await(5)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(5, received.size()); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("application/json", resp.getContentType()); - String value = resp.getTextEntity(); - assertEquals(value, getBookJson(1)); - for (int i = 2; i <= 5; i++) { - // subsequent data should not carry the headers nor the status. - resp = received.get(i - 1); - assertEquals(0, resp.getStatusCode()); - assertEquals(resp.getTextEntity(), getBookJson(i)); - } - } finally { - wsclient.close(); - } - } - - @Test - public void testGetBookStreamWithIDReferences() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - wsclient.reset(5); - String reqid = UUID.randomUUID().toString(); - wsclient.sendMessage( - ("GET " + getContext() + "/websocket/web/bookstore/bookstream\r\nAccept: application/json\r\n" - + WebSocketConstants.DEFAULT_REQUEST_ID_KEY + ": " + reqid + "\r\n\r\n") - .getBytes()); - assertTrue("response expected", wsclient.await(5)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(5, received.size()); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("application/json", resp.getContentType()); - String value = resp.getTextEntity(); - assertEquals(value, getBookJson(1)); - for (int i = 2; i <= 5; i++) { - // subsequent data should not carry the status but the id header - resp = received.get(i - 1); - assertEquals(0, resp.getStatusCode()); - assertEquals(reqid, resp.getId()); - assertEquals(resp.getTextEntity(), getBookJson(i)); - } - } finally { - wsclient.close(); - } - } - - private String getBookJson(int index) { - return "{\"Book\":{\"id\":" + index + ",\"name\":\"WebSocket" + index + "\"}}"; - } - - @Test - public void testBookWithWebSocketAndHTTP() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - // call the GET service - wsclient.sendMessage(("GET " + getContext() + "/websocket/web/bookstore/booknames").getBytes()); - assertTrue("one book must be returned", wsclient.await(3)); - List<Object> received = wsclient.getReceived(); - assertEquals(1, received.size()); - WebSocketTestClient.Response resp = new WebSocketTestClient.Response(received.get(0)); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - String value = resp.getTextEntity(); - assertEquals("CXF in Action", value); - - testGetBookHTTPFromWebSocketEndpoint(); - - } finally { - wsclient.close(); - } - } - - @Test - public void testGetBookHTTPFromWebSocketEndpoint() throws Exception { - String address = "http://localhost:" + getPort() + getContext() + "/websocket/web/bookstore/books/1"; - WebClient wc = WebClient.create(address); - wc.accept("application/xml"); - Book book = wc.get(Book.class); - assertEquals(1L, book.getId()); - } - - @Test - public void testBookWithWebSocketServletStream() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - wsclient.sendMessage(("GET " + getContext() + "/websocket/web/bookstore/booknames/servletstream") - .getBytes()); - assertTrue("one book must be returned", wsclient.await(3)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(1, received.size()); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - String value = resp.getTextEntity(); - assertEquals("CXF in Action", value); - } finally { - wsclient.close(); - } - } - - @Test - public void testWrongMethod() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - // call the GET service using POST - wsclient.reset(1); - wsclient.sendMessage(("POST " + getContext() + "/websocket/web/bookstore/booknames").getBytes()); - assertTrue("error response expected", wsclient.await(3)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(1, received.size()); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(405, resp.getStatusCode()); - } finally { - wsclient.close(); - } - } - - @Test - public void testPathRestriction() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - // call the GET service over the different path - wsclient.sendMessage(("GET " + getContext() + "/websocket/bookstore2").getBytes()); - assertTrue("error response expected", wsclient.await(3)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(1, received.size()); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(400, resp.getStatusCode()); - } finally { - wsclient.close(); - } - } - - @Test - public void testCallsWithIDReferences() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - // call the POST service without requestId - wsclient.sendTextMessage( - "POST " + getContext() + "/websocket/web/bookstore/booksplain\r\nContent-Type: text/plain\r\n\r\n459"); - assertTrue("response expected", wsclient.await(3)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - WebSocketTestClient.Response resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - String value = resp.getTextEntity(); - assertEquals("459", value); - String id = resp.getId(); - assertNull("response id is incorrect", id); - - // call the POST service twice with a unique requestId - wsclient.reset(2); - String reqid1 = UUID.randomUUID().toString(); - String reqid2 = UUID.randomUUID().toString(); - wsclient.sendTextMessage( - "POST " + getContext() + "/websocket/web/bookstore/booksplain\r\nContent-Type: text/plain\r\n" - + WebSocketConstants.DEFAULT_REQUEST_ID_KEY + ": " + reqid1 + "\r\n\r\n549"); - wsclient.sendTextMessage( - "POST " + getContext() + "/websocket/web/bookstore/booksplain\r\nContent-Type: text/plain\r\n" - + WebSocketConstants.DEFAULT_REQUEST_ID_KEY + ": " + reqid2 + "\r\n\r\n495"); - assertTrue("response expected", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - for (WebSocketTestClient.Response r : received) { - assertEquals(200, r.getStatusCode()); - assertEquals("text/plain", r.getContentType()); - value = r.getTextEntity(); - id = r.getId(); - if (reqid1.equals(id)) { - assertEquals("549", value); - } else if (reqid2.equals(id)) { - assertEquals("495", value); - } else { - fail("unexpected responseId: " + id); - } - } - } finally { - wsclient.close(); - } - } - - @Test - public void testCallsInParallel() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient = new WebSocketTestClient(address); - wsclient.connect(); - try { - // call the GET service that takes a long time to response - wsclient.reset(2); - wsclient.sendTextMessage( - "GET " + getContext() + "/websocket/web/bookstore/hold/3000"); - wsclient.sendTextMessage( - "GET " + getContext() + "/websocket/web/bookstore/hold/3000"); - // each call takes 3 seconds but executed in parallel, so waiting 4 secs is sufficient - assertTrue("response expected", wsclient.await(4)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - assertEquals(2, received.size()); - } finally { - wsclient.close(); - } - } - - @Test - public void testStreamRegisterAndUnregister() throws Exception { - String address = "ws://localhost:" + getPort() + getContext() + "/websocket/web/bookstore"; - - WebSocketTestClient wsclient1 = new WebSocketTestClient(address); - WebSocketTestClient wsclient2 = new WebSocketTestClient(address); - wsclient1.connect(); - wsclient2.connect(); - try { - String regkey = UUID.randomUUID().toString(); - - EventCreatorRunner runner = new EventCreatorRunner(wsclient2, regkey, 1000, 1000); - new Thread(runner).start(); - - // register for the event stream with requestId ane expect to get 2 messages - wsclient1.reset(3); - wsclient1.sendTextMessage( - "GET " + getContext() + "/websocket/web/bookstore/events/register\r\n" - + WebSocketConstants.DEFAULT_REQUEST_ID_KEY + ": " + regkey + "\r\n\r\n"); - assertFalse("only 2 responses expected", wsclient1.await(5)); - List<WebSocketTestClient.Response> received = wsclient1.getReceivedResponses(); - assertEquals(2, received.size()); - - // the first response is the registration confirmation - WebSocketTestClient.Response resp = received.get(0); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain", resp.getContentType()); - String value = resp.getTextEntity(); - assertTrue(value.startsWith("Registered " + regkey)); - String id = resp.getId(); - assertEquals("unexpected responseId", regkey, id); - - // the second response is the event news - resp = received.get(1); - assertEquals(0, resp.getStatusCode()); - value = resp.getTextEntity(); - assertEquals("News: event Hello created", value); - id = resp.getId(); - assertEquals("unexpected responseId", regkey, id); - - String[] values = runner.getValues(); - assertTrue(runner.isCompleted()); - assertEquals("Hello created", values[0]); - assertTrue(values[1].startsWith("Unregistered: " + regkey)); - assertEquals("Hola created", values[2]); - } finally { - wsclient1.close(); - wsclient2.close(); - } - } - - private class EventCreatorRunner implements Runnable { - private WebSocketTestClient wsclient; - private String key; - private long delay1; - private long delay2; - private String[] values = new String[3]; - private boolean completed; - - EventCreatorRunner(WebSocketTestClient wsclient, String key, long delay1, long delay2) { - this.wsclient = wsclient; - this.key = key; - this.delay1 = delay1; - this.delay2 = delay2; - } - - public void run() { - try { - Thread.sleep(delay1); - // creating an event and the event stream will see this event - wsclient.sendTextMessage( - "GET " + getContext() + "/websocket/web/bookstore/events/create/Hello\r\n\r\n"); - assertTrue("response expected", wsclient.await(3)); - List<WebSocketTestClient.Response> received = wsclient.getReceivedResponses(); - WebSocketTestClient.Response resp = received.get(0); - values[0] = resp.getTextEntity(); - - Thread.sleep(delay2); - wsclient.reset(1); - // unregistering the event stream - wsclient.sendTextMessage( - "GET " + getContext() + "/websocket/web/bookstore/events/unregister/" + key + "\r\n\r\n"); - assertTrue("response expected", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - resp = received.get(0); - values[1] = resp.getTextEntity(); - - wsclient.reset(1); - // creating another event and the event stream will not see this event - wsclient.sendTextMessage( - "GET " + getContext() + "/websocket/web/bookstore/events/create/Hola\r\n\r\n"); - assertTrue("response expected", wsclient.await(3)); - received = wsclient.getReceivedResponses(); - resp = received.get(0); - values[2] = resp.getTextEntity(); - } catch (InterruptedException e) { - // ignore - } finally { - completed = true; - } - } - - public String[] getValues() { - return values; - } - - public boolean isCompleted() { - return completed; - } - } - protected String getPort() { return PORT; } - protected String getContext() { - return ""; - } }