buddy_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package server
  2. import (
  3. "bytes"
  4. "github.com/mkaminski/goaim/oscar"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/mock"
  7. "testing"
  8. )
  9. func TestBuddyRouter_RouteBuddy(t *testing.T) {
  10. cases := []struct {
  11. // name is the unit test name
  12. name string
  13. // input is the request payload
  14. input XMessage
  15. // output is the response payload
  16. output XMessage
  17. // handlerErr is the mocked handler error response
  18. handlerErr error
  19. // expectErr is the expected error returned by the router
  20. expectErr error
  21. }{
  22. {
  23. name: "receive BuddyRightsQuery, return BuddyRightsReply",
  24. input: XMessage{
  25. snacFrame: oscar.SnacFrame{
  26. FoodGroup: oscar.BUDDY,
  27. SubGroup: oscar.BuddyRightsQuery,
  28. },
  29. snacOut: oscar.SNAC_0x03_0x02_BuddyRightsQuery{
  30. TLVRestBlock: oscar.TLVRestBlock{
  31. TLVList: oscar.TLVList{
  32. {
  33. TType: 0x01,
  34. Val: []byte{1, 2, 3, 4},
  35. },
  36. },
  37. },
  38. },
  39. },
  40. output: XMessage{
  41. snacFrame: oscar.SnacFrame{
  42. FoodGroup: oscar.BUDDY,
  43. SubGroup: oscar.BuddyRightsReply,
  44. },
  45. snacOut: oscar.SNAC_0x03_0x03_BuddyRightsReply{
  46. TLVRestBlock: oscar.TLVRestBlock{
  47. TLVList: oscar.TLVList{
  48. {
  49. TType: 0x01,
  50. Val: []byte{1, 2, 3, 4},
  51. },
  52. },
  53. },
  54. },
  55. },
  56. },
  57. {
  58. name: "receive ErrorCodeReplyTooBig, expect ErrUnsupportedSubGroup",
  59. input: XMessage{
  60. snacFrame: oscar.SnacFrame{
  61. FoodGroup: oscar.BUDDY,
  62. SubGroup: ErrorCodeReplyTooBig,
  63. },
  64. snacOut: struct{}{}, // empty SNAC
  65. },
  66. output: XMessage{},
  67. expectErr: ErrUnsupportedSubGroup,
  68. },
  69. }
  70. for _, tc := range cases {
  71. t.Run(tc.name, func(t *testing.T) {
  72. svc := NewMockBuddyHandler(t)
  73. svc.EXPECT().
  74. RightsQueryHandler(mock.Anything).
  75. Return(tc.output).
  76. Maybe()
  77. router := BuddyRouter{
  78. BuddyHandler: svc,
  79. RouteLogger: RouteLogger{
  80. Logger: NewLogger(Config{}),
  81. },
  82. }
  83. bufIn := &bytes.Buffer{}
  84. assert.NoError(t, oscar.Marshal(tc.input.snacOut, bufIn))
  85. bufOut := &bytes.Buffer{}
  86. seq := uint32(1)
  87. err := router.RouteBuddy(nil, tc.input.snacFrame, bufIn, bufOut, &seq)
  88. assert.ErrorIs(t, err, tc.expectErr)
  89. if tc.expectErr != nil {
  90. return
  91. }
  92. if tc.output == (XMessage{}) {
  93. // make sure no response was sent
  94. assert.Empty(t, bufOut.Bytes())
  95. return
  96. }
  97. // verify the FLAP frame
  98. flap := oscar.FlapFrame{}
  99. assert.NoError(t, oscar.Unmarshal(&flap, bufOut))
  100. // make sure the sequence number was incremented
  101. assert.Equal(t, uint32(2), seq)
  102. flapBuf, err := flap.SNACBuffer(bufOut)
  103. assert.NoError(t, err)
  104. // verify the SNAC frame
  105. snacFrame := oscar.SnacFrame{}
  106. assert.NoError(t, oscar.Unmarshal(&snacFrame, flapBuf))
  107. assert.Equal(t, tc.output.snacFrame, snacFrame)
  108. // verify the SNAC message
  109. snacBuf := &bytes.Buffer{}
  110. assert.NoError(t, oscar.Marshal(tc.output.snacOut, snacBuf))
  111. assert.Equal(t, snacBuf.Bytes(), flapBuf.Bytes())
  112. })
  113. }
  114. }