Lalit Lakhotia
Lalit Lakhotia

Reputation: 41

How to do unit test websocket with embedded jetty?

I want to write Junit UT case for my websocket serverendpoint code using embedded Jetty.

i tried things explained in below link: JUnit test with javax.websocket on embedded Jetty throws RejectedExecutionException: NonBlockingThread

I want to test my onMessage callback for websocket. If i dont use server.join() method then the connection closes as soon as it opens. If i use server.join() method nothing happens after joining.

Below is My code.

Server startup code::

public class EmbeddedJettyServer {

private final int port;
    private Server server;

    public EmbeddedJettyServer(int port) {
        this.port = port;
    }

    public void start() throws Exception {
        server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8080);
        server.addConnector(connector);

        // Setup the basic application "context" for this application at "/"
        // This is also known as the handler tree (in jetty speak)
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        try {
            // Initialize javax.websocket layer
            ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);

            // Add WebSocket endpoint to javax.websocket layer
            wscontainer.addEndpoint(WebSocketServer.class);
            System.out.println("Begin start");
            server.start();
            server.dump(System.err);
            server.join();


        } catch (Throwable t) {
            t.printStackTrace(System.err);
        }
    }

    public void stop() throws Exception {
        server.stop();
        LOGGER.info("Jetty server stopped");
    }

    public URI getWebsocketUri(Class<WebSocketServer> class1) {         
        return  server.getURI();
    }

}

Client Code:

 @ClientEndpoint()
public class WebSocketClientJetty {

WebSocketContainer container;

public  Session connect(URI uri) throws Exception {
    WebSocketContainer container = ContainerProvider.getWebSocketContainer();

    try {
        // Attempt Connect
          Session session = container.connectToServer(WebSocketClientJetty.class,uri);
       // return container.connectToServer(WebSocketClientJetty.class, uri);
          session.getBasicRemote().sendText("Hello");
            // Close session
          // session.close();

            return session;
    } finally {


    }
}

public  void stop() throws Exception{
    if (container instanceof LifeCycle) {
        ((LifeCycle) container).stop();
    }
}

@OnOpen
public void onWebSocketConnect(Session sess)
{
    System.out.println("Socket Connected: " + sess);
}

@OnMessage
public void onWebSocketText(String message)
{
    System.out.println("Received TEXT message: " + message);
}

@OnClose
public void onWebSocketClose(CloseReason reason)
{
    System.out.println("Socket Closed: " + reason);
}

@OnError
public void onWebSocketError(Throwable cause)
{
    cause.printStackTrace(System.err);
}

}

Serverendpoint code:

@ServerEndpoint(value = "/echo",
encoders={JsonEncoder.class}) 
public class WebSocketServer {

private static final Logger LOGGER = 



@OnOpen
public void onOpen(Session session){
    System.out.println("onopen");
    some code....
}



@OnMessage
public void onMessage(String message, Session session) throws IOException{
    System.out.println("onmessage");
    ....
}


@OnClose
public void onClose(Session session){
    System.out.println("onClose");
    ...
}

}

Ut case:

public class WebSocketJettyTest {

private static EmbeddedJettyServer server;

@ClassRule
public static final ExternalResource integrationServer = new ExternalResource() {
    @Override
    protected void before() throws Throwable {
        System.out.println("Starting...");
        server = new EmbeddedJettyServer(8080);
        server.start();
        System.out.println("Started");
    }
};


@Before
public void setUp() throws Exception {

}

@After
public void shutdown() throws Exception {
    server.stop();
}

@Test
public void testSocket() throws Exception {
    /*URI uri = server.getWebsocketUri(WebSocketServer.class);*/
    URI uri = URI.create("ws://localhost:8080/echo");
    WebSocketClientJetty client = new WebSocketClientJetty();
    Session session = client.connect(uri);
    session.getBasicRemote().sendText("hello");
    Thread.sleep(6000);
    client.stop();
}

}

Upvotes: 4

Views: 2466

Answers (1)

Joakim Erdfelt
Joakim Erdfelt

Reputation: 49462

Drop the call to

server.join();

That just makes the current thread wait until the server thread stops. Which is making it difficult for you.

Upvotes: 1

Related Questions