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
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

conns_internal_test.go 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package mtglib
  2. import (
  3. "bytes"
  4. "context"
  5. "errors"
  6. "io"
  7. "testing"
  8. "time"
  9. "github.com/9seconds/mtg/v2/internal/testlib"
  10. "github.com/stretchr/testify/mock"
  11. "github.com/stretchr/testify/suite"
  12. )
  13. type ConnRewindBaseConn struct {
  14. testlib.NetConnMock
  15. readBuffer bytes.Buffer
  16. }
  17. func (c *ConnRewindBaseConn) Read(p []byte) (int, error) {
  18. c.Called(p)
  19. return c.readBuffer.Read(p)
  20. }
  21. type ConnTrafficTestSuite struct {
  22. suite.Suite
  23. eventStreamMock *EventStreamMock
  24. connMock *testlib.NetConnMock
  25. conn io.ReadWriter
  26. }
  27. func (suite *ConnTrafficTestSuite) SetupTest() {
  28. suite.eventStreamMock = &EventStreamMock{}
  29. suite.connMock = &testlib.NetConnMock{}
  30. suite.conn = connTraffic{
  31. Conn: suite.connMock,
  32. connID: "CONNID",
  33. ctx: context.Background(),
  34. stream: suite.eventStreamMock,
  35. }
  36. }
  37. func (suite *ConnTrafficTestSuite) TearDownTest() {
  38. suite.eventStreamMock.AssertExpectations(suite.T())
  39. suite.connMock.AssertExpectations(suite.T())
  40. }
  41. func (suite *ConnTrafficTestSuite) TestReadOk() {
  42. suite.eventStreamMock.
  43. On("Send", mock.Anything, mock.Anything).
  44. Once().
  45. Run(func(args mock.Arguments) {
  46. evt := args.Get(1).(EventTraffic)
  47. suite.Equal("CONNID", evt.StreamID())
  48. suite.WithinDuration(time.Now(), evt.Timestamp(), time.Second)
  49. suite.EqualValues(10, evt.Traffic)
  50. suite.True(evt.IsRead)
  51. })
  52. suite.connMock.On("Read", mock.Anything).Once().Return(10, nil)
  53. n, err := suite.conn.Read(make([]byte, 10))
  54. suite.NoError(err)
  55. suite.Equal(10, n)
  56. }
  57. func (suite *ConnTrafficTestSuite) TestReadErr() {
  58. suite.eventStreamMock.
  59. On("Send", mock.Anything, mock.Anything).
  60. Once().
  61. Run(func(args mock.Arguments) {
  62. evt := args.Get(1).(EventTraffic)
  63. suite.Equal("CONNID", evt.StreamID())
  64. suite.WithinDuration(time.Now(), evt.Timestamp(), time.Second)
  65. suite.EqualValues(10, evt.Traffic)
  66. suite.True(evt.IsRead)
  67. })
  68. suite.connMock.On("Read", mock.Anything).Once().Return(10, io.EOF)
  69. n, err := suite.conn.Read(make([]byte, 10))
  70. suite.True(errors.Is(err, io.EOF))
  71. suite.Equal(10, n)
  72. }
  73. func (suite *ConnTrafficTestSuite) TestReadNothingOk() {
  74. suite.connMock.On("Read", mock.Anything).Once().Return(0, nil)
  75. n, err := suite.conn.Read(make([]byte, 10))
  76. suite.NoError(err)
  77. suite.Equal(0, n)
  78. }
  79. func (suite *ConnTrafficTestSuite) TestReadNothingErr() {
  80. suite.connMock.On("Read", mock.Anything).Once().Return(0, io.EOF)
  81. n, err := suite.conn.Read(make([]byte, 10))
  82. suite.True(errors.Is(err, io.EOF))
  83. suite.Equal(0, n)
  84. }
  85. func (suite *ConnTrafficTestSuite) TestWriteOk() {
  86. suite.eventStreamMock.
  87. On("Send", mock.Anything, mock.Anything).
  88. Once().
  89. Run(func(args mock.Arguments) {
  90. evt := args.Get(1).(EventTraffic)
  91. suite.Equal("CONNID", evt.StreamID())
  92. suite.WithinDuration(time.Now(), evt.Timestamp(), time.Second)
  93. suite.EqualValues(10, evt.Traffic)
  94. suite.False(evt.IsRead)
  95. })
  96. suite.connMock.On("Write", mock.Anything).Once().Return(10, nil)
  97. n, err := suite.conn.Write(make([]byte, 10))
  98. suite.NoError(err)
  99. suite.Equal(10, n)
  100. }
  101. func (suite *ConnTrafficTestSuite) TestWriteErr() {
  102. suite.eventStreamMock.
  103. On("Send", mock.Anything, mock.Anything).
  104. Once().
  105. Run(func(args mock.Arguments) {
  106. evt := args.Get(1).(EventTraffic)
  107. suite.Equal("CONNID", evt.StreamID())
  108. suite.WithinDuration(time.Now(), evt.Timestamp(), time.Second)
  109. suite.EqualValues(10, evt.Traffic)
  110. suite.False(evt.IsRead)
  111. })
  112. suite.connMock.On("Write", mock.Anything).Once().Return(10, io.EOF)
  113. n, err := suite.conn.Write(make([]byte, 10))
  114. suite.True(errors.Is(err, io.EOF))
  115. suite.Equal(10, n)
  116. }
  117. func (suite *ConnTrafficTestSuite) TestWriteNothingOk() {
  118. suite.connMock.On("Write", mock.Anything).Once().Return(0, nil)
  119. n, err := suite.conn.Write(make([]byte, 10))
  120. suite.NoError(err)
  121. suite.Equal(0, n)
  122. }
  123. func (suite *ConnTrafficTestSuite) TestWriteNothingErr() {
  124. suite.connMock.On("Write", mock.Anything).Once().Return(0, io.EOF)
  125. n, err := suite.conn.Write(make([]byte, 10))
  126. suite.True(errors.Is(err, io.EOF))
  127. suite.Equal(0, n)
  128. }
  129. type ConnRewindTestSuite struct {
  130. suite.Suite
  131. connMock *ConnRewindBaseConn
  132. conn *connRewind
  133. }
  134. func (suite *ConnRewindTestSuite) SetupTest() {
  135. suite.connMock = &ConnRewindBaseConn{}
  136. suite.conn = newConnRewind(suite.connMock)
  137. }
  138. func (suite *ConnRewindTestSuite) TearDownTest() {
  139. suite.connMock.AssertExpectations(suite.T())
  140. }
  141. func (suite *ConnRewindTestSuite) TestRead() {
  142. suite.connMock.On("Read", mock.Anything)
  143. suite.connMock.readBuffer.Write([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
  144. buf := make([]byte, 2)
  145. n, err := suite.conn.Read(buf)
  146. suite.NoError(err)
  147. suite.Equal(2, n)
  148. suite.Equal([]byte{1, 2}, buf)
  149. n, err = suite.conn.Read(buf)
  150. suite.NoError(err)
  151. suite.Equal(2, n)
  152. suite.Equal([]byte{3, 4}, buf)
  153. suite.conn.Rewind()
  154. data, err := io.ReadAll(suite.conn)
  155. suite.NoError(err)
  156. suite.Equal([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, data)
  157. }
  158. func TestConnTraffic(t *testing.T) {
  159. t.Parallel()
  160. suite.Run(t, &ConnTrafficTestSuite{})
  161. }
  162. func TestConnRewind(t *testing.T) {
  163. t.Parallel()
  164. suite.Run(t, &ConnRewindTestSuite{})
  165. }