icbm_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package handler
  2. import (
  3. "bytes"
  4. "log/slog"
  5. "testing"
  6. "github.com/mk6i/retro-aim-server/wire"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/mock"
  9. )
  10. func TestICBMHandler_AddParameters(t *testing.T) {
  11. input := wire.SNACMessage{
  12. Frame: wire.SNACFrame{
  13. FoodGroup: wire.ICBM,
  14. SubGroup: wire.ICBMAddParameters,
  15. },
  16. Body: wire.SNAC_0x04_0x02_ICBMAddParameters{
  17. Channel: 1,
  18. },
  19. }
  20. svc := newMockICBMService(t)
  21. h := NewICBMHandler(slog.Default(), svc)
  22. responseWriter := newMockResponseWriter(t)
  23. buf := &bytes.Buffer{}
  24. assert.NoError(t, wire.MarshalBE(input.Body, buf))
  25. assert.NoError(t, h.AddParameters(nil, nil, input.Frame, buf, responseWriter))
  26. }
  27. func TestICBMHandler_ChannelMsgToHost(t *testing.T) {
  28. input := wire.SNACMessage{
  29. Frame: wire.SNACFrame{
  30. FoodGroup: wire.ICBM,
  31. SubGroup: wire.ICBMChannelMsgToHost,
  32. },
  33. Body: wire.SNAC_0x04_0x06_ICBMChannelMsgToHost{
  34. ScreenName: "recipient-screen-name",
  35. },
  36. }
  37. output := wire.SNACMessage{
  38. Frame: wire.SNACFrame{
  39. FoodGroup: wire.ICBM,
  40. SubGroup: wire.ICBMHostAck,
  41. },
  42. Body: wire.SNAC_0x04_0x0C_ICBMHostAck{
  43. ChannelID: 4,
  44. },
  45. }
  46. svc := newMockICBMService(t)
  47. svc.EXPECT().
  48. ChannelMsgToHost(mock.Anything, mock.Anything, input.Frame, input.Body).
  49. Return(&output, nil)
  50. h := NewICBMHandler(slog.Default(), svc)
  51. responseWriter := newMockResponseWriter(t)
  52. responseWriter.EXPECT().
  53. SendSNAC(output.Frame, output.Body).
  54. Return(nil)
  55. buf := &bytes.Buffer{}
  56. assert.NoError(t, wire.MarshalBE(input.Body, buf))
  57. assert.NoError(t, h.ChannelMsgToHost(nil, nil, input.Frame, buf, responseWriter))
  58. }
  59. func TestICBMHandler_ClientErr(t *testing.T) {
  60. input := wire.SNACMessage{
  61. Frame: wire.SNACFrame{
  62. FoodGroup: wire.ICBM,
  63. SubGroup: wire.ICBMClientErr,
  64. },
  65. Body: wire.SNAC_0x04_0x0B_ICBMClientErr{
  66. Code: 4,
  67. },
  68. }
  69. svc := newMockICBMService(t)
  70. svc.EXPECT().
  71. ClientErr(mock.Anything, mock.Anything, input.Frame, input.Body).
  72. Return(nil)
  73. h := NewICBMHandler(slog.Default(), svc)
  74. responseWriter := newMockResponseWriter(t)
  75. buf := &bytes.Buffer{}
  76. assert.NoError(t, wire.MarshalBE(input.Body, buf))
  77. assert.NoError(t, h.ClientErr(nil, nil, input.Frame, buf, responseWriter))
  78. }
  79. func TestICBMHandler_ClientEvent(t *testing.T) {
  80. input := wire.SNACMessage{
  81. Frame: wire.SNACFrame{
  82. FoodGroup: wire.ICBM,
  83. SubGroup: wire.ICBMClientEvent,
  84. },
  85. Body: wire.SNAC_0x04_0x14_ICBMClientEvent{
  86. ScreenName: "recipient-screen-name",
  87. },
  88. }
  89. svc := newMockICBMService(t)
  90. svc.EXPECT().
  91. ClientEvent(mock.Anything, mock.Anything, input.Frame, input.Body).
  92. Return(nil)
  93. h := NewICBMHandler(slog.Default(), svc)
  94. responseWriter := newMockResponseWriter(t)
  95. buf := &bytes.Buffer{}
  96. assert.NoError(t, wire.MarshalBE(input.Body, buf))
  97. assert.NoError(t, h.ClientEvent(nil, nil, input.Frame, buf, responseWriter))
  98. }
  99. func TestICBMHandler_EvilRequest(t *testing.T) {
  100. input := wire.SNACMessage{
  101. Frame: wire.SNACFrame{
  102. FoodGroup: wire.ICBM,
  103. SubGroup: wire.ICBMEvilRequest,
  104. },
  105. Body: wire.SNAC_0x04_0x08_ICBMEvilRequest{
  106. ScreenName: "recipient-screen-name",
  107. },
  108. }
  109. output := wire.SNACMessage{
  110. Frame: wire.SNACFrame{
  111. FoodGroup: wire.ICBM,
  112. SubGroup: wire.ICBMEvilReply,
  113. },
  114. Body: wire.SNAC_0x04_0x09_ICBMEvilReply{
  115. EvilDeltaApplied: 100,
  116. },
  117. }
  118. svc := newMockICBMService(t)
  119. svc.EXPECT().
  120. EvilRequest(mock.Anything, mock.Anything, input.Frame, input.Body).
  121. Return(output, nil)
  122. h := NewICBMHandler(slog.Default(), svc)
  123. responseWriter := newMockResponseWriter(t)
  124. responseWriter.EXPECT().
  125. SendSNAC(output.Frame, output.Body).
  126. Return(nil)
  127. buf := &bytes.Buffer{}
  128. assert.NoError(t, wire.MarshalBE(input.Body, buf))
  129. assert.NoError(t, h.EvilRequest(nil, nil, input.Frame, buf, responseWriter))
  130. }
  131. func TestICBMHandler_ParameterQuery(t *testing.T) {
  132. input := wire.SNACMessage{
  133. Frame: wire.SNACFrame{
  134. FoodGroup: wire.ICBM,
  135. SubGroup: wire.ICBMParameterQuery,
  136. },
  137. Body: struct{}{}, // empty SNAC
  138. }
  139. output := wire.SNACMessage{
  140. Frame: wire.SNACFrame{
  141. FoodGroup: wire.ICBM,
  142. SubGroup: wire.ICBMParameterReply,
  143. },
  144. Body: wire.SNAC_0x04_0x05_ICBMParameterReply{
  145. MaxSlots: 100,
  146. },
  147. }
  148. svc := newMockICBMService(t)
  149. svc.EXPECT().
  150. ParameterQuery(mock.Anything, input.Frame).
  151. Return(output)
  152. h := NewICBMHandler(slog.Default(), svc)
  153. responseWriter := newMockResponseWriter(t)
  154. responseWriter.EXPECT().
  155. SendSNAC(output.Frame, output.Body).
  156. Return(nil)
  157. buf := &bytes.Buffer{}
  158. assert.NoError(t, wire.MarshalBE(input.Body, buf))
  159. assert.NoError(t, h.ParameterQuery(nil, nil, input.Frame, buf, responseWriter))
  160. }