auth_test.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 SNAC_0x17_0x02_BUCPLoginRequest
  45. frame = wire.SNACFrame{
  46. FoodGroup: wire.BUCP,
  47. SubGroup: wire.BUCPLoginRequest,
  48. }
  49. assert.NoError(t, flapc.SendSNAC(frame, wire.SNAC_0x17_0x02_BUCPLoginRequest{}))
  50. // < receive SNAC_0x17_0x03_BUCPLoginResponse
  51. frame = wire.SNACFrame{}
  52. assert.NoError(t, flapc.ReceiveSNAC(&frame, &wire.SNAC_0x17_0x03_BUCPLoginResponse{}))
  53. assert.Equal(t, wire.SNACFrame{FoodGroup: wire.BUCP, SubGroup: wire.BUCPLoginResponse}, frame)
  54. assert.NoError(t, serverWriter.Close())
  55. }()
  56. authService := newMockAuthService(t)
  57. authService.EXPECT().
  58. BUCPChallenge(mock.Anything, mock.Anything).
  59. Return(wire.SNACMessage{
  60. Frame: wire.SNACFrame{
  61. FoodGroup: wire.BUCP,
  62. SubGroup: wire.BUCPChallengeResponse,
  63. },
  64. Body: wire.SNAC_0x17_0x07_BUCPChallengeResponse{},
  65. }, nil)
  66. authService.EXPECT().
  67. BUCPLogin(mock.Anything, mock.Anything).
  68. Return(wire.SNACMessage{
  69. Frame: wire.SNACFrame{
  70. FoodGroup: wire.BUCP,
  71. SubGroup: wire.BUCPLoginResponse,
  72. },
  73. Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{},
  74. }, nil)
  75. rt := AuthServer{
  76. AuthService: authService,
  77. Logger: slog.Default(),
  78. }
  79. rwc := pipeRWC{
  80. PipeReader: clientReader,
  81. PipeWriter: clientWriter,
  82. }
  83. assert.NoError(t, rt.handleNewConnection(rwc))
  84. }