You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2014/02/25 23:30:13 UTC

git commit: [CXF-5339] Moving JAX-RS Web Socket test to its own package

Repository: cxf
Updated Branches:
  refs/heads/master 99e152091 -> 2d4c98545


[CXF-5339] Moving JAX-RS Web Socket test to its own package


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/2d4c9854
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/2d4c9854
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/2d4c9854

Branch: refs/heads/master
Commit: 2d4c98545ef4ff66d6f97b514eaeca3bad2664e1
Parents: 99e1520
Author: Sergey Beryozkin <sb...@talend.com>
Authored: Tue Feb 25 22:29:46 2014 +0000
Committer: Sergey Beryozkin <sb...@talend.com>
Committed: Tue Feb 25 22:29:46 2014 +0000

----------------------------------------------------------------------
 .../apache/cxf/systest/jaxrs/BookServer.java    |   3 -
 .../org/apache/cxf/systest/jaxrs/BookStore.java |  24 ---
 .../jaxrs/JAXRSClientServerWebSocketTest.java   |  97 ------------
 .../cxf/systest/jaxrs/WebSocketTestClient.java  | 155 -------------------
 .../jaxrs/websocket/BookServerWebSocket.java    |  83 ++++++++++
 .../jaxrs/websocket/BookStoreWebSocket.java     |  62 ++++++++
 .../JAXRSClientServerWebSocketTest.java         |  97 ++++++++++++
 .../jaxrs/websocket/WebSocketTestClient.java    | 155 +++++++++++++++++++
 8 files changed, 397 insertions(+), 279 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java
index acc54a8..f315564 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer.java
@@ -42,7 +42,6 @@ import org.apache.cxf.jaxrs.provider.BinaryDataProvider;
 import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
