2323import org .apache .mina .core .filterchain .IoFilterChain ;
2424import org .apache .mina .core .session .IoSession ;
2525import org .apache .mina .filter .ssl .SslFilter ;
26- import org .junit .Assert ;
2726import org .junit .Test ;
2827import org .slf4j .Logger ;
2928import org .slf4j .LoggerFactory ;
29+ import quickfix .Acceptor ;
3030import quickfix .ApplicationAdapter ;
3131import quickfix .ConfigError ;
3232import quickfix .DefaultMessageFactory ;
3737import quickfix .MessageStoreFactory ;
3838import quickfix .RuntimeError ;
3939import quickfix .Session ;
40+ import quickfix .SessionFactory ;
4041import quickfix .SessionID ;
4142import quickfix .SessionSettings ;
4243import quickfix .ThreadedSocketAcceptor ;
@@ -618,6 +619,51 @@ public void shouldFailWhenUsingBadServerCertificate() throws Exception {
618619 }
619620 }
620621
622+ @ Test
623+ public void shouldConnectDifferentTypesOfSessions () throws Exception {
624+ int sslPort = AvailablePortFinder .getNextAvailable ();
625+ int nonSslPort = AvailablePortFinder .getNextAvailable ();
626+ TestAcceptor acceptor = new TestAcceptor (createMixedSessionAcceptorSettings (sslPort , nonSslPort , "single-session/server.keystore" ));
627+
628+ try {
629+ acceptor .start ();
630+
631+ TestInitiator sslInitiator = new TestInitiator (
632+ createInitiatorSettings ("single-session/client.keystore" , "single-session/client.truststore" ,
633+ CIPHER_SUITES_TLS , "TLSv1.2" , "ZULU_SSL" , "ALFA_SSL" , Integer .toString (sslPort ), "JKS" , "JKS" ));
634+
635+ TestInitiator nonSslInitiator = new TestInitiator (createInitiatorSettings ("ZULU_NON_SSL" , "ALFA_NON_SSL" , nonSslPort ));
636+
637+ try {
638+ sslInitiator .start ();
639+ nonSslInitiator .start ();
640+
641+ sslInitiator .assertNoSslExceptionThrown ();
642+ sslInitiator .assertLoggedOn (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ZULU_SSL" , "ALFA_SSL" ));
643+ sslInitiator .assertAuthenticated (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ZULU_SSL" , "ALFA_SSL" ),
644+ new BigInteger ("1448538842" ));
645+
646+ acceptor .assertNoSslExceptionThrown ();
647+ acceptor .assertLoggedOn (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ALFA_SSL" , "ZULU_SSL" ));
648+ acceptor .assertNotAuthenticated (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ALFA_SSL" , "ZULU_SSL" ));
649+
650+ nonSslInitiator .assertNoSslExceptionThrown ();
651+ nonSslInitiator .assertLoggedOn (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ZULU_NON_SSL" , "ALFA_NON_SSL" ));
652+ nonSslInitiator .assertNotAuthenticated (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ZULU_NON_SSL" , "ALFA_NON_SSL" ));
653+
654+ acceptor .assertNoSslExceptionThrown ();
655+ acceptor .assertLoggedOn (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ALFA_NON_SSL" , "ZULU_NON_SSL" ));
656+ acceptor .assertNotAuthenticated (new SessionID (FixVersions .BEGINSTRING_FIX44 , "ALFA_NON_SSL" , "ZULU_NON_SSL" ));
657+
658+ } finally {
659+ sslInitiator .stop ();
660+ nonSslInitiator .stop ();
661+ }
662+ } finally {
663+ acceptor .stop ();
664+ }
665+ }
666+
621667 static abstract class TestConnector {
622668 private static final Logger LOGGER = LoggerFactory .getLogger (TestConnector .class );
623669 private static final int TIMEOUT_SECONDS = 5 ;
@@ -810,24 +856,53 @@ public SessionConnector createConnector(SessionSettings sessionSettings) throws
810856 return new ThreadedSocketInitiator (new ApplicationAdapter (),
811857 messageStoreFactory , sessionSettings , messageFactory );
812858 }
859+ }
813860
861+ /**
862+ * Creates acceptor settings that contains two sessions. One with SSL support, one without.
863+ */
864+ private SessionSettings createMixedSessionAcceptorSettings (int sslPort , int nonSslPort , String keyStoreName ) {
865+ HashMap <Object , Object > defaults = new HashMap <>();
866+ defaults .put (SessionFactory .SETTING_CONNECTION_TYPE , "acceptor" );
867+ defaults .put (Session .SETTING_START_TIME , "00:00:00" );
868+ defaults .put (Session .SETTING_END_TIME , "00:00:00" );
869+ defaults .put (Session .SETTING_HEARTBTINT , "30" );
870+
871+ SessionSettings sessionSettings = new SessionSettings ();
872+ sessionSettings .set (defaults );
873+
874+ SessionID sslSession = new SessionID (FixVersions .BEGINSTRING_FIX44 , "ALFA_SSL" , "ZULU_SSL" );
875+ sessionSettings .setString (sslSession , "BeginString" , FixVersions .BEGINSTRING_FIX44 );
876+ sessionSettings .setString (sslSession , "DataDictionary" , "FIX44.xml" );
877+ sessionSettings .setString (sslSession , "TargetCompID" , "ZULU_SSL" );
878+ sessionSettings .setString (sslSession , "SenderCompID" , "ALFA_SSL" );
879+ sessionSettings .setString (sslSession , SSLSupport .SETTING_USE_SSL , "Y" );
880+ sessionSettings .setString (sslSession , SSLSupport .SETTING_KEY_STORE_NAME , keyStoreName );
881+ sessionSettings .setString (sslSession , SSLSupport .SETTING_KEY_STORE_PWD , "password" );
882+ sessionSettings .setString (sslSession , SSLSupport .SETTING_NEED_CLIENT_AUTH , "N" );
883+ sessionSettings .setString (sslSession , "SocketAcceptPort" , Integer .toString (sslPort ));
884+
885+ SessionID nonSslSession = new SessionID (FixVersions .BEGINSTRING_FIX44 , "ALFA_NON_SSL" , "ZULU_NON_SSL" );
886+ sessionSettings .setString (nonSslSession , "BeginString" , FixVersions .BEGINSTRING_FIX44 );
887+ sessionSettings .setString (nonSslSession , "DataDictionary" , "FIX44.xml" );
888+ sessionSettings .setString (nonSslSession , "TargetCompID" , "ZULU_NON_SSL" );
889+ sessionSettings .setString (nonSslSession , "SenderCompID" , "ALFA_NON_SSL" );
890+ sessionSettings .setString (nonSslSession , "SocketAcceptPort" , Integer .toString (nonSslPort ));
891+
892+ return sessionSettings ;
814893 }
815894
816895 private SessionSettings createMultiSessionAcceptorSettings (String keyStoreName , boolean needClientAuth ,
817896 String [] trustStoreNames , String cipherSuites , String protocols ) {
818897 HashMap <Object , Object > defaults = new HashMap <>();
819- defaults .put ("ConnectionType" , "acceptor" );
820- defaults .put ("SocketConnectProtocol" , ProtocolFactory .getTypeString (ProtocolFactory .SOCKET ));
898+ defaults .put (SessionFactory .SETTING_CONNECTION_TYPE , "acceptor" );
821899 defaults .put (SSLSupport .SETTING_USE_SSL , "Y" );
822900 defaults .put (SSLSupport .SETTING_KEY_STORE_NAME , keyStoreName );
823901 defaults .put (SSLSupport .SETTING_KEY_STORE_PWD , "password" );
824-
825902 defaults .put (SSLSupport .SETTING_NEED_CLIENT_AUTH , needClientAuth ? "Y" : "N" );
826- defaults .put ("SocketAcceptHost" , "localhost" );
827- defaults .put ("StartTime" , "00:00:00" );
828- defaults .put ("EndTime" , "00:00:00" );
829- defaults .put ("HeartBtInt" , "30" );
830- defaults .put ("ReconnectInterval" , "2" );
903+ defaults .put (Session .SETTING_START_TIME , "00:00:00" );
904+ defaults .put (Session .SETTING_END_TIME , "00:00:00" );
905+ defaults .put (Session .SETTING_HEARTBTINT , "30" );
831906
832907 if (cipherSuites != null ) {
833908 defaults .put (SSLSupport .SETTING_CIPHER_SUITES , cipherSuites );
@@ -857,8 +932,7 @@ private SessionSettings createMultiSessionAcceptorSettings(String keyStoreName,
857932 private SessionSettings createAcceptorSettings (String keyStoreName , boolean needClientAuth , String trustStoreName ,
858933 String cipherSuites , String protocols , String keyStoreType , String trustStoreType , int port ) {
859934 HashMap <Object , Object > defaults = new HashMap <>();
860- defaults .put ("ConnectionType" , "acceptor" );
861- defaults .put ("SocketConnectProtocol" , ProtocolFactory .getTypeString (ProtocolFactory .SOCKET ));
935+ defaults .put (SessionFactory .SETTING_CONNECTION_TYPE , "acceptor" );
862936 defaults .put (SSLSupport .SETTING_USE_SSL , "Y" );
863937 defaults .put (SSLSupport .SETTING_KEY_STORE_NAME , keyStoreName );
864938 defaults .put (SSLSupport .SETTING_KEY_STORE_PWD , "password" );
@@ -877,12 +951,10 @@ private SessionSettings createAcceptorSettings(String keyStoreName, boolean need
877951 }
878952
879953 defaults .put (SSLSupport .SETTING_NEED_CLIENT_AUTH , needClientAuth ? "Y" : "N" );
880- defaults .put ("SocketAcceptHost" , "localhost" );
881- defaults .put ("SocketAcceptPort" , Integer .toString (port ));
882- defaults .put ("StartTime" , "00:00:00" );
883- defaults .put ("EndTime" , "00:00:00" );
884- defaults .put ("HeartBtInt" , "30" );
885- defaults .put ("ReconnectInterval" , "2" );
954+ defaults .put (Acceptor .SETTING_SOCKET_ACCEPT_PORT , Integer .toString (port ));
955+ defaults .put (Session .SETTING_START_TIME , "00:00:00" );
956+ defaults .put (Session .SETTING_END_TIME , "00:00:00" );
957+ defaults .put (Session .SETTING_HEARTBTINT , "30" );
886958
887959 if (cipherSuites != null ) {
888960 defaults .put (SSLSupport .SETTING_CIPHER_SUITES , cipherSuites );
@@ -914,8 +986,8 @@ private SessionSettings createInitiatorSettings(String keyStoreName, String trus
914986 String protocols , String senderId , String targetId , String port , String keyStoreType ,
915987 String trustStoreType , String endpointIdentificationAlgorithm ) {
916988 HashMap <Object , Object > defaults = new HashMap <>();
917- defaults .put ("ConnectionType" , "initiator" );
918- defaults .put ("SocketConnectProtocol" , ProtocolFactory .getTypeString (ProtocolFactory .SOCKET ));
989+ defaults .put (SessionFactory . SETTING_CONNECTION_TYPE , "initiator" );
990+ defaults .put (Initiator . SETTING_SOCKET_CONNECT_PROTOCOL , ProtocolFactory .getTypeString (ProtocolFactory .SOCKET ));
919991 defaults .put (SSLSupport .SETTING_USE_SSL , "Y" );
920992 defaults .put (SSLSupport .SETTING_KEY_STORE_NAME , keyStoreName );
921993 defaults .put (SSLSupport .SETTING_KEY_STORE_PWD , "password" );
@@ -933,12 +1005,12 @@ private SessionSettings createInitiatorSettings(String keyStoreName, String trus
9331005 }
9341006 }
9351007
936- defaults .put ("SocketConnectHost" , "localhost" );
937- defaults .put ("SocketConnectPort" , port );
938- defaults .put ("StartTime" , "00:00:00 " );
939- defaults .put ("EndTime" , "00:00:00" );
940- defaults .put ("HeartBtInt" , "30 " );
941- defaults .put ("ReconnectInterval" , "2 " );
1008+ defaults .put (Initiator . SETTING_SOCKET_CONNECT_HOST , "localhost" );
1009+ defaults .put (Initiator . SETTING_SOCKET_CONNECT_PORT , port );
1010+ defaults .put (Initiator . SETTING_RECONNECT_INTERVAL , "2 " );
1011+ defaults .put (Session . SETTING_START_TIME , "00:00:00" );
1012+ defaults .put (Session . SETTING_END_TIME , "00:00:00 " );
1013+ defaults .put (Session . SETTING_HEARTBTINT , "30 " );
9421014
9431015 if (cipherSuites != null ) {
9441016 defaults .put (SSLSupport .SETTING_CIPHER_SUITES , cipherSuites );
@@ -963,4 +1035,27 @@ private SessionSettings createInitiatorSettings(String keyStoreName, String trus
9631035
9641036 return sessionSettings ;
9651037 }
1038+
1039+ private SessionSettings createInitiatorSettings (String senderId , String targetId , int port ) {
1040+ HashMap <Object , Object > defaults = new HashMap <>();
1041+ defaults .put (SessionFactory .SETTING_CONNECTION_TYPE , "initiator" );
1042+ defaults .put (Initiator .SETTING_SOCKET_CONNECT_PROTOCOL , ProtocolFactory .getTypeString (ProtocolFactory .SOCKET ));
1043+ defaults .put (Initiator .SETTING_SOCKET_CONNECT_HOST , "localhost" );
1044+ defaults .put (Initiator .SETTING_SOCKET_CONNECT_PORT , Integer .toString (port ));
1045+ defaults .put (Initiator .SETTING_RECONNECT_INTERVAL , "2" );
1046+ defaults .put (Session .SETTING_START_TIME , "00:00:00" );
1047+ defaults .put (Session .SETTING_END_TIME , "00:00:00" );
1048+ defaults .put (Session .SETTING_HEARTBTINT , "30" );
1049+
1050+ SessionID sessionID = new SessionID (FixVersions .BEGINSTRING_FIX44 , senderId , targetId );
1051+
1052+ SessionSettings sessionSettings = new SessionSettings ();
1053+ sessionSettings .set (defaults );
1054+ sessionSettings .setString (sessionID , "BeginString" , FixVersions .BEGINSTRING_FIX44 );
1055+ sessionSettings .setString (sessionID , "DataDictionary" , "FIX44.xml" );
1056+ sessionSettings .setString (sessionID , "SenderCompID" , senderId );
1057+ sessionSettings .setString (sessionID , "TargetCompID" , targetId );
1058+
1059+ return sessionSettings ;
1060+ }
9661061}
0 commit comments