package org.jooby.internal.jetty; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import java.util.function.Consumer; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.SuspendToken; import org.eclipse.jetty.websocket.api.WriteCallback; import org.jooby.WebSocket; import org.jooby.WebSocket.OnError; import org.jooby.WebSocket.SuccessCallback; import org.jooby.test.MockUnit; import org.junit.Test; import org.slf4j.Logger; public class JettyWebSocketTest { @Test public void newObject() throws Exception { new MockUnit() .run(unit -> { new JettyWebSocket(); }); } @Test public void resume() throws Exception { new MockUnit() .run(unit -> { new JettyWebSocket().resume(); }); } @Test public void pause() throws Exception { JettyWebSocket ws = new JettyWebSocket(); new MockUnit(Session.class, Runnable.class, SuspendToken.class) .expect(unit -> { Runnable connect = unit.get(Runnable.class); connect.run(); }) .expect(unit -> { SuspendToken token = unit.get(SuspendToken.class); token.resume(); Session session = unit.get(Session.class); expect(session.suspend()).andReturn(token); }) .run(unit -> { ws.onConnect(unit.get(Runnable.class)); ws.onWebSocketConnect(unit.get(Session.class)); ws.pause(); ws.pause(); ws.resume();; }); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void onWebSocketError() throws Exception { Throwable cause = new Throwable(); JettyWebSocket ws = new JettyWebSocket(); new MockUnit(Consumer.class) .expect(unit -> { Consumer callback = unit.get(Consumer.class); ws.onErrorMessage(callback); callback.accept(cause); }) .run(unit -> { ws.onWebSocketError(cause); }); } @Test public void successCallback() throws Exception { new MockUnit(Consumer.class, Logger.class, WebSocket.SuccessCallback.class, WebSocket.OnError.class) .expect(unit -> { SuccessCallback callback = unit.get(WebSocket.SuccessCallback.class); callback.invoke(); }) .run(unit -> { WriteCallback callback = JettyWebSocket.callback(unit.get(Logger.class), unit.get(WebSocket.SuccessCallback.class), unit.get(WebSocket.OnError.class)); callback.writeSuccess(); }); } @Test public void successCallbackErr() throws Exception { IllegalStateException cause = new IllegalStateException("intentional err"); new MockUnit(Consumer.class, Logger.class, WebSocket.SuccessCallback.class, WebSocket.OnError.class) .expect(unit -> { SuccessCallback callback = unit.get(WebSocket.SuccessCallback.class); callback.invoke(); expectLastCall().andThrow(cause); Logger logger = unit.get(Logger.class); logger.error("Error while invoking success callback", cause); }) .run(unit -> { WriteCallback callback = JettyWebSocket.callback(unit.get(Logger.class), unit.get(WebSocket.SuccessCallback.class), unit.get(WebSocket.OnError.class)); callback.writeSuccess(); }); } @Test public void errCallback() throws Exception { IllegalStateException cause = new IllegalStateException("intentional err"); new MockUnit(Consumer.class, Logger.class, WebSocket.SuccessCallback.class, WebSocket.OnError.class) .expect(unit -> { OnError callback = unit.get(WebSocket.OnError.class); callback.onError(cause); }) .run(unit -> { WriteCallback callback = JettyWebSocket.callback(unit.get(Logger.class), unit.get(WebSocket.SuccessCallback.class), unit.get(WebSocket.OnError.class)); callback.writeFailed(cause); }); } @Test public void errCallbackFailure() throws Exception { IllegalStateException cause = new IllegalStateException("intentional err"); new MockUnit(Consumer.class, Logger.class, WebSocket.SuccessCallback.class, WebSocket.OnError.class) .expect(unit -> { OnError callback = unit.get(WebSocket.OnError.class); callback.onError(cause); expectLastCall().andThrow(cause); Logger logger = unit.get(Logger.class); logger.error("Error while invoking err callback", cause); }) .run(unit -> { WriteCallback callback = JettyWebSocket.callback(unit.get(Logger.class), unit.get(WebSocket.SuccessCallback.class), unit.get(WebSocket.OnError.class)); callback.writeFailed(cause); }); } }