-import org.apache.cxf.transport.http_jetty.JettyHTTPDestination;
     
 public class BookServer extends AbstractBusTestServerBase {
     public static final String PORT = allocatePort(BookServer.class);
@@ -112,8 +111,6 @@ public class BookServer extends AbstractBusTestServerBase {
         sf.getProperties().put("default.content.type", "*/*");
         sf.getProperties().putAll(properties);
         server = sf.create();
-        ((JettyHTTPDestination)server.getDestination())
-            .setEnableWebSocket(Boolean.parseBoolean((String)properties.get("enableWebSocket")));
         BusFactory.setDefaultBus(null);
         BusFactory.setThreadDefaultBus(null);
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
index d343d27..7274e03 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
@@ -1151,30 +1151,6 @@ public class BookStore {
         }
     }
 
-    @GET
-    @Path("/bookbought")
-    @Produces("text/*")
-    public StreamingOutput getBookBought() {
-        return new StreamingOutput() {
-            public void write(final OutputStream out) throws IOException, WebApplicationException {
-                out.write(("Today: " + new java.util.Date()).getBytes());
-                // just for testing, using a thread
-                new Thread(new Runnable() {
-                    public void run() {
-                        try {
-                            for (int r = 2, i = 1; i <= 5; r *= 2, i++) {
-                                Thread.sleep(500);
-                                out.write(Integer.toString(r).getBytes());
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }).start();
-            }
-        };
-    }
-
     @POST
     @Path("/books/null")
     @Produces("application/xml")

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerWebSocketTest.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerWebSocketTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerWebSocketTest.java
deleted file mode 100644
index 06cdce4..0000000
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerWebSocketTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.cxf.systest.jaxrs;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
-import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class JAXRSClientServerWebSocketTest extends AbstractBusClientServerTestBase {
-    public static final String PORT = BookServer.PORT;
-    
-    @BeforeClass
-    public static void startServers() throws Exception {
-        final Map< String, Object > properties = new HashMap< String, Object >();        
-        properties.put("enableWebSocket", "true");
-
-        AbstractResourceInfo.clearAllMaps();
-        assertTrue("server did not launch correctly", launchServer(new BookServer(properties)));
-        createStaticBus();
-    }
-        
-    @Test
-    // seems to cause PermGen issue to another systests/jaxrs later in some system. the code under analysis
-    @org.junit.Ignore 
-    public void testBookWithWebSocket() throws Exception {
-        String address = "ws://localhost:" + PORT + "/bookstore";
-
-        WebSocketTestClient wsclient = new WebSocketTestClient(address, 1);
-        wsclient.connect();
-        try {
-            // call the GET service
-            wsclient.sendMessage("GET /bookstore/booknames/123".getBytes());
-            assertTrue("one book must be returned", wsclient.await(3));
-            List<byte[]> received = wsclient.getReceivedBytes();
-            assertEquals(1, received.size());
-            String value = new String(received.get(0));
-            assertEquals("CXF in Action", value);
-
-            // call another GET service
-            wsclient.reset(1);
-            wsclient.sendMessage("GET /bookstore/books/123".getBytes());
-            assertTrue("response expected", wsclient.await(3));
-            received = wsclient.getReceivedBytes();
-            value = new String(received.get(0));
-            assertTrue(value.startsWith("<?xml ") && value.endsWith("</Book>"));
-            
-            // call the GET service using POST
-            wsclient.reset(1);
-            wsclient.sendMessage("POST /bookstore/booknames\r\n\r\n123".getBytes());
-            assertFalse("wrong method, no response expected", wsclient.await(3));
-            
-            // call the POST service
-            wsclient.reset(1);
-            wsclient.sendMessage("POST /bookstore/booksplain\r\n\r\n123".getBytes());
-            assertTrue("response expected", wsclient.await(3));
-            received = wsclient.getReceivedBytes();
-            value = new String(received.get(0));
-            assertEquals("123", value);
-            
-            // call the GET service returning a continous stream output
-            wsclient.reset(6);
-            wsclient.sendMessage("GET /bookstore/bookbought".getBytes());
-            assertTrue("wrong method, no response expected", wsclient.await(5));
-            received = wsclient.getReceivedBytes();
-            assertEquals(6, received.size());
-            assertTrue((new String(received.get(0))).startsWith("Today:"));
-            for (int r = 2, i = 1; i < 6; r *= 2, i++) {
-                assertEquals(r, Integer.parseInt(new String(received.get(i))));
-            }
-        } finally {
-            wsclient.close();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/WebSocketTestClient.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/WebSocketTestClient.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/WebSocketTestClient.java
deleted file mode 100644
index 3e1b3bc..0000000
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/WebSocketTestClient.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.cxf.systest.jaxrs;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
-
-import com.ning.http.client.AsyncHttpClient;
-import com.ning.http.client.websocket.WebSocket;
-import com.ning.http.client.websocket.WebSocketByteListener;
-import com.ning.http.client.websocket.WebSocketTextListener;
-import com.ning.http.client.websocket.WebSocketUpgradeHandler;
-
-import org.apache.cxf.common.logging.LogUtils;
-
-
-
-/**
- * Test client to do websocket calls.
- * @see JAXRSClientServerWebSocketTest
- * 
- * we may put this in test-tools so that other systests can use this code.
- * for now keep it here to experiment jaxrs websocket scenarios.
- */
-class WebSocketTestClient {
-    private static final Logger LOG = LogUtils.getL7dLogger(WebSocketTestClient.class);
-
-    private List<String> received;
-    private List<byte[]> receivedBytes;
-    private CountDownLatch latch;
-    private AsyncHttpClient client;
-    private WebSocket websocket;
-    private String url;
-    
-    public WebSocketTestClient(String url, int count) {
-        this.received = new ArrayList<String>();
-        this.receivedBytes = new ArrayList<byte[]>();
-        this.latch = new CountDownLatch(count);
-        this.client = new AsyncHttpClient();
-        this.url = url;
-    }
-    
-    public void connect() throws InterruptedException, ExecutionException, IOException {
-        websocket = client.prepareGet(url).execute(
-            new WebSocketUpgradeHandler.Builder().addWebSocketListener(new WsSocketListener()).build()).get();
-    }
-
-    public void sendTextMessage(String message) {
-        websocket.sendTextMessage(message);
-    }
-
-    public void sendMessage(byte[] message) {
-        websocket.sendMessage(message);
-    }
-    
-    public boolean await(int secs) throws InterruptedException {
-        return latch.await(secs, TimeUnit.SECONDS);
-    }
-    
-    public void reset(int count) {
-        latch = new CountDownLatch(count);
-        received.clear();
-        receivedBytes.clear();
-    }
-
-    public List<String> getReceived() {
-        return received;
-    }
-    
-    public List<byte[]> getReceivedBytes() {
-        return receivedBytes;
-    }
-
-    public void close() {
-        websocket.close();
-        client.close();
-    }
-
-    class WsSocketListener implements WebSocketTextListener, WebSocketByteListener {
-
-        public void onOpen(WebSocket ws) {
-            LOG.info("[ws] opened");            
-        }
-
-        public void onClose(WebSocket ws) {
-            LOG.info("[ws] closed");            
-        }
-
-        public void onError(Throwable t) {
-            LOG.info("[ws] error: " + t);                        
-        }
-
-        public void onMessage(byte[] message) {
-            receivedBytes.add(message);
-            LOG.info("[ws] received bytes --> " + makeString(message));
-            latch.countDown();
-        }
-
-        public void onFragment(byte[] fragment, boolean last) {
-            // TODO Auto-generated method stub
-            LOG.info("TODO [ws] received fragment bytes --> " + makeString(fragment) + "; last? " + last);
-        }
-
-        public void onMessage(String message) {
-            received.add(message);
-            LOG.info("[ws] received --> " + message);
-            latch.countDown();
-        }
-
-        public void onFragment(String fragment, boolean last) {
-            // TODO Auto-generated method stub
-            LOG.info("TODO [ws] received fragment --> " + fragment + "; last? " + last);
-        }
-        
-    }
-    
-    private static String makeString(byte[] data) {
-        return data == null ? null : makeString(data, 0, data.length).toString();
-    }
-
-    private static StringBuilder makeString(byte[] data, int offset, int length) {
-        if (data .length > 256) {
-            return makeString(data, offset, 256).append("...");
-        }
-        StringBuilder xbuf = new StringBuilder().append("\nHEX: ");
-        StringBuilder cbuf = new StringBuilder().append("\nASC: ");
-        for (byte b : data) {
-            xbuf.append(Integer.toHexString(0xff & b)).append(' ');
-            cbuf.append((0x80 & b) != 0 ? '.' : (char)b).append("  ");
-        }
-        return xbuf.append(cbuf);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookServerWebSocket.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookServerWebSocket.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookServerWebSocket.java
new file mode 100644
index 0000000..7084406
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookServerWebSocket.java
@@ -0,0 +1,83 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs.websocket;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.cxf.transport.http_jetty.JettyHTTPDestination;
+    
+public class BookServerWebSocket extends AbstractBusTestServerBase {
+    public static final String PORT = allocatePort(BookServerWebSocket.class);
+     
+    org.apache.cxf.endpoint.Server server;
+    private Map< ? extends String, ? extends Object > properties;
+    
+    public BookServerWebSocket() {
+        this(Collections.< String, Object >emptyMap());
+    }
+    
+    /**
+     * Allow to specified custom contextual properties to be passed to factory bean
+     */
+    public BookServerWebSocket(final Map< ? extends String, ? extends Object > properties) {
+        this.properties = properties;
+    }
+    
+    protected void run() {
+        Bus bus = BusFactory.getDefaultBus();
+        setBus(bus);
+        JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+        sf.setBus(bus);
+        sf.setResourceClasses(BookStoreWebSocket.class);
+        sf.setResourceProvider(BookStoreWebSocket.class,
+                               new SingletonResourceProvider(new BookStoreWebSocket(), true));
+        sf.setAddress("http://localhost:" + PORT + "/");
+        server = sf.create();
+        ((JettyHTTPDestination)server.getDestination())
+            .setEnableWebSocket(Boolean.parseBoolean((String)properties.get("enableWebSocket")));
+        BusFactory.setDefaultBus(null);
+        BusFactory.setThreadDefaultBus(null);
+    }
+    
+    public void tearDown() throws Exception {
+        server.stop();
+        server.destroy();
+        server = null;
+    }
+
+    public static void main(String[] args) {
+        try {
+            BookServerWebSocket s = new BookServerWebSocket();
+            s.start();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            System.exit(-1);
+        } finally {
+            System.out.println("done!");
+        }
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookStoreWebSocket.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookStoreWebSocket.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookStoreWebSocket.java
new file mode 100644
index 0000000..6dd5149
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/BookStoreWebSocket.java
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs.websocket;
+
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.StreamingOutput;
+
+@Path("/bookstore")
+public class BookStoreWebSocket {
+    
+    
+    @GET
+    @Path("/bookbought")
+    @Produces("text/*")
+    public StreamingOutput getBookBought() {
+        return new StreamingOutput() {
+            public void write(final OutputStream out) throws IOException, WebApplicationException {
+                out.write(("Today: " + new java.util.Date()).getBytes());
+                // just for testing, using a thread
+                new Thread(new Runnable() {
+                    public void run() {
+                        try {
+                            for (int r = 2, i = 1; i <= 5; r *= 2, i++) {
+                                Thread.sleep(500);
+                                out.write(Integer.toString(r).getBytes());
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }).start();
+            }
+        };
+    }
+
+}
+
+

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..1933079
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/JAXRSClientServerWebSocketTest.java
@@ -0,0 +1,97 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs.websocket;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
+import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class JAXRSClientServerWebSocketTest extends AbstractBusClientServerTestBase {
+    public static final String PORT = BookServerWebSocket.PORT;
+    
+    @BeforeClass
+    public static void startServers() throws Exception {
+        final Map< String, Object > properties = new HashMap< String, Object >();        
+        properties.put("enableWebSocket", "true");
+
+        AbstractResourceInfo.clearAllMaps();
+        assertTrue("server did not launch correctly", launchServer(new BookServerWebSocket(properties)));
+        createStaticBus();
+    }
+        
+    @Test
+    // seems to cause PermGen issue to another systests/jaxrs later in some system. the code under analysis
+    @org.junit.Ignore 
+    public void testBookWithWebSocket() throws Exception {
+        String address = "ws://localhost:" + PORT + "/bookstore";
+
+        WebSocketTestClient wsclient = new WebSocketTestClient(address, 1);
+        wsclient.connect();
+        try {
+            // call the GET service
+            wsclient.sendMessage("GET /bookstore/booknames/123".getBytes());
+            assertTrue("one book must be returned", wsclient.await(3));
+            List<byte[]> received = wsclient.getReceivedBytes();
+            assertEquals(1, received.size());
+            String value = new String(received.get(0));
+            assertEquals("CXF in Action", value);
+
+            // call another GET service
+            wsclient.reset(1);
+            wsclient.sendMessage("GET /bookstore/books/123".getBytes());
+            assertTrue("response expected", wsclient.await(3));
+            received = wsclient.getReceivedBytes();
+            value = new String(received.get(0));
+            assertTrue(value.startsWith("<?xml ") && value.endsWith("</Book>"));
+            
+            // call the GET service using POST
+            wsclient.reset(1);
+            wsclient.sendMessage("POST /bookstore/booknames\r\n\r\n123".getBytes());
+            assertFalse("wrong method, no response expected", wsclient.await(3));
+            
+            // call the POST service
+            wsclient.reset(1);
+            wsclient.sendMessage("POST /bookstore/booksplain\r\n\r\n123".getBytes());
+            assertTrue("response expected", wsclient.await(3));
+            received = wsclient.getReceivedBytes();
+            value = new String(received.get(0));
+            assertEquals("123", value);
+            
+            // call the GET service returning a continous stream output
+            wsclient.reset(6);
+            wsclient.sendMessage("GET /bookstore/bookbought".getBytes());
+            assertTrue("wrong method, no response expected", wsclient.await(5));
+            received = wsclient.getReceivedBytes();
+            assertEquals(6, received.size());
+            assertTrue((new String(received.get(0))).startsWith("Today:"));
+            for (int r = 2, i = 1; i < 6; r *= 2, i++) {
+                assertEquals(r, Integer.parseInt(new String(received.get(i))));
+            }
+        } finally {
+            wsclient.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/2d4c9854/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/WebSocketTestClient.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/WebSocketTestClient.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/WebSocketTestClient.java
new file mode 100644
index 0000000..24af539
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/websocket/WebSocketTestClient.java
@@ -0,0 +1,155 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.jaxrs.websocket;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
+
+import com.ning.http.client.AsyncHttpClient;
+import com.ning.http.client.websocket.WebSocket;
+import com.ning.http.client.websocket.WebSocketByteListener;
+import com.ning.http.client.websocket.WebSocketTextListener;
+import com.ning.http.client.websocket.WebSocketUpgradeHandler;
+
+import org.apache.cxf.common.logging.LogUtils;
+
+
+
+/**
+ * Test client to do websocket calls.
+ * @see JAXRSClientServerWebSocketTest
+ * 
+ * we may put this in test-tools so that other systests can use this code.
+ * for now keep it here to experiment jaxrs websocket scenarios.
+ */
+class WebSocketTestClient {
+    private static final Logger LOG = LogUtils.getL7dLogger(WebSocketTestClient.class);
+
+    private List<String> received;
+    private List<byte[]> receivedBytes;
+    private CountDownLatch latch;
+    private AsyncHttpClient client;
+    private WebSocket websocket;
+    private String url;
+    
+    public WebSocketTestClient(String url, int count) {
+        this.received = new ArrayList<String>();
+        this.receivedBytes = new ArrayList<byte[]>();
+        this.latch = new CountDownLatch(count);
+        this.client = new AsyncHttpClient();
+        this.url = url;
+    }
+    
+    public void connect() throws InterruptedException, ExecutionException, IOException {
+        websocket = client.prepareGet(url).execute(
+            new WebSocketUpgradeHandler.Builder().addWebSocketListener(new WsSocketListener()).build()).get();
+    }
+
+    public void sendTextMessage(String message) {
+        websocket.sendTextMessage(message);
+    }
+
+    public void sendMessage(byte[] message) {
+        websocket.sendMessage(message);
+    }
+    
+    public boolean await(int secs) throws InterruptedException {
+        return latch.await(secs, TimeUnit.SECONDS);
+    }
+    
+    public void reset(int count) {
+        latch = new CountDownLatch(count);
+        received.clear();
+        receivedBytes.clear();
+    }
+
+    public List<String> getReceived() {
+        return received;
+    }
+    
+    public List<byte[]> getReceivedBytes() {
+        return receivedBytes;
+    }
+
+    public void close() {
+        websocket.close();
+        client.close();
+    }
+
+    class WsSocketListener implements WebSocketTextListener, WebSocketByteListener {
+
+        public void onOpen(WebSocket ws) {
+            LOG.info("[ws] opened");            
+        }
+
+        public void onClose(WebSocket ws) {
+            LOG.info("[ws] closed");            
+        }
+
+        public void onError(Throwable t) {
+            LOG.info("[ws] error: " + t);                        
+        }
+
+        public void onMessage(byte[] message) {
+            receivedBytes.add(message);
+            LOG.info("[ws] received bytes --> " + makeString(message));
+            latch.countDown();
+        }
+
+        public void onFragment(byte[] fragment, boolean last) {
+            // TODO Auto-generated method stub
+            LOG.info("TODO [ws] received fragment bytes --> " + makeString(fragment) + "; last? " + last);
+        }
+
+        public void onMessage(String message) {
+            received.add(message);
+            LOG.info("[ws] received --> " + message);
+            latch.countDown();
+        }
+
+        public void onFragment(String fragment, boolean last) {
+            // TODO Auto-generated method stub
+            LOG.info("TODO [ws] received fragment --> " + fragment + "; last? " + last);
+        }
+        
+    }
+    
+    private static String makeString(byte[] data) {
+        return data == null ? null : makeString(data, 0, data.length).toString();
+    }
+
+    private static StringBuilder makeString(byte[] data, int offset, int length) {
+        if (data .length > 256) {
+            return makeString(data, offset, 256).append("...");
+        }
+        StringBuilder xbuf = new StringBuilder().append("\nHEX: ");
+        StringBuilder cbuf = new StringBuilder().append("\nASC: ");
+        for (byte b : data) {
+            xbuf.append(Integer.toHexString(0xff & b)).append(' ');
+            cbuf.append((0x80 & b) != 0 ? '.' : (char)b).append("  ");
+        }
+        return xbuf.append(cbuf);
+    }
+}