|
5 | 5 | "time" |
6 | 6 |
|
7 | 7 | "github.com/quickfixgo/quickfix/enum" |
| 8 | + "github.com/stretchr/testify/require" |
| 9 | + "github.com/stretchr/testify/suite" |
8 | 10 | ) |
9 | 11 |
|
10 | 12 | func buildMessage() Message { |
@@ -279,50 +281,165 @@ func (e *TestClient) FromApp(msg Message, sessionID SessionID) (reject MessageRe |
279 | 281 | return nil |
280 | 282 | } |
281 | 283 |
|
282 | | -func TestSession_CheckToAdminCalled(t *testing.T) { |
283 | | - app := new(TestClient) |
284 | | - otherEnd := make(chan []byte) |
285 | | - go func() { |
286 | | - <-otherEnd |
287 | | - }() |
| 284 | +type SessionSendTestSuite struct { |
| 285 | + suite.Suite |
288 | 286 |
|
289 | | - session := session{ |
| 287 | + *TestClient |
| 288 | + session |
| 289 | + sendChannel chan []byte |
| 290 | +} |
| 291 | + |
| 292 | +func (suite *SessionSendTestSuite) SetupTest() { |
| 293 | + suite.sendChannel = make(chan []byte, 1) |
| 294 | + suite.TestClient = new(TestClient) |
| 295 | + suite.session = session{ |
290 | 296 | store: new(memoryStore), |
291 | | - application: app, |
292 | | - messageOut: otherEnd, |
| 297 | + application: suite, |
293 | 298 | log: nullLog{}, |
| 299 | + messageOut: suite.sendChannel, |
294 | 300 | } |
295 | | - builder := buildMessage() |
296 | | - builder.Header.SetField(tagMsgType, FIXString("A")) |
297 | | - session.send(builder) |
| 301 | +} |
| 302 | + |
| 303 | +func (suite *SessionSendTestSuite) SentMessage() (msg []byte) { |
| 304 | + select { |
| 305 | + case msg = <-suite.sendChannel: |
| 306 | + default: |
| 307 | + } |
| 308 | + return |
| 309 | +} |
| 310 | + |
| 311 | +func TestSessionSendTestSuite(t *testing.T) { |
| 312 | + suite.Run(t, new(SessionSendTestSuite)) |
| 313 | +} |
| 314 | + |
| 315 | +func (suite *SessionSendTestSuite) SendNewOrderSingle() { |
| 316 | + msg := buildMessage() |
| 317 | + msg.Header.SetField(tagMsgType, FIXString("D")) |
| 318 | + require.Nil(suite.T(), suite.send(msg)) |
| 319 | +} |
| 320 | + |
| 321 | +func (suite *SessionSendTestSuite) SendHeartbeat() { |
| 322 | + msg := buildMessage() |
| 323 | + msg.Header.SetField(tagMsgType, FIXString("0")) |
| 324 | + require.Nil(suite.T(), suite.send(msg)) |
| 325 | +} |
| 326 | + |
| 327 | +func (suite *SessionSendTestSuite) SendLogon() { |
| 328 | + msg := buildMessage() |
| 329 | + msg.Header.SetField(tagMsgType, FIXString("A")) |
| 330 | + require.Nil(suite.T(), suite.send(msg)) |
| 331 | +} |
298 | 332 |
|
299 | | - if app.adminCalled != 1 { |
300 | | - t.Error("ToAdmin should have been called exactly once, instead was called", app.adminCalled, "times") |
| 333 | +func (suite *SessionSendTestSuite) MessagePersisted() { |
| 334 | + suite.Equal(2, suite.store.NextSenderMsgSeqNum(), "The next sender sequence number should be incremented") |
| 335 | + persistedMessages, err := suite.store.GetMessages(1, 1) |
| 336 | + suite.Nil(err) |
| 337 | + suite.Len(persistedMessages, 1, "The message should be persisted") |
| 338 | +} |
| 339 | + |
| 340 | +func (suite *SessionSendTestSuite) TestSendAppMessageLoggedOn() { |
| 341 | + var tests = []struct { |
| 342 | + sessionState |
| 343 | + }{ |
| 344 | + {inSession{}}, |
| 345 | + {resendState{}}, |
| 346 | + {pendingTimeout{inSession{}}}, |
| 347 | + {pendingTimeout{resendState{}}}, |
301 | 348 | } |
302 | | - if app.appCalled != 0 { |
303 | | - t.Error("ToApp should not have been called, instead was called", app.appCalled, "times") |
| 349 | + |
| 350 | + for _, test := range tests { |
| 351 | + suite.SetupTest() |
| 352 | + suite.session.sessionState = test.sessionState |
| 353 | + |
| 354 | + suite.SendNewOrderSingle() |
| 355 | + |
| 356 | + suite.Equal(1, suite.appCalled, "ToApp should be called") |
| 357 | + suite.MessagePersisted() |
| 358 | + suite.NotNil(suite.SentMessage(), "The message should have been sent") |
304 | 359 | } |
305 | 360 | } |
306 | 361 |
|
307 | | -func TestSession_CheckToAppCalled(t *testing.T) { |
308 | | - app := new(TestClient) |
309 | | - otherEnd := make(chan []byte) |
310 | | - go func() { |
311 | | - <-otherEnd |
312 | | - }() |
| 362 | +func (suite *SessionSendTestSuite) TestSendAdminMessageLoggedOn() { |
| 363 | + var tests = []struct { |
| 364 | + sessionState |
| 365 | + }{ |
| 366 | + {inSession{}}, |
| 367 | + {resendState{}}, |
| 368 | + {pendingTimeout{inSession{}}}, |
| 369 | + {pendingTimeout{resendState{}}}, |
| 370 | + } |
313 | 371 |
|
314 | | - session := session{ |
315 | | - store: new(memoryStore), |
316 | | - application: app, |
317 | | - messageOut: otherEnd, |
318 | | - log: nullLog{}} |
319 | | - builder := buildMessage() |
320 | | - session.send(builder) |
| 372 | + for _, test := range tests { |
| 373 | + suite.SetupTest() |
| 374 | + suite.session.sessionState = test.sessionState |
| 375 | + |
| 376 | + suite.SendHeartbeat() |
321 | 377 |
|
322 | | - if app.appCalled != 1 { |
323 | | - t.Error("Toapp should have been called exactly once, instead was called", app.appCalled, "times") |
| 378 | + suite.Equal(1, suite.adminCalled, "ToAdmin should be called") |
| 379 | + suite.MessagePersisted() |
| 380 | + suite.NotNil(suite.SentMessage(), "The message should have been sent") |
324 | 381 | } |
325 | | - if app.adminCalled != 0 { |
326 | | - t.Error("Toadmin should not have been called, instead was called", app.adminCalled, "times") |
| 382 | +} |
| 383 | + |
| 384 | +func (suite *SessionSendTestSuite) TestSendAppMessageNotLoggedOn() { |
| 385 | + var tests = []struct { |
| 386 | + sessionState |
| 387 | + }{ |
| 388 | + {logonState{}}, |
| 389 | + {logoutState{}}, |
| 390 | + {latentState{}}, |
| 391 | + } |
| 392 | + |
| 393 | + for _, test := range tests { |
| 394 | + suite.SetupTest() |
| 395 | + suite.session.sessionState = test.sessionState |
| 396 | + |
| 397 | + suite.SendNewOrderSingle() |
| 398 | + |
| 399 | + suite.Equal(1, suite.appCalled, "ToApp should be called even if the message is not sent") |
| 400 | + suite.MessagePersisted() |
| 401 | + suite.Nil(suite.SentMessage(), "The message should not be sent") |
| 402 | + } |
| 403 | +} |
| 404 | + |
| 405 | +func (suite *SessionSendTestSuite) TestSendAdminMessageNotLoggedOnNotSent() { |
| 406 | + var tests = []struct { |
| 407 | + sessionState |
| 408 | + }{ |
| 409 | + {logonState{}}, |
| 410 | + {logoutState{}}, |
| 411 | + {latentState{}}, |
| 412 | + } |
| 413 | + |
| 414 | + for _, test := range tests { |
| 415 | + suite.SetupTest() |
| 416 | + suite.session.sessionState = test.sessionState |
| 417 | + |
| 418 | + suite.SendHeartbeat() |
| 419 | + |
| 420 | + suite.Equal(1, suite.adminCalled, "ToAdmin should be called even if the message is not sent") |
| 421 | + suite.MessagePersisted() |
| 422 | + suite.Nil(suite.SentMessage(), "The message should not be sent") |
| 423 | + } |
| 424 | +} |
| 425 | + |
| 426 | +func (suite *SessionSendTestSuite) TestSendAdminMessageNotLoggedOnIsSent() { |
| 427 | + var tests = []struct { |
| 428 | + sessionState |
| 429 | + }{ |
| 430 | + {logonState{}}, |
| 431 | + {logoutState{}}, |
| 432 | + {latentState{}}, |
| 433 | + } |
| 434 | + |
| 435 | + for _, test := range tests { |
| 436 | + suite.SetupTest() |
| 437 | + suite.session.sessionState = test.sessionState |
| 438 | + |
| 439 | + suite.SendLogon() |
| 440 | + |
| 441 | + suite.Equal(1, suite.adminCalled, "ToAdmin should be called") |
| 442 | + suite.MessagePersisted() |
| 443 | + suite.NotNil(suite.SentMessage(), "The message should be sent") |
327 | 444 | } |
328 | 445 | } |
0 commit comments