You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2019/08/22 12:16:40 UTC
[cxf] 02/03: CXF-8086,CXF-8087 - Fix flaky jaxrs system tests
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 <co...@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 "";
- }
}