this.version = headers.getFirst("version"); this.sessionFuture.set(this); this.sessionHandler.afterConnected(this, headers); this.sessionHandler.handleException(this, command, headers, message.getPayload(), ex);
@Override public void handleFailure(Throwable ex) { try { this.sessionFuture.setException(ex); // no-op if already set this.sessionHandler.handleTransportError(this, ex); } catch (Throwable ex2) { if (logger.isDebugEnabled()) { logger.debug("Uncaught failure while handling transport failure", ex2); } } }
@Test public void handleErrorFrame() { StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.ERROR); accessor.setContentType(new MimeType("text", "plain", StandardCharsets.UTF_8)); accessor.addNativeHeader("foo", "bar"); accessor.setLeaveMutable(true); String payload = "Oops"; StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); when(this.sessionHandler.getPayloadType(stompHeaders)).thenReturn(String.class); this.session.handleMessage(MessageBuilder.createMessage( payload.getBytes(StandardCharsets.UTF_8), accessor.getMessageHeaders())); verify(this.sessionHandler).getPayloadType(stompHeaders); verify(this.sessionHandler).handleFrame(stompHeaders, payload); verifyNoMoreInteractions(this.sessionHandler); }
@Test public void handleErrorFrameWithConversionException() { StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.ERROR); accessor.setContentType(MimeTypeUtils.APPLICATION_JSON); accessor.addNativeHeader("foo", "bar"); accessor.setLeaveMutable(true); byte[] payload = "{'foo':'bar'}".getBytes(StandardCharsets.UTF_8); StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); when(this.sessionHandler.getPayloadType(stompHeaders)).thenReturn(Map.class); this.session.handleMessage(MessageBuilder.createMessage(payload, accessor.getMessageHeaders())); verify(this.sessionHandler).getPayloadType(stompHeaders); verify(this.sessionHandler).handleException(same(this.session), same(StompCommand.ERROR), eq(stompHeaders), same(payload), any(MessageConversionException.class)); verifyNoMoreInteractions(this.sessionHandler); }
@Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) { synchronized (this.delegates) { this.session = session; for (StompSessionHandler delegate : this.delegates) { delegate.afterConnected(session, connectedHeaders); } } }
@Test public void handleMessageFrameWithConversionException() { this.session.afterConnected(this.connection); assertTrue(this.session.isConnected()); StompFrameHandler frameHandler = mock(StompFrameHandler.class); String destination = "/topic/foo"; Subscription subscription = this.session.subscribe(destination, frameHandler); StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.MESSAGE); accessor.setDestination(destination); accessor.setSubscriptionId(subscription.getSubscriptionId()); accessor.setContentType(MimeTypeUtils.APPLICATION_JSON); accessor.setMessageId("1"); accessor.setLeaveMutable(true); byte[] payload = "{'foo':'bar'}".getBytes(StandardCharsets.UTF_8); StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); when(frameHandler.getPayloadType(stompHeaders)).thenReturn(Map.class); this.session.handleMessage(MessageBuilder.createMessage(payload, accessor.getMessageHeaders())); verify(frameHandler).getPayloadType(stompHeaders); verifyNoMoreInteractions(frameHandler); verify(this.sessionHandler).handleException(same(this.session), same(StompCommand.MESSAGE), eq(stompHeaders), same(payload), any(MessageConversionException.class)); verifyNoMoreInteractions(this.sessionHandler); }
@Test public void handleErrorFrameWithEmptyPayload() { StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.ERROR); accessor.addNativeHeader("foo", "bar"); accessor.setLeaveMutable(true); this.session.handleMessage(MessageBuilder.createMessage(new byte[0], accessor.getMessageHeaders())); StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); verify(this.sessionHandler).handleFrame(stompHeaders, null); verifyNoMoreInteractions(this.sessionHandler); }
@Test public void handleConnectedFrame() { this.session.afterConnected(this.connection); assertTrue(this.session.isConnected()); this.connectHeaders.setHeartbeat(new long[] {10000, 10000}); StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.CONNECTED); accessor.setVersion("1.2"); accessor.setHeartbeat(10000, 10000); accessor.setLeaveMutable(true); this.session.handleMessage(MessageBuilder.createMessage(new byte[0], accessor.getMessageHeaders())); StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); verify(this.sessionHandler).afterConnected(this.session, stompHeaders); verifyNoMoreInteractions(this.sessionHandler); }
@Override public void handleException(StompSession session, @Nullable StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) { synchronized (this.delegates) { for (StompSessionHandler delegate : this.delegates) { delegate.handleException(session, command, headers, payload, exception); } } }
@Override public void handleFrame(StompHeaders headers, Object payload) { synchronized (this.delegates) { for (StompSessionHandler delegate : this.delegates) { delegate.handleFrame(headers, payload); } } }
this.version = headers.getFirst("version"); this.sessionFuture.set(this); this.sessionHandler.afterConnected(this, headers); this.sessionHandler.handleException(this, command, headers, message.getPayload(), ex);
@Override public void afterConnectFailure(Throwable ex) { if (logger.isDebugEnabled()) { logger.debug("Failed to connect session id=" + this.sessionId, ex); } this.sessionFuture.setException(ex); this.sessionHandler.handleTransportError(this, ex); }
void addHandler(StompSessionHandler delegate) { synchronized (this.delegates) { if (this.session != null) { delegate.afterConnected(this.session, getConnectHeaders()); } this.delegates.add(delegate); } }
this.version = headers.getFirst("version"); this.sessionFuture.set(this); this.sessionHandler.afterConnected(this, headers); this.sessionHandler.handleException(this, command, headers, message.getPayload(), ex);
@Test public void handleFailure() { IllegalStateException exception = new IllegalStateException("simulated exception"); this.session.handleFailure(exception); verify(this.sessionHandler).handleTransportError(this.session, exception); verifyNoMoreInteractions(this.sessionHandler); }
@Override protected ListenableFuture<StompSession> doConnect(StompSessionHandler handler) { if (!this.thrown.getAndSet(true)) { throw new RuntimeException("intentional"); } else { SettableListenableFuture<StompSession> future = new SettableListenableFuture<StompSession>(); StompSession stompSession = mock(StompSession.class); future.set(stompSession); handler.afterConnected(stompSession, getConnectHeaders()); return future; } }
this.version = headers.getFirst("version"); this.sessionFuture.set(this); this.sessionHandler.afterConnected(this, headers); this.sessionHandler.handleException(this, command, headers, message.getPayload(), ex);
@Test public void afterConnectFailure() { IllegalStateException exception = new IllegalStateException("simulated exception"); this.session.afterConnectFailure(exception); verify(this.sessionHandler).handleTransportError(this.session, exception); verifyNoMoreInteractions(this.sessionHandler); }
@Test public void afterConnectionClosed() { this.session.afterConnectionClosed(); verify(this.sessionHandler).handleTransportError(same(this.session), any(ConnectionLostException.class)); verifyNoMoreInteractions(this.sessionHandler); }
@Test public void heartbeatTasks() { this.session.afterConnected(this.connection); verify(this.connection).send(any()); this.connectHeaders.setHeartbeat(new long[] {10000, 10000}); StompHeaderAccessor connected = StompHeaderAccessor.create(StompCommand.CONNECTED); connected.setVersion("1.2"); connected.setHeartbeat(10000, 10000); connected.setLeaveMutable(true); this.session.handleMessage(MessageBuilder.createMessage(new byte[0], connected.getMessageHeaders())); ArgumentCaptor<Runnable> writeTaskCaptor = ArgumentCaptor.forClass(Runnable.class); ArgumentCaptor<Runnable> readTaskCaptor = ArgumentCaptor.forClass(Runnable.class); verify(this.connection).onWriteInactivity(writeTaskCaptor.capture(), any(Long.class)); verify(this.connection).onReadInactivity(readTaskCaptor.capture(), any(Long.class)); Runnable writeTask = writeTaskCaptor.getValue(); Runnable readTask = readTaskCaptor.getValue(); assertNotNull(writeTask); assertNotNull(readTask); writeTask.run(); StompHeaderAccessor accessor = StompHeaderAccessor.createForHeartbeat(); Message<byte[]> message = MessageBuilder.createMessage(new byte[] {'\n'}, accessor.getMessageHeaders()); verify(this.connection).send(eq(message)); verifyNoMoreInteractions(this.connection); reset(this.sessionHandler); readTask.run(); verify(this.sessionHandler).handleTransportError(same(this.session), any(IllegalStateException.class)); verifyNoMoreInteractions(this.sessionHandler); }