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 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package tls
  2. import (
  3. "io"
  4. "testing"
  5. "github.com/9seconds/mtg/v2/internal/testlib"
  6. "github.com/stretchr/testify/mock"
  7. "github.com/stretchr/testify/suite"
  8. )
  9. type ConnTestSuite struct {
  10. suite.Suite
  11. connMock *testlib.EssentialsConnMock
  12. }
  13. func (suite *ConnTestSuite) SetupTest() {
  14. suite.connMock = &testlib.EssentialsConnMock{}
  15. }
  16. func (suite *ConnTestSuite) TearDownTest() {
  17. suite.connMock.AssertExpectations(suite.T())
  18. }
  19. func (suite *ConnTestSuite) feedRead(raw []byte) {
  20. suite.connMock.
  21. On("Read", mock.AnythingOfType("[]uint8")).
  22. Run(func(args mock.Arguments) {
  23. copy(args.Get(0).([]byte), raw)
  24. }).
  25. Return(len(raw), nil).
  26. Once()
  27. suite.connMock.
  28. On("Read", mock.AnythingOfType("[]uint8")).
  29. Return(0, io.EOF).
  30. Maybe()
  31. }
  32. func (suite *ConnTestSuite) TestReadTLSEnabled() {
  33. payload := []byte("hello world")
  34. suite.feedRead(MakeTLSRecord(0x17, payload))
  35. conn := New(suite.connMock, true, false)
  36. buf := make([]byte, 128)
  37. n, err := conn.Read(buf)
  38. suite.NoError(err)
  39. suite.Equal(payload, buf[:n])
  40. }
  41. func (suite *ConnTestSuite) TestReadTLSSkipsNonApplicationData() {
  42. raw := append(
  43. MakeTLSRecord(0x14, []byte{1}),
  44. MakeTLSRecord(0x17, []byte("real data"))...,
  45. )
  46. suite.feedRead(raw)
  47. conn := New(suite.connMock, true, false)
  48. buf := make([]byte, 128)
  49. n, err := conn.Read(buf)
  50. suite.NoError(err)
  51. suite.Equal([]byte("real data"), buf[:n])
  52. }
  53. func (suite *ConnTestSuite) TestReadTLSMultipleRecords() {
  54. raw := append(
  55. MakeTLSRecord(0x17, []byte("first")),
  56. MakeTLSRecord(0x17, []byte("second"))...,
  57. )
  58. suite.feedRead(raw)
  59. conn := New(suite.connMock, true, false)
  60. buf := make([]byte, 128)
  61. n, err := conn.Read(buf)
  62. suite.NoError(err)
  63. suite.Equal([]byte("first"), buf[:n])
  64. n, err = conn.Read(buf)
  65. suite.NoError(err)
  66. suite.Equal([]byte("second"), buf[:n])
  67. }
  68. func (suite *ConnTestSuite) TestReadTLSSmallBuffer() {
  69. payload := []byte("hello world, this is a longer payload")
  70. suite.feedRead(MakeTLSRecord(0x17, payload))
  71. conn := New(suite.connMock, true, false)
  72. small := make([]byte, 5)
  73. n, err := conn.Read(small)
  74. suite.NoError(err)
  75. suite.Equal(payload[:5], small[:n])
  76. rest := make([]byte, 128)
  77. n, err = conn.Read(rest)
  78. suite.NoError(err)
  79. suite.Equal(payload[5:], rest[:n])
  80. }
  81. func (suite *ConnTestSuite) TestReadPassthrough() {
  82. data := []byte("raw bytes")
  83. suite.connMock.
  84. On("Read", mock.AnythingOfType("[]uint8")).
  85. Run(func(args mock.Arguments) {
  86. copy(args.Get(0).([]byte), data)
  87. }).
  88. Return(len(data), nil).
  89. Once()
  90. conn := New(suite.connMock, false, false)
  91. buf := make([]byte, 128)
  92. n, err := conn.Read(buf)
  93. suite.NoError(err)
  94. suite.Equal(data, buf[:n])
  95. }
  96. func (suite *ConnTestSuite) TestWritePassthrough() {
  97. data := []byte("outgoing data")
  98. suite.connMock.
  99. On("Write", mock.AnythingOfType("[]uint8")).
  100. Return(len(data), nil).
  101. Once()
  102. conn := New(suite.connMock, false, false)
  103. n, err := conn.Write(data)
  104. suite.NoError(err)
  105. suite.Equal(len(data), n)
  106. }
  107. func (suite *ConnTestSuite) TestWriteTLSEnabled() {
  108. data := []byte("outgoing data")
  109. suite.connMock.
  110. On("Write", mock.AnythingOfType("[]uint8")).
  111. Return(len(data), nil).
  112. Once()
  113. conn := New(suite.connMock, false, true)
  114. n, err := conn.Write(data)
  115. suite.NoError(err)
  116. suite.Equal(len(data), n)
  117. }
  118. func TestConn(t *testing.T) {
  119. t.Parallel()
  120. suite.Run(t, &ConnTestSuite{})
  121. }