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
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

conns_internal_test.go 5.1KB

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