icbm_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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.Marshal(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.Marshal(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. h := NewICBMHandler(slog.Default(), svc)
  71. responseWriter := newMockResponseWriter(t)
  72. buf := &bytes.Buffer{}
  73. assert.NoError(t, wire.Marshal(input.Body, buf))
  74. assert.NoError(t, h.ClientErr(nil, nil, input.Frame, buf, responseWriter))
  75. }
  76. func TestICBMHandler_ClientEvent(t *testing.T) {
  77. input := wire.SNACMessage{
  78. Frame: wire.SNACFrame{
  79. FoodGroup: wire.ICBM,
  80. SubGroup: wire.ICBMClientEvent,
  81. },
  82. Body: wire.SNAC_0x04_0x14_ICBMClientEvent{
  83. ScreenName: "recipient-screen-name",
  84. },
  85. }
  86. svc := newMockICBMService(t)
  87. svc.EXPECT().
  88. ClientEvent(mock.Anything, mock.Anything, input.Frame, input.Body).
  89. Return(nil)
  90. h := NewICBMHandler(slog.Default(), svc)
  91. responseWriter := newMockResponseWriter(t)
  92. buf := &bytes.Buffer{}
  93. assert.NoError(t, wire.Marshal(input.Body, buf))
  94. assert.NoError(t, h.ClientEvent(nil, nil, input.Frame, buf, responseWriter))
  95. }
  96. func TestICBMHandler_EvilRequest(t *testing.T) {
  97. input := wire.SNACMessage{
  98. Frame: wire.SNACFrame{
  99. FoodGroup: wire.ICBM,
  100. SubGroup: wire.ICBMEvilRequest,
  101. },
  102. Body: wire.SNAC_0x04_0x08_ICBMEvilRequest{
  103. ScreenName: "recipient-screen-name",
  104. },
  105. }
  106. output := wire.SNACMessage{
  107. Frame: wire.SNACFrame{
  108. FoodGroup: wire.ICBM,
  109. SubGroup: wire.ICBMEvilReply,
  110. },
  111. Body: wire.SNAC_0x04_0x09_ICBMEvilReply{
  112. EvilDeltaApplied: 100,
  113. },
  114. }
  115. svc := newMockICBMService(t)
  116. svc.EXPECT().
  117. EvilRequest(mock.Anything, mock.Anything, input.Frame, input.Body).
  118. Return(output, nil)
  119. h := NewICBMHandler(slog.Default(), svc)
  120. responseWriter := newMockResponseWriter(t)
  121. responseWriter.EXPECT().
  122. SendSNAC(output.Frame, output.Body).
  123. Return(nil)
  124. buf := &bytes.Buffer{}
  125. assert.NoError(t, wire.Marshal(input.Body, buf))
  126. assert.NoError(t, h.EvilRequest(nil, nil, input.Frame, buf, responseWriter))
  127. }
  128. func TestICBMHandler_ParameterQuery(t *testing.T) {
  129. input := wire.SNACMessage{
  130. Frame: wire.SNACFrame{
  131. FoodGroup: wire.ICBM,
  132. SubGroup: wire.ICBMParameterQuery,
  133. },
  134. Body: struct{}{}, // empty SNAC
  135. }
  136. output := wire.SNACMessage{
  137. Frame: wire.SNACFrame{
  138. FoodGroup: wire.ICBM,
  139. SubGroup: wire.ICBMParameterReply,
  140. },
  141. Body: wire.SNAC_0x04_0x05_ICBMParameterReply{
  142. MaxSlots: 100,
  143. },
  144. }
  145. svc := newMockICBMService(t)
  146. svc.EXPECT().
  147. ParameterQuery(mock.Anything, input.Frame).
  148. Return(output)
  149. h := NewICBMHandler(slog.Default(), svc)
  150. responseWriter := newMockResponseWriter(t)
  151. responseWriter.EXPECT().
  152. SendSNAC(output.Frame, output.Body).
  153. Return(nil)
  154. buf := &bytes.Buffer{}
  155. assert.NoError(t, wire.Marshal(input.Body, buf))
  156. assert.NoError(t, h.ParameterQuery(nil, nil, input.Frame, buf, responseWriter))
  157. }