@ -15,15 +15,22 @@
@@ -15,15 +15,22 @@
* /
package org.springframework.messaging.simp.stomp ;
import static org.junit.Assert.* ;
import static org.mockito.Mockito.* ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Collections ;
import java.util.List ;
import java.util.concurrent.Callable ;
import org.junit.Before ;
import org.junit.Test ;
import org.mockito.ArgumentCaptor ;
import org.springframework.messaging.Message ;
import org.springframework.messaging.MessageHandler ;
import org.springframework.messaging.MessageHeaders ;
import org.springframework.messaging.StubMessageChannel ;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor ;
import org.springframework.messaging.simp.SimpMessageType ;
@ -37,8 +44,6 @@ import org.springframework.messaging.tcp.TcpOperations;
@@ -37,8 +44,6 @@ import org.springframework.messaging.tcp.TcpOperations;
import org.springframework.util.concurrent.ListenableFuture ;
import org.springframework.util.concurrent.ListenableFutureTask ;
import static org.junit.Assert.* ;
/ * *
* Unit tests for StompBrokerRelayMessageHandler .
*
@ -74,62 +79,52 @@ public class StompBrokerRelayMessageHandlerTests {
@@ -74,62 +79,52 @@ public class StompBrokerRelayMessageHandlerTests {
@Test
public void testVirtualHostHeader ( ) throws Exception {
public void virtualHost ( ) throws Exception {
String virtualHost = "ABC" ;
this . brokerRelay . setVirtualHost ( virtualHost ) ;
this . brokerRelay . start ( ) ;
this . brokerRelay . setVirtualHost ( "ABC" ) ;
String sessionId = "sess1" ;
StompHeaderAccessor headers = StompHeaderAccessor . create ( StompCommand . CONNECT ) ;
headers . setSessionId ( sessionId ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
this . brokerRelay . start ( ) ;
this . brokerRelay . handleMessage ( connectMessage ( "sess1" , "joe" ) ) ;
List < Message < byte [ ] > > sent = this . tcpClient . connection . messages ;
assertEquals ( 2 , sent . size ( ) ) ;
assertEquals ( 2 , this . tcpClient . getSentMessages ( ) . size ( ) ) ;
StompHeaderAccessor headers1 = StompHeaderAccessor . wrap ( s ent. get ( 0 ) ) ;
assertEquals ( virtualHost , headers1 . getHost ( ) ) ;
assertNotNull ( "The prepared message does not have an accessor" ,
MessageHeaderAccessor . getAccessor ( sent . get ( 0 ) , MessageHeaderAccessor . class ) ) ;
StompHeaderAccessor headers1 = this . tcpCli ent. getSentHeaders ( 0 ) ;
assertEquals ( StompCommand . CONNECT , headers1 . getCommand ( ) ) ;
assertEquals ( StompBrokerRelayMessageHandler . SYSTEM_SESSION_ID , headers1 . getSessionId ( ) ) ;
assertEquals ( "ABC" , headers1 . getHost ( ) ) ;
StompHeaderAccessor headers2 = StompHeaderAccessor . wrap ( sent . get ( 1 ) ) ;
assertEquals ( sessionId , headers2 . getSessionId ( ) ) ;
assertEquals ( virtualHost , headers2 . getHost ( ) ) ;
assertNotNull ( "The prepared message does not have an accessor" ,
MessageHeaderAccessor . getAccessor ( sent . get ( 1 ) , MessageHeaderAccessor . class ) ) ;
StompHeaderAccessor headers2 = this . tcpClient . getSentHeaders ( 1 ) ;
assertEquals ( StompCommand . CONNECT , headers2 . getCommand ( ) ) ;
assertEquals ( "sess1" , headers2 . getSessionId ( ) ) ;
assertEquals ( "ABC" , headers2 . getHost ( ) ) ;
}
@Test
public void testLoginPasscode ( ) throws Exception {
this . brokerRelay . setClientLogin ( "clientlogin" ) ;
this . brokerRelay . setClientPasscode ( "clientpasscode" ) ;
public void loginAndPasscode ( ) throws Exception {
this . brokerRelay . setSystemLogin ( "syslogin" ) ;
this . brokerRelay . setSystemPasscode ( "syspasscode" ) ;
this . brokerRelay . setClientLogin ( "clientlogin" ) ;
this . brokerRelay . setClientPasscode ( "clientpasscode" ) ;
this . brokerRelay . start ( ) ;
this . brokerRelay . handleMessage ( connectMessage ( "sess1" , "joe" ) ) ;
String sessionId = "sess1" ;
StompHeaderAccessor headers = StompHeaderAccessor . create ( StompCommand . CONNECT ) ;
headers . setSessionId ( sessionId ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
List < Message < byte [ ] > > sent = this . tcpClient . connection . messages ;
assertEquals ( 2 , sent . size ( ) ) ;
assertEquals ( 2 , this . tcpClient . getSentMessages ( ) . size ( ) ) ;
StompHeaderAccessor headers1 = StompHeaderAccessor . wrap ( sent . get ( 0 ) ) ;
StompHeaderAccessor headers1 = this . tcpClient . getSentHeaders ( 0 ) ;
assertEquals ( StompCommand . CONNECT , headers1 . getCommand ( ) ) ;
assertEquals ( "syslogin" , headers1 . getLogin ( ) ) ;
assertEquals ( "syspasscode" , headers1 . getPasscode ( ) ) ;
StompHeaderAccessor headers2 = StompHeaderAccessor . wrap ( sent . get ( 1 ) ) ;
StompHeaderAccessor headers2 = this . tcpClient . getSentHeaders ( 1 ) ;
assertEquals ( StompCommand . CONNECT , headers2 . getCommand ( ) ) ;
assertEquals ( "clientlogin" , headers2 . getLogin ( ) ) ;
assertEquals ( "clientpasscode" , headers2 . getPasscode ( ) ) ;
}
@Test
public void testD estinationExcluded( ) throws Exception {
public void d estinationExcluded( ) throws Exception {
this . brokerRelay . start ( ) ;
@ -138,89 +133,113 @@ public class StompBrokerRelayMessageHandlerTests {
@@ -138,89 +133,113 @@ public class StompBrokerRelayMessageHandlerTests {
headers . setDestination ( "/user/daisy/foo" ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
List < Message < byte [ ] > > sent = this . tcpClient . connection . messages ;
assertEquals ( 1 , sent . size ( ) ) ;
assertEquals ( StompCommand . CONNECT , StompHeaderAccessor . wrap ( sent . get ( 0 ) ) . getCommand ( ) ) ;
assertNotNull ( "The prepared message does not have an accessor" ,
MessageHeaderAccessor . getAccessor ( sent . get ( 0 ) , MessageHeaderAccessor . class ) ) ;
assertEquals ( 1 , this . tcpClient . getSentMessages ( ) . size ( ) ) ;
StompHeaderAccessor headers1 = this . tcpClient . getSentHeaders ( 0 ) ;
assertEquals ( StompCommand . CONNECT , headers1 . getCommand ( ) ) ;
assertEquals ( StompBrokerRelayMessageHandler . SYSTEM_SESSION_ID , headers1 . getSessionId ( ) ) ;
}
@Test
public void testOutboundMessage IsEnriched( ) throws Exception {
public void messageFromBroker IsEnriched( ) throws Exception {
this . brokerRelay . start ( ) ;
this . brokerRelay . handleMessage ( connectMessage ( "sess1" , "joe" ) ) ;
String sessionId = "sess1" ;
StompHeaderAccessor headers = StompHeaderAccessor . create ( StompCommand . CONNECT ) ;
headers . setSessionId ( sessionId ) ;
headers . setUser ( new TestPrincipal ( "joe" ) ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
List < Message < byte [ ] > > sent = this . tcpClient . connection . messages ;
assertEquals ( 2 , sent . size ( ) ) ;
assertEquals ( 2 , this . tcpClient . getSentMessages ( ) . size ( ) ) ;
assertEquals ( StompCommand . CONNECT , this . tcpClient . getSentHeaders ( 0 ) . getCommand ( ) ) ;
assertEquals ( StompCommand . CONNECT , this . tcpClient . getSentHeaders ( 1 ) . getCommand ( ) ) ;
StompHeaderAccessor responseHeaders = StompHeaderAccessor . create ( StompCommand . MESSAGE ) ;
responseHeaders . setLeaveMutable ( true ) ;
Message < byte [ ] > response = MessageBuilder . createMessage ( new byte [ 0 ] , responseHeaders . getMessageHeaders ( ) ) ;
this . tcpClient . connectionHandler . handleMessage ( response ) ;
this . tcpClient . handleMessage ( message ( StompCommand . MESSAGE , null , null , null ) ) ;
Message < byte [ ] > actual = this . outboundChannel . getMessages ( ) . get ( 0 ) ;
StompHeaderAccessor actualHeaders = StompHeaderAccessor . getAccessor ( actual , StompHeaderAccessor . class ) ;
assertEquals ( sessionId , actualHeaders . getSessionId ( ) ) ;
assertEquals ( "joe" , actualHeaders . getUser ( ) . getName ( ) ) ;
Message < byte [ ] > message = this . outboundChannel . getMessages ( ) . get ( 0 ) ;
StompHeaderAccessor accessor = StompHeaderAccessor . getAccessor ( message , StompHeaderAccessor . class ) ;
assertEquals ( "sess1" , accessor . getSessionId ( ) ) ;
assertEquals ( "joe" , accessor . getUser ( ) . getName ( ) ) ;
}
// SPR-12820
@Test
public void testC onnectWhenBrokerNotAvailable( ) throws Exception {
public void c onnectWhenBrokerNotAvailable( ) throws Exception {
this . brokerRelay . start ( ) ;
this . brokerRelay . stopInternal ( ) ;
this . brokerRelay . handleMessage ( connectMessage ( "sess1" , "joe" ) ) ;
Message < byte [ ] > message = this . outboundChannel . getMessages ( ) . get ( 0 ) ;
StompHeaderAccessor accessor = StompHeaderAccessor . getAccessor ( message , StompHeaderAccessor . class ) ;
assertEquals ( StompCommand . ERROR , accessor . getCommand ( ) ) ;
assertEquals ( "sess1" , accessor . getSessionId ( ) ) ;
assertEquals ( "joe" , accessor . getUser ( ) . getName ( ) ) ;
assertEquals ( "Broker not available." , accessor . getMessage ( ) ) ;
}
String sessionId = "sess1" ;
StompHeaderAccessor headers = StompHeaderAccessor . create ( StompCommand . CONNECT ) ;
headers . setSessionId ( sessionId ) ;
headers . setUser ( new TestPrincipal ( "joe" ) ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
@Test
public void sendAfterBrokerUnavailable ( ) throws Exception {
this . brokerRelay . start ( ) ;
assertEquals ( 1 , this . brokerRelay . getConnectionCount ( ) ) ;
Message < byte [ ] > actual = this . outboundChannel . getMessages ( ) . get ( 0 ) ;
StompHeaderAccessor actualHeaders = StompHeaderAccessor . getAccessor ( actual , StompHeaderAccessor . class ) ;
assertEquals ( StompCommand . ERROR , actualHeaders . getCommand ( ) ) ;
assertEquals ( sessionId , actualHeaders . getSessionId ( ) ) ;
assertEquals ( "joe" , actualHeaders . getUser ( ) . getName ( ) ) ;
assertEquals ( "Broker not available." , actualHeaders . getMessage ( ) ) ;
this . brokerRelay . handleMessage ( connectMessage ( "sess1" , "joe" ) ) ;
assertEquals ( 2 , this . brokerRelay . getConnectionCount ( ) ) ;
this . brokerRelay . stopInternal ( ) ;
this . brokerRelay . handleMessage ( message ( StompCommand . SEND , "sess1" , "joe" , "/foo" ) ) ;
assertEquals ( 1 , this . brokerRelay . getConnectionCount ( ) ) ;
Message < byte [ ] > message = this . outboundChannel . getMessages ( ) . get ( 0 ) ;
StompHeaderAccessor accessor = StompHeaderAccessor . getAccessor ( message , StompHeaderAccessor . class ) ;
assertEquals ( StompCommand . ERROR , accessor . getCommand ( ) ) ;
assertEquals ( "sess1" , accessor . getSessionId ( ) ) ;
assertEquals ( "joe" , accessor . getUser ( ) . getName ( ) ) ;
assertEquals ( "Broker not available." , accessor . getMessage ( ) ) ;
}
@Test
public void testSendAfterBrokerUnavailable ( ) throws Exception {
public void systemSubscription ( ) throws Exception {
MessageHandler handler = mock ( MessageHandler . class ) ;
this . brokerRelay . setSystemSubscriptions ( Collections . singletonMap ( "/topic/foo" , handler ) ) ;
this . brokerRelay . start ( ) ;
String sessionId = "sess1" ;
StompHeaderAccessor headers = StompHeaderAccessor . create ( StompCommand . CONNECT ) ;
headers . setSessionId ( sessionId ) ;
headers . setUser ( new TestPrincipal ( "joe" ) ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
StompHeaderAccessor accessor = StompHeaderAccessor . create ( StompCommand . CONNECTED ) ;
accessor . setLeaveMutable ( true ) ;
MessageHeaders headers = accessor . getMessageHeaders ( ) ;
this . tcpClient . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers ) ) ;
assertEquals ( 2 , this . brokerRelay . getConnectionCount ( ) ) ;
assertEquals ( 2 , this . tcpClient . getSentMessages ( ) . size ( ) ) ;
assertEquals ( StompCommand . CONNECT , this . tcpClient . getSentHeaders ( 0 ) . getCommand ( ) ) ;
assertEquals ( StompCommand . SUBSCRIBE , this . tcpClient . getSentHeaders ( 1 ) . getCommand ( ) ) ;
assertEquals ( "/topic/foo" , this . tcpClient . getSentHeaders ( 1 ) . getDestination ( ) ) ;
this . brokerRelay . stopInternal ( ) ;
Message < byte [ ] > message = message ( StompCommand . MESSAGE , null , null , "/topic/foo" ) ;
this . tcpClient . handleMessage ( message ) ;
headers = StompHeaderAccessor . create ( StompCommand . SEND ) ;
headers . setSessionId ( sessionId ) ;
headers . setUser ( new TestPrincipal ( "joe" ) ) ;
headers . setDestination ( "/foo" ) ;
this . brokerRelay . handleMessage ( MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ) ;
ArgumentCaptor < Message > captor = ArgumentCaptor . forClass ( Message . class ) ;
verify ( handler ) . handleMessage ( captor . capture ( ) ) ;
assertSame ( message , captor . getValue ( ) ) ;
}
assertEquals ( 1 , this . brokerRelay . getConnectionCount ( ) ) ;
private Message < byte [ ] > connectMessage ( String sessionId , String user ) {
StompHeaderAccessor headers = StompHeaderAccessor . create ( StompCommand . CONNECT ) ;
headers . setSessionId ( sessionId ) ;
headers . setUser ( new TestPrincipal ( user ) ) ;
return MessageBuilder . createMessage ( new byte [ 0 ] , headers . getMessageHeaders ( ) ) ;
}
Message < byte [ ] > actual = this . outboundChannel . getMessages ( ) . get ( 0 ) ;
StompHeaderAccessor actualHeaders = StompHeaderAccessor . getAccessor ( actual , StompHeaderAccessor . class ) ;
assertEquals ( StompCommand . ERROR , actualHeaders . getCommand ( ) ) ;
assertEquals ( sessionId , actualHeaders . getSessionId ( ) ) ;
assertEquals ( "joe" , actualHeaders . getUser ( ) . getName ( ) ) ;
assertEquals ( "Broker not available." , actualHeaders . getMessage ( ) ) ;
private Message < byte [ ] > message ( StompCommand command , String sessionId , String user , String destination ) {
StompHeaderAccessor accessor = StompHeaderAccessor . create ( command ) ;
if ( sessionId ! = null ) {
accessor . setSessionId ( sessionId ) ;
}
if ( user ! = null ) {
accessor . setUser ( new TestPrincipal ( user ) ) ;
}
if ( destination ! = null ) {
accessor . setDestination ( destination ) ;
}
accessor . setLeaveMutable ( true ) ;
return MessageBuilder . createMessage ( new byte [ 0 ] , accessor . getMessageHeaders ( ) ) ;
}
@ -254,17 +273,29 @@ public class StompBrokerRelayMessageHandlerTests {
@@ -254,17 +273,29 @@ public class StompBrokerRelayMessageHandlerTests {
private TcpConnectionHandler < byte [ ] > connectionHandler ;
public List < Message < byte [ ] > > getSentMessages ( ) {
return this . connection . getMessages ( ) ;
}
public StompHeaderAccessor getSentHeaders ( int index ) {
assertTrue ( "Size: " + getSentMessages ( ) . size ( ) , getSentMessages ( ) . size ( ) > index ) ;
Message < byte [ ] > message = getSentMessages ( ) . get ( index ) ;
StompHeaderAccessor accessor = MessageHeaderAccessor . getAccessor ( message , StompHeaderAccessor . class ) ;
assertNotNull ( accessor ) ;
return accessor ;
}
@Override
public ListenableFuture < Void > connect ( TcpConnectionHandler < byte [ ] > connectionHandler ) {
this . connectionHandler = connectionHandler ;
connectionHandler . afterConnected ( this . connection ) ;
public ListenableFuture < Void > connect ( TcpConnectionHandler < byte [ ] > h andler) {
this . connectionHandler = h andler;
h andler. afterConnected ( this . connection ) ;
return getVoidFuture ( ) ;
}
@Override
public ListenableFuture < Void > connect ( TcpConnectionHandler < byte [ ] > connectionHandler , ReconnectStrategy reconnectStrategy ) {
this . connectionHandler = connectionHandler ;
connectionHandler . afterConnected ( this . connection ) ;
public ListenableFuture < Void > connect ( TcpConnectionHandler < byte [ ] > handler , ReconnectStrategy s trategy) {
this . connectionHandler = h andler;
h andler. afterConnected ( this . connection ) ;
return getVoidFuture ( ) ;
}
@ -272,6 +303,11 @@ public class StompBrokerRelayMessageHandlerTests {
@@ -272,6 +303,11 @@ public class StompBrokerRelayMessageHandlerTests {
public ListenableFuture < Boolean > shutdown ( ) {
return getBooleanFuture ( ) ;
}
public void handleMessage ( Message < byte [ ] > message ) {
this . connectionHandler . handleMessage ( message ) ;
}
}
@ -280,6 +316,10 @@ public class StompBrokerRelayMessageHandlerTests {
@@ -280,6 +316,10 @@ public class StompBrokerRelayMessageHandlerTests {
private final List < Message < byte [ ] > > messages = new ArrayList < > ( ) ;
public List < Message < byte [ ] > > getMessages ( ) {
return this . messages ;
}
@Override
public ListenableFuture < Void > send ( Message < byte [ ] > message ) {
this . messages . add ( message ) ;