Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

conn_test.go 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package faketls_test
  2. import (
  3. "bytes"
  4. "errors"
  5. "io"
  6. "math/rand"
  7. "testing"
  8. "github.com/9seconds/mtg/v2/internal/testlib"
  9. "github.com/9seconds/mtg/v2/mtglib/internal/faketls"
  10. "github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
  11. "github.com/stretchr/testify/mock"
  12. "github.com/stretchr/testify/suite"
  13. )
  14. type ConnMock struct {
  15. testlib.EssentialsConnMock
  16. readBuffer bytes.Buffer
  17. writeBuffer bytes.Buffer
  18. }
  19. func (m *ConnMock) Read(p []byte) (int, error) {
  20. m.Called(p)
  21. return m.readBuffer.Read(p) //nolint: wrapcheck
  22. }
  23. func (m *ConnMock) Write(p []byte) (int, error) {
  24. m.Called(p)
  25. return m.writeBuffer.Write(p) //nolint: wrapcheck
  26. }
  27. type ConnTestSuite struct {
  28. suite.Suite
  29. connMock *ConnMock
  30. c *faketls.Conn
  31. }
  32. func (suite *ConnTestSuite) SetupTest() {
  33. suite.connMock = &ConnMock{}
  34. suite.c = &faketls.Conn{
  35. Conn: suite.connMock,
  36. }
  37. }
  38. func (suite *ConnTestSuite) TearDownTest() {
  39. suite.connMock.AssertExpectations(suite.T())
  40. }
  41. func (suite *ConnTestSuite) TestRead() {
  42. suite.connMock.On("Read", mock.Anything).Return(0, nil)
  43. rec := record.AcquireRecord()
  44. defer record.ReleaseRecord(rec)
  45. rec.Type = record.TypeChangeCipherSpec
  46. rec.Version = record.Version12
  47. rec.Payload.WriteByte(0x01)
  48. rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
  49. rec.Reset()
  50. rec.Type = record.TypeApplicationData
  51. rec.Version = record.Version12
  52. rec.Payload.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
  53. rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
  54. resultBuffer := &bytes.Buffer{}
  55. buf := make([]byte, 2)
  56. for {
  57. n, err := suite.c.Read(buf)
  58. if errors.Is(err, io.EOF) {
  59. break
  60. }
  61. resultBuffer.Write(buf[:n])
  62. }
  63. suite.Equal([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, resultBuffer.Bytes())
  64. }
  65. func (suite *ConnTestSuite) TestReadUnexpected() {
  66. suite.connMock.On("Read", mock.Anything).Return(0, nil)
  67. rec := record.AcquireRecord()
  68. defer record.ReleaseRecord(rec)
  69. rec.Type = record.TypeChangeCipherSpec
  70. rec.Version = record.Version12
  71. rec.Payload.WriteByte(0x01)
  72. rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
  73. rec.Reset()
  74. rec.Type = record.TypeHandshake
  75. rec.Version = record.Version12
  76. rec.Payload.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
  77. rec.Dump(&suite.connMock.readBuffer) //nolint: errcheck
  78. buf := make([]byte, 2)
  79. for {
  80. _, err := suite.c.Read(buf)
  81. switch {
  82. case err == nil:
  83. case errors.Is(err, io.EOF):
  84. suite.FailNow("unexpected to finish")
  85. default:
  86. return
  87. }
  88. }
  89. }
  90. func (suite *ConnTestSuite) TestWrite() {
  91. suite.connMock.On("Write", mock.Anything).Return(0, nil)
  92. dataToRec := make([]byte, record.TLSMaxRecordSize*2)
  93. rand.Read(dataToRec) //nolint: staticcheck
  94. n, err := suite.c.Write(dataToRec)
  95. suite.NoError(err)
  96. suite.Equal(len(dataToRec), n)
  97. rec := record.AcquireRecord()
  98. defer record.ReleaseRecord(rec)
  99. buf := &bytes.Buffer{}
  100. for {
  101. if err := rec.Read(&suite.connMock.writeBuffer); err != nil {
  102. break
  103. }
  104. suite.Equal(record.TypeApplicationData, rec.Type)
  105. suite.Equal(record.Version12, rec.Version)
  106. rec.Payload.WriteTo(buf) //nolint: errcheck
  107. }
  108. suite.Equal(dataToRec, buf.Bytes())
  109. }
  110. func TestConn(t *testing.T) {
  111. t.Parallel()
  112. suite.Run(t, &ConnTestSuite{})
  113. }