auth_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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.Unmarshal(&flap, serverReader))
  18. buf, err := flap.ReadBody(serverReader)
  19. assert.NoError(t, err)
  20. flapSignonFrame := wire.FLAPSignonFrame{}
  21. assert.NoError(t, wire.Unmarshal(&flapSignonFrame, buf))
  22. // > send FLAPSignonFrame
  23. flapSignonFrame = wire.FLAPSignonFrame{
  24. FLAPVersion: 1,
  25. }
  26. buf = &bytes.Buffer{}
  27. assert.NoError(t, wire.Marshal(flapSignonFrame, buf))
  28. flap = wire.FLAPFrame{
  29. StartMarker: 42,
  30. FrameType: wire.FLAPFrameSignon,
  31. PayloadLength: uint16(buf.Len()),
  32. }
  33. assert.NoError(t, wire.Marshal(flap, serverWriter))
  34. _, err = serverWriter.Write(buf.Bytes())
  35. assert.NoError(t, err)
  36. // > send SNAC_0x17_0x06_BUCPChallengeRequest
  37. flapc := wire.NewFlapClient(0, serverReader, serverWriter)
  38. frame := wire.SNACFrame{
  39. FoodGroup: wire.BUCP,
  40. SubGroup: wire.BUCPChallengeRequest,
  41. }
  42. bodyIn := wire.SNAC_0x17_0x06_BUCPChallengeRequest{}
  43. assert.NoError(t, flapc.SendSNAC(frame, bodyIn))
  44. // < receive SNAC_0x17_0x07_BUCPChallengeResponse
  45. frame = wire.SNACFrame{}
  46. assert.NoError(t, flapc.ReceiveSNAC(&frame, &wire.SNAC_0x17_0x07_BUCPChallengeResponse{}))
  47. assert.Equal(t, wire.SNACFrame{FoodGroup: wire.BUCP, SubGroup: wire.BUCPChallengeResponse}, frame)
  48. // > send SNAC_0x17_0x02_BUCPLoginRequest
  49. frame = wire.SNACFrame{
  50. FoodGroup: wire.BUCP,
  51. SubGroup: wire.BUCPLoginRequest,
  52. }
  53. assert.NoError(t, flapc.SendSNAC(frame, wire.SNAC_0x17_0x02_BUCPLoginRequest{}))
  54. // < receive SNAC_0x17_0x03_BUCPLoginResponse
  55. frame = wire.SNACFrame{}
  56. assert.NoError(t, flapc.ReceiveSNAC(&frame, &wire.SNAC_0x17_0x03_BUCPLoginResponse{}))
  57. assert.Equal(t, wire.SNACFrame{FoodGroup: wire.BUCP, SubGroup: wire.BUCPLoginResponse}, frame)
  58. assert.NoError(t, serverWriter.Close())
  59. }()
  60. authService := newMockAuthService(t)
  61. authService.EXPECT().
  62. BUCPChallenge(mock.Anything, mock.Anything).
  63. Return(wire.SNACMessage{
  64. Frame: wire.SNACFrame{
  65. FoodGroup: wire.BUCP,
  66. SubGroup: wire.BUCPChallengeResponse,
  67. },
  68. Body: wire.SNAC_0x17_0x07_BUCPChallengeResponse{},
  69. }, nil)
  70. authService.EXPECT().
  71. BUCPLogin(mock.Anything, mock.Anything).
  72. Return(wire.SNACMessage{
  73. Frame: wire.SNACFrame{
  74. FoodGroup: wire.BUCP,
  75. SubGroup: wire.BUCPLoginResponse,
  76. },
  77. Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{},
  78. }, nil)
  79. rt := AuthServer{
  80. AuthService: authService,
  81. Logger: slog.Default(),
  82. }
  83. rwc := pipeRWC{
  84. PipeReader: clientReader,
  85. PipeWriter: clientWriter,
  86. }
  87. assert.NoError(t, rt.handleNewConnection(rwc))
  88. }