@Test public void handleMessageFromClientWithInvalidStompCommand() { TextMessage textMessage = new TextMessage("FOO\n\n\0"); this.protocolHandler.afterSessionStarted(this.session, this.channel); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); verifyZeroInteractions(this.channel); assertEquals(1, this.session.getSentMessages().size()); TextMessage actual = (TextMessage) this.session.getSentMessages().get(0); assertTrue(actual.getPayload().startsWith("ERROR")); }
@Test public void handleMessageFromClientWithoutImmutableMessageInterceptor() { AtomicReference<Boolean> mutable = new AtomicReference<>(); ExecutorSubscribableChannel channel = new ExecutorSubscribableChannel(); channel.addInterceptor(new ChannelInterceptor() { @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { mutable.set(MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class).isMutable()); return message; } }); StompSubProtocolHandler handler = new StompSubProtocolHandler(); handler.afterSessionStarted(this.session, channel); TextMessage message = StompTextMessageBuilder.create(StompCommand.CONNECT).build(); handler.handleMessageFromClient(this.session, message, channel); assertNotNull(mutable.get()); assertFalse(mutable.get()); }
@Test public void handleMessageFromClientWithImmutableMessageInterceptor() { AtomicReference<Boolean> mutable = new AtomicReference<>(); ExecutorSubscribableChannel channel = new ExecutorSubscribableChannel(); channel.addInterceptor(new ChannelInterceptor() { @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { mutable.set(MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class).isMutable()); return message; } }); channel.addInterceptor(new ImmutableMessageChannelInterceptor()); StompSubProtocolHandler handler = new StompSubProtocolHandler(); handler.afterSessionStarted(this.session, channel); TextMessage message = StompTextMessageBuilder.create(StompCommand.CONNECT).build(); handler.handleMessageFromClient(this.session, message, channel); assertNotNull(mutable.get()); assertTrue(mutable.get()); }
@Test public void handleMessageFromClient() { TextMessage textMessage = StompTextMessageBuilder.create(StompCommand.CONNECT).headers( "login:guest", "passcode:guest", "accept-version:1.1,1.0", "heart-beat:10000,10000").build(); this.protocolHandler.afterSessionStarted(this.session, this.channel); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); verify(this.channel).send(this.messageCaptor.capture()); Message<?> actual = this.messageCaptor.getValue(); assertNotNull(actual); assertEquals("s1", SimpMessageHeaderAccessor.getSessionId(actual.getHeaders())); assertNotNull(SimpMessageHeaderAccessor.getSessionAttributes(actual.getHeaders())); assertNotNull(SimpMessageHeaderAccessor.getUser(actual.getHeaders())); assertEquals("joe", SimpMessageHeaderAccessor.getUser(actual.getHeaders()).getName()); assertNotNull(SimpMessageHeaderAccessor.getHeartbeat(actual.getHeaders())); assertArrayEquals(new long[] {10000, 10000}, SimpMessageHeaderAccessor.getHeartbeat(actual.getHeaders())); StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(actual); assertEquals(StompCommand.CONNECT, stompAccessor.getCommand()); assertEquals("guest", stompAccessor.getLogin()); assertEquals("guest", stompAccessor.getPasscode()); assertArrayEquals(new long[] {10000, 10000}, stompAccessor.getHeartbeat()); assertEquals(new HashSet<>(Arrays.asList("1.1","1.0")), stompAccessor.getAcceptVersion()); assertEquals(0, this.session.getSentMessages().size()); }
@Test public void eventPublicationWithExceptions() { ApplicationEventPublisher publisher = mock(ApplicationEventPublisher.class); this.protocolHandler.setApplicationEventPublisher(publisher); this.protocolHandler.afterSessionStarted(this.session, this.channel); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT); Message<byte[]> message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); TextMessage textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); verify(this.channel).send(this.messageCaptor.capture()); Message<?> actual = this.messageCaptor.getValue(); assertNotNull(actual); assertEquals(StompCommand.CONNECT, StompHeaderAccessor.wrap(actual).getCommand()); reset(this.channel); headers = StompHeaderAccessor.create(StompCommand.CONNECTED); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); this.protocolHandler.handleMessageToClient(this.session, message); assertEquals(1, this.session.getSentMessages().size()); textMessage = (TextMessage) this.session.getSentMessages().get(0); assertEquals("CONNECTED\n" + "user-name:joe\n" + "\n" + "\u0000", textMessage.getPayload()); this.protocolHandler.afterSessionEnded(this.session, CloseStatus.BAD_DATA, this.channel); verify(this.channel).send(this.messageCaptor.capture()); actual = this.messageCaptor.getValue(); assertNotNull(actual); StompHeaderAccessor accessor = StompHeaderAccessor.wrap(actual); assertEquals(StompCommand.DISCONNECT, accessor.getCommand()); assertEquals("s1", accessor.getSessionId()); assertEquals("joe", accessor.getUser().getName()); }
@Test public void webSocketScope() { Runnable runnable = Mockito.mock(Runnable.class); SimpAttributes simpAttributes = new SimpAttributes(this.session.getId(), this.session.getAttributes()); simpAttributes.setAttribute("name", "value"); simpAttributes.registerDestructionCallback("name", runnable); MessageChannel testChannel = new MessageChannel() { @Override public boolean send(Message<?> message) { SimpAttributes simpAttributes = SimpAttributesContextHolder.currentAttributes(); assertThat(simpAttributes.getAttribute("name"), is("value")); return true; } @Override public boolean send(Message<?> message, long timeout) { return false; } }; this.protocolHandler.afterSessionStarted(this.session, this.channel); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT); Message<byte[]> message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); TextMessage textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, testChannel); assertEquals(Collections.<WebSocketMessage<?>>emptyList(), session.getSentMessages()); this.protocolHandler.afterSessionEnded(this.session, CloseStatus.BAD_DATA, testChannel); assertEquals(Collections.<WebSocketMessage<?>>emptyList(), this.session.getSentMessages()); verify(runnable, times(1)).run(); }
@Test // SPR-14690 public void handleMessageFromClientWithTokenAuthentication() { ExecutorSubscribableChannel channel = new ExecutorSubscribableChannel(); channel.addInterceptor(new AuthenticationInterceptor("__pete__@gmail.com")); channel.addInterceptor(new ImmutableMessageChannelInterceptor()); TestMessageHandler messageHandler = new TestMessageHandler(); channel.subscribe(messageHandler); StompSubProtocolHandler handler = new StompSubProtocolHandler(); handler.afterSessionStarted(this.session, channel); TextMessage wsMessage = StompTextMessageBuilder.create(StompCommand.CONNECT).build(); handler.handleMessageFromClient(this.session, wsMessage, channel); assertEquals(1, messageHandler.getMessages().size()); Message<?> message = messageHandler.getMessages().get(0); Principal user = SimpMessageHeaderAccessor.getUser(message.getHeaders()); assertNotNull(user); assertEquals("__pete__@gmail.com", user.getName()); }
@Test public void eventPublication() { TestPublisher publisher = new TestPublisher(); this.protocolHandler.setApplicationEventPublisher(publisher); this.protocolHandler.afterSessionStarted(this.session, this.channel); StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT); Message<byte[]> message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); TextMessage textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); headers = StompHeaderAccessor.create(StompCommand.CONNECTED); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); this.protocolHandler.handleMessageToClient(this.session, message); headers = StompHeaderAccessor.create(StompCommand.SUBSCRIBE); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); headers = StompHeaderAccessor.create(StompCommand.UNSUBSCRIBE); message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders()); textMessage = new TextMessage(new StompEncoder().encode(message)); this.protocolHandler.handleMessageFromClient(this.session, textMessage, this.channel); this.protocolHandler.afterSessionEnded(this.session, CloseStatus.BAD_DATA, this.channel); assertEquals("Unexpected events " + publisher.events, 5, publisher.events.size()); assertEquals(SessionConnectEvent.class, publisher.events.get(0).getClass()); assertEquals(SessionConnectedEvent.class, publisher.events.get(1).getClass()); assertEquals(SessionSubscribeEvent.class, publisher.events.get(2).getClass()); assertEquals(SessionUnsubscribeEvent.class, publisher.events.get(3).getClass()); assertEquals(SessionDisconnectEvent.class, publisher.events.get(4).getClass()); }