auth_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package oscar
  2. import (
  3. "bytes"
  4. "io"
  5. "log/slog"
  6. "testing"
  7. "github.com/mk6i/retro-aim-server/wire"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/mock"
  10. )
  11. func TestBUCPAuthService_handleNewConnection(t *testing.T) {
  12. clientReader, serverWriter := io.Pipe()
  13. serverReader, clientWriter := io.Pipe()
  14. go func() {
  15. // < receive FLAPSignonFrame
  16. flap := wire.FLAPFrame{}
  17. assert.NoError(t, wire.UnmarshalBE(&flap, serverReader))
  18. flapSignonFrame := wire.FLAPSignonFrame{}
  19. assert.NoError(t, wire.UnmarshalBE(&flapSignonFrame, bytes.NewBuffer(flap.Payload)))
  20. // > send FLAPSignonFrame
  21. flapSignonFrame = wire.FLAPSignonFrame{
  22. FLAPVersion: 1,
  23. }
  24. buf := &bytes.Buffer{}
  25. assert.NoError(t, wire.MarshalBE(flapSignonFrame, buf))
  26. flap = wire.FLAPFrame{
  27. StartMarker: 42,
  28. FrameType: wire.FLAPFrameSignon,
  29. Payload: buf.Bytes(),
  30. }
  31. assert.NoError(t, wire.MarshalBE(flap, serverWriter))
  32. // > send SNAC_0x17_0x06_BUCPChallengeRequest
  33. flapc := wire.NewFlapClient(0, serverReader, serverWriter)
  34. frame := wire.SNACFrame{
  35. FoodGroup: wire.BUCP,
  36. SubGroup: wire.BUCPChallengeRequest,
  37. }
  38. bodyIn := wire.SNAC_0x17_0x06_BUCPChallengeRequest{}
  39. assert.NoError(t, flapc.SendSNAC(frame, bodyIn))
  40. // < receive SNAC_0x17_0x07_BUCPChallengeResponse
  41. frame = wire.SNACFrame{}
  42. assert.NoError(t, flapc.ReceiveSNAC(&frame, &wire.SNAC_0x17_0x07_BUCPChallengeResponse{}))
  43. assert.Equal(t, wire.SNACFrame{FoodGroup: wire.BUCP, SubGroup: wire.BUCPChallengeResponse}, frame)
  44. // > send keep alive frame (like BSFlite does mid-login)
  45. assert.NoError(t, flapc.SendKeepAliveFrame())
  46. // > send SNAC_0x17_0x02_BUCPLoginRequest
  47. frame = wire.SNACFrame{
  48. FoodGroup: wire.BUCP,
  49. SubGroup: wire.BUCPLoginRequest,
  50. }
  51. assert.NoError(t, flapc.SendSNAC(frame, wire.SNAC_0x17_0x02_BUCPLoginRequest{}))
  52. // < receive SNAC_0x17_0x03_BUCPLoginResponse
  53. frame = wire.SNACFrame{}
  54. assert.NoError(t, flapc.ReceiveSNAC(&frame, &wire.SNAC_0x17_0x03_BUCPLoginResponse{}))
  55. assert.Equal(t, wire.SNACFrame{FoodGroup: wire.BUCP, SubGroup: wire.BUCPLoginResponse}, frame)
  56. assert.NoError(t, serverWriter.Close())
  57. }()
  58. authService := newMockAuthService(t)
  59. authService.EXPECT().
  60. BUCPChallenge(mock.Anything, mock.Anything).
  61. Return(wire.SNACMessage{
  62. Frame: wire.SNACFrame{
  63. FoodGroup: wire.BUCP,
  64. SubGroup: wire.BUCPChallengeResponse,
  65. },
  66. Body: wire.SNAC_0x17_0x07_BUCPChallengeResponse{},
  67. }, nil)
  68. authService.EXPECT().
  69. BUCPLogin(mock.Anything, mock.Anything).
  70. Return(wire.SNACMessage{
  71. Frame: wire.SNACFrame{
  72. FoodGroup: wire.BUCP,
  73. SubGroup: wire.BUCPLoginResponse,
  74. },
  75. Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{},
  76. }, nil)
  77. rt := AuthServer{
  78. AuthService: authService,
  79. Logger: slog.Default(),
  80. }
  81. rwc := pipeRWC{
  82. PipeReader: clientReader,
  83. PipeWriter: clientWriter,
  84. }
  85. assert.NoError(t, rt.handleNewConnection(rwc))
  86. }