// Copyright (c) quickfixengine.org All rights reserved. // // This file may be distributed under the terms of the quickfixengine.org // license as defined by quickfixengine.org and appearing in the file // LICENSE included in the packaging of this file. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING // THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE. // // See http://www.quickfixengine.org/LICENSE for licensing information. // // Contact ask@quickfixengine.org if any conditions of this licensing // are not clear to you. package quickfix import ( "testing" "time" "github.com/stretchr/testify/suite" "quantex.com/qfixdpl/quickfix/config" "quantex.com/qfixdpl/quickfix/internal" ) type SessionFactorySuite struct { suite.Suite sessionFactory SessionID MessageStoreFactory *SessionSettings LogFactory App *MockApp } func TestSessionFactorySuite(t *testing.T) { suite.Run(t, new(SessionFactorySuite)) } func (s *SessionFactorySuite) SetupTest() { s.sessionFactory = sessionFactory{} s.SessionID = SessionID{BeginString: "FIX.4.2", TargetCompID: "TW", SenderCompID: "ISLD"} s.MessageStoreFactory = NewMemoryStoreFactory() s.SessionSettings = NewSessionSettings() s.LogFactory = nullLogFactory{} s.App = new(MockApp) } func (s *SessionFactorySuite) TestDefaults() { session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.False(session.ResetOnLogon) s.False(session.RefreshOnLogon) s.False(session.ResetOnLogout) s.False(session.ResetOnDisconnect) s.Nil(session.SessionTime, "By default, start and end time unset") s.Equal("", session.DefaultApplVerID) s.False(session.InitiateLogon) s.Equal(0, session.ResendRequestChunkSize) s.False(session.EnableLastMsgSeqNumProcessed) s.False(session.SkipCheckLatency) s.Equal(Millis, session.timestampPrecision) s.Equal(120*time.Second, session.MaxLatency) s.False(session.DisableMessagePersist) s.False(session.HeartBtIntOverride) } func (s *SessionFactorySuite) TestResetOnLogon() { var tests = []struct { setting string expected bool }{{"Y", true}, {"N", false}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.ResetOnLogon, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.ResetOnLogon) } } func (s *SessionFactorySuite) TestRefreshOnLogon() { var tests = []struct { setting string expected bool }{{"Y", true}, {"N", false}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.RefreshOnLogon, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.RefreshOnLogon) } } func (s *SessionFactorySuite) TestResetOnLogout() { var tests = []struct { setting string expected bool }{{"Y", true}, {"N", false}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.ResetOnLogout, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.ResetOnLogout) } } func (s *SessionFactorySuite) TestResetOnDisconnect() { var tests = []struct { setting string expected bool }{{"Y", true}, {"N", false}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.ResetOnDisconnect, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.ResetOnDisconnect) } } func (s *SessionFactorySuite) TestResendRequestChunkSize() { s.SessionSettings.Set(config.ResendRequestChunkSize, "2500") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(2500, session.ResendRequestChunkSize) s.SessionSettings.Set(config.ResendRequestChunkSize, "notanint") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestEnableLastMsgSeqNumProcessed() { var tests = []struct { setting string expected bool }{{"Y", true}, {"N", false}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.EnableLastMsgSeqNumProcessed, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.EnableLastMsgSeqNumProcessed) } } func (s *SessionFactorySuite) TestCheckLatency() { var tests = []struct { setting string expected bool }{{"Y", false}, {"N", true}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.CheckLatency, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.SkipCheckLatency) } } func (s *SessionFactorySuite) TestStartAndEndTime() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session.SessionTime) var weekday []time.Weekday expectedRange, err := internal.NewUTCTimeRange(internal.NewTimeOfDay(12, 0, 0), internal.NewTimeOfDay(14, 0, 0), weekday) s.Nil(err) s.Equal( *expectedRange, *session.SessionTime, ) } func (s *SessionFactorySuite) TestStartAndEndTimeAndTimeZone() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.TimeZone, "Local") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session.SessionTime) var weekday []time.Weekday expectedRange, err := internal.NewTimeRangeInLocation(internal.NewTimeOfDay(12, 0, 0), internal.NewTimeOfDay(14, 0, 0), weekday, time.Local) s.Nil(err) s.Equal( *expectedRange, *session.SessionTime, ) } func (s *SessionFactorySuite) TestStartAndEndTimeAndWeekdays() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.Weekdays, "Monday,Tuesday,Wednesday") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session.SessionTime) expectedRange, err := internal.NewUTCTimeRange(internal.NewTimeOfDay(12, 0, 0), internal.NewTimeOfDay(14, 0, 0), []time.Weekday{time.Monday, time.Tuesday, time.Wednesday}) s.Nil(err) s.Equal( *expectedRange, *session.SessionTime, ) } func (s *SessionFactorySuite) TestStartAndEndTimeAndTimeZoneAndWeekdays() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.TimeZone, "Local") s.SessionSettings.Set(config.Weekdays, "Mon,Tue") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session.SessionTime) expectedRange, err := internal.NewTimeRangeInLocation(internal.NewTimeOfDay(12, 0, 0), internal.NewTimeOfDay(14, 0, 0), []time.Weekday{time.Monday, time.Tuesday}, time.Local) s.Nil(err) s.Equal( *expectedRange, *session.SessionTime, ) } func (s *SessionFactorySuite) TestStartAndEndTimeAndStartAndEndDay() { var tests = []struct { startDay, endDay string }{ {"Sunday", "Thursday"}, {"Sun", "Thu"}, } for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.StartDay, test.startDay) s.SessionSettings.Set(config.EndDay, test.endDay) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session.SessionTime) expectedRange, err := internal.NewUTCWeekRange( internal.NewTimeOfDay(12, 0, 0), internal.NewTimeOfDay(14, 0, 0), time.Sunday, time.Thursday, ) s.Nil(err) s.Equal( *expectedRange, *session.SessionTime, ) } } func (s *SessionFactorySuite) TestStartAndEndTimeAndStartAndEndDayAndTimeZone() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.StartDay, "Sunday") s.SessionSettings.Set(config.EndDay, "Thursday") s.SessionSettings.Set(config.TimeZone, "Local") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session.SessionTime) expectedRange, err := internal.NewWeekRangeInLocation( internal.NewTimeOfDay(12, 0, 0), internal.NewTimeOfDay(14, 0, 0), time.Sunday, time.Thursday, time.Local, ) s.Nil(err) s.Equal( *expectedRange, *session.SessionTime, ) } func (s *SessionFactorySuite) TestMissingStartOrEndTime() { s.SessionSettings.Set(config.StartTime, "12:00:00") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) s.SetupTest() s.SessionSettings.Set(config.EndTime, "14:00:00") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestStartOrEndTimeParseError() { s.SessionSettings.Set(config.StartTime, "1200:00") s.SessionSettings.Set(config.EndTime, "14:00:00") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestInvalidTimeZone() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.TimeZone, "not valid") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestInvalidWeekdays() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") testcases := []struct { label string input string }{ { label: "invalid day value", input: "Monday,Tuesday,not valid", }, { label: "invalid separator", input: "Monday;Tuesday", }, { label: "whitespace", input: "Monday, Tuesday", }, { label: "trailing comma", input: "Monday,", }, { label: "empty value", input: "Monday,,Tuesday", }, } for _, testcase := range testcases { s.T().Run(testcase.label, func(_ *testing.T) { s.SessionSettings.Set(config.Weekdays, testcase.input) _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) }) } } func (s *SessionFactorySuite) TestMissingStartOrEndDay() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.StartDay, "Thursday") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) s.SetupTest() s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.EndDay, "Sunday") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestStartOrEndDayParseError() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.StartDay, "notvalid") s.SessionSettings.Set(config.EndDay, "Sunday") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) s.SetupTest() s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.StartDay, "Sunday") s.SessionSettings.Set(config.EndDay, "blah") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestStartEndDayWithWeekdaysError() { s.SessionSettings.Set(config.StartTime, "12:00:00") s.SessionSettings.Set(config.EndTime, "14:00:00") s.SessionSettings.Set(config.StartDay, "Monday") s.SessionSettings.Set(config.EndDay, "Wednesday") s.SessionSettings.Set(config.Weekdays, "Monday,Tuesday,Wednesday") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) } func (s *SessionFactorySuite) TestDefaultApplVerID() { s.SessionID = SessionID{BeginString: BeginStringFIXT11, TargetCompID: "TW", SenderCompID: "ISLD"} var tests = []struct{ expected, config string }{ {"2", "2"}, {"2", "FIX.4.0"}, {"3", "3"}, {"3", "FIX.4.1"}, {"4", "4"}, {"4", "FIX.4.2"}, {"5", "5"}, {"5", "FIX.4.3"}, {"6", "6"}, {"6", "FIX.4.4"}, {"7", "7"}, {"7", "FIX.5.0"}, {"8", "8"}, {"8", "FIX.5.0SP1"}, {"9", "9"}, {"9", "FIX.5.0SP2"}, } for _, test := range tests { s.SessionSettings.Set(config.DefaultApplVerID, test.config) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.Equal(test.expected, session.DefaultApplVerID) } } func (s *SessionFactorySuite) TestNewSessionBuildInitiators() { s.sessionFactory.BuildInitiators = true s.SessionSettings.Set(config.HeartBtInt, "34") s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") s.SessionSettings.Set(config.SocketConnectPort, "5000") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.True(session.InitiateLogon) s.Equal(34*time.Second, session.HeartBtInt) s.Equal(30*time.Second, session.ReconnectInterval) s.Equal(10*time.Second, session.LogonTimeout) s.Equal(2*time.Second, session.LogoutTimeout) s.Equal("127.0.0.1:5000", session.SocketConnectAddress[0]) } func (s *SessionFactorySuite) TestDuplicateSession() { s.sessionFactory.BuildInitiators = true s.SessionSettings.Set(config.HeartBtInt, "34") s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") s.SessionSettings.Set(config.SocketConnectPort, "5000") session, err := s.createSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.True(session.InitiateLogon) _, err = s.createSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) s.Equal("Duplicate SessionID", err.Error()) UnregisterSession(s.SessionID) _, err = s.createSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) } func (s *SessionFactorySuite) TestNewSessionBuildAcceptors() { s.sessionFactory.BuildInitiators = false s.SessionSettings.Set(config.HeartBtInt, "34") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.False(session.InitiateLogon) s.Zero(session.HeartBtInt) s.False(session.HeartBtIntOverride) s.SessionSettings.Set(config.HeartBtIntOverride, "Y") session, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.False(session.InitiateLogon) s.Equal(34*time.Second, session.HeartBtInt) s.True(session.HeartBtIntOverride) } func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidHeartBtInt() { s.sessionFactory.BuildInitiators = true _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt should be required for acceptors with override defined") s.SessionSettings.Set(config.HeartBtInt, "not a number") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt must be a number") s.SessionSettings.Set(config.HeartBtInt, "0") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt must be greater than zero") s.SessionSettings.Set(config.HeartBtInt, "-20") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt must be greater than zero") } func (s *SessionFactorySuite) TestNewSessionBuildAcceptorsValidHeartBtInt() { s.sessionFactory.BuildInitiators = false s.SessionSettings.Set(config.HeartBtIntOverride, "Y") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt should be required for initiators") s.SessionSettings.Set(config.HeartBtInt, "not a number") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt must be a number") s.SessionSettings.Set(config.HeartBtInt, "0") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt must be greater than zero") s.SessionSettings.Set(config.HeartBtInt, "-20") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "HeartBtInt must be greater than zero") } func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidReconnectInterval() { s.sessionFactory.BuildInitiators = true s.SessionSettings.Set(config.HeartBtInt, "34") s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") s.SessionSettings.Set(config.SocketConnectPort, "3000") s.SessionSettings.Set(config.ReconnectInterval, "45") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.Equal(45*time.Second, session.ReconnectInterval) s.SessionSettings.Set(config.ReconnectInterval, "not a number") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "ReconnectInterval must be a number") s.SessionSettings.Set(config.ReconnectInterval, "0") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "ReconnectInterval must be greater than zero") s.SessionSettings.Set(config.ReconnectInterval, "-20") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "ReconnectInterval must be greater than zero") } func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidLogoutTimeout() { s.sessionFactory.BuildInitiators = true s.SessionSettings.Set(config.HeartBtInt, "34") s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") s.SessionSettings.Set(config.SocketConnectPort, "3000") s.SessionSettings.Set(config.LogoutTimeout, "45") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.Equal(45*time.Second, session.LogoutTimeout) s.SessionSettings.Set(config.LogoutTimeout, "not a number") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "LogoutTimeout must be a number") s.SessionSettings.Set(config.LogoutTimeout, "0") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "LogoutTimeout must be greater than zero") s.SessionSettings.Set(config.LogoutTimeout, "-20") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "LogoutTimeout must be greater than zero") } func (s *SessionFactorySuite) TestNewSessionBuildInitiatorsValidLogonTimeout() { s.sessionFactory.BuildInitiators = true s.SessionSettings.Set(config.HeartBtInt, "34") s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") s.SessionSettings.Set(config.SocketConnectPort, "3000") s.SessionSettings.Set(config.LogonTimeout, "45") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.Equal(45*time.Second, session.LogonTimeout) s.SessionSettings.Set(config.LogonTimeout, "not a number") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "LogonTimeout must be a number") s.SessionSettings.Set(config.LogonTimeout, "0") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "LogonTimeout must be greater than zero") s.SessionSettings.Set(config.LogonTimeout, "-20") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "LogonTimeout must be greater than zero") } func (s *SessionFactorySuite) TestConfigureSocketConnectAddress() { sess := new(session) err := s.configureSocketConnectAddress(sess, s.SessionSettings) s.NotNil(err, "SocketConnectHost and SocketConnectPort should be required") s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") err = s.configureSocketConnectAddress(sess, s.SessionSettings) s.NotNil(err, "SocketConnectHost and SocketConnectPort should be required") s.SessionSettings = NewSessionSettings() s.SessionSettings.Set(config.SocketConnectPort, "5000") err = s.configureSocketConnectAddress(sess, s.SessionSettings) s.NotNil(err, "SocketConnectHost and SocketConnectPort should be required") var tests = []struct{ host, port, expected string }{ {"127.0.0.1", "3000", "127.0.0.1:3000"}, {"example.com", "5000", "example.com:5000"}, {"2001:db8:a0b:12f0::1", "3001", "[2001:db8:a0b:12f0::1]:3001"}, } for _, test := range tests { sess = new(session) s.SessionSettings.Set(config.SocketConnectHost, test.host) s.SessionSettings.Set(config.SocketConnectPort, test.port) err = s.configureSocketConnectAddress(sess, s.SessionSettings) s.Nil(err) s.Len(sess.SocketConnectAddress, 1) s.Equal(test.expected, sess.SocketConnectAddress[0]) } } func (s *SessionFactorySuite) TestConfigureSocketConnectAddressMulti() { session := new(session) s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") s.SessionSettings.Set(config.SocketConnectPort, "3000") s.SessionSettings.Set(config.SocketConnectHost+"1", "127.0.0.2") s.SessionSettings.Set(config.SocketConnectPort+"1", "4000") s.SessionSettings.Set(config.SocketConnectHost+"2", "127.0.0.3") s.SessionSettings.Set(config.SocketConnectPort+"2", "5000") err := s.configureSocketConnectAddress(session, s.SessionSettings) s.Require().Nil(err) s.Require().Len(session.SocketConnectAddress, 3) var tests = []string{ "127.0.0.1:3000", "127.0.0.2:4000", "127.0.0.3:5000", } for i, expected := range tests { s.Equal(expected, session.SocketConnectAddress[i]) } s.SessionSettings.Set(config.SocketConnectHost+"3", "127.0.0.4") err = s.configureSocketConnectAddress(session, s.SessionSettings) s.NotNil(err, "must have both host and port to be valid") s.SessionSettings.Set(config.SocketConnectPort+"3", "5000") s.SessionSettings.Set(config.SocketConnectPort+"4", "5000") err = s.configureSocketConnectAddress(session, s.SessionSettings) s.NotNil(err, "must have both host and port to be valid") } func (s *SessionFactorySuite) TestNewSessionTimestampPrecision() { s.SessionSettings.Set(config.TimeStampPrecision, "blah") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err) var tests = []struct { config string precision TimestampPrecision }{ {"SECONDS", Seconds}, {"MILLIS", Millis}, {"MICROS", Micros}, {"NANOS", Nanos}, } for _, test := range tests { s.SessionSettings.Set(config.TimeStampPrecision, test.config) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.Equal(session.timestampPrecision, test.precision) } } func (s *SessionFactorySuite) TestNewSessionMaxLatency() { s.SessionSettings.Set(config.MaxLatency, "not a number") _, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "MaxLatency must be a number") s.SessionSettings.Set(config.MaxLatency, "-20") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "MaxLatency must be positive") s.SessionSettings.Set(config.MaxLatency, "0") _, err = s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.NotNil(err, "MaxLatency must be positive") s.SessionSettings.Set(config.MaxLatency, "20") session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.Equal(session.MaxLatency, 20*time.Second) } func (s *SessionFactorySuite) TestPersistMessages() { var tests = []struct { setting string expected bool }{{"Y", false}, {"N", true}} for _, test := range tests { s.SetupTest() s.SessionSettings.Set(config.PersistMessages, test.setting) session, err := s.newSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) s.Nil(err) s.NotNil(session) s.Equal(test.expected, session.DisableMessagePersist) } }