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 kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

conn_internal_test.go 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package relay
  2. import (
  3. "context"
  4. "errors"
  5. "io"
  6. "testing"
  7. "github.com/9seconds/mtg/v2/internal/testlib"
  8. "github.com/stretchr/testify/mock"
  9. "github.com/stretchr/testify/suite"
  10. )
  11. type ConnTestSuite struct {
  12. suite.Suite
  13. ctxCancel context.CancelFunc
  14. connMock *testlib.NetConnMock
  15. tickChannel chan struct{}
  16. buf []byte
  17. c conn
  18. }
  19. func (suite *ConnTestSuite) SetupTest() {
  20. ctx, cancel := context.WithCancel(context.Background())
  21. suite.tickChannel = make(chan struct{}, 1)
  22. suite.connMock = &testlib.NetConnMock{}
  23. suite.ctxCancel = cancel
  24. suite.buf = make([]byte, 5)
  25. suite.c = conn{
  26. ReadWriteCloser: suite.connMock,
  27. ctx: ctx,
  28. tickChannel: suite.tickChannel,
  29. }
  30. }
  31. func (suite *ConnTestSuite) TestReadOk() {
  32. suite.connMock.On("Read", mock.Anything).Once().Return(len(suite.buf), nil)
  33. n, err := suite.c.Read(suite.buf)
  34. suite.NoError(err)
  35. suite.Equal(len(suite.buf), n)
  36. select {
  37. case <-suite.tickChannel:
  38. default:
  39. suite.FailNow("cannot find a tick event")
  40. }
  41. }
  42. func (suite *ConnTestSuite) TestReadErr() {
  43. suite.connMock.On("Read", mock.Anything).Once().Return(0, io.EOF)
  44. _, err := suite.c.Read(suite.buf)
  45. suite.True(errors.Is(err, io.EOF))
  46. select {
  47. case <-suite.tickChannel:
  48. default:
  49. suite.FailNow("cannot find a tick event")
  50. }
  51. }
  52. func (suite *ConnTestSuite) TestReadContextDone() {
  53. suite.connMock.On("Read", mock.Anything).Once().Return(len(suite.buf), nil)
  54. suite.ctxCancel()
  55. suite.tickChannel <- struct{}{}
  56. suite.c.Read(suite.buf) // nolint: errcheck
  57. }
  58. func (suite *ConnTestSuite) TestWriteOk() {
  59. suite.connMock.On("Write", mock.Anything).Once().Return(len(suite.buf), nil)
  60. n, err := suite.c.Write(suite.buf)
  61. suite.NoError(err)
  62. suite.Equal(len(suite.buf), n)
  63. select {
  64. case <-suite.tickChannel:
  65. default:
  66. suite.FailNow("cannot find a tick event")
  67. }
  68. }
  69. func (suite *ConnTestSuite) TestWriteErr() {
  70. suite.connMock.On("Write", mock.Anything).Once().Return(0, io.EOF)
  71. _, err := suite.c.Write(suite.buf)
  72. suite.True(errors.Is(err, io.EOF))
  73. select {
  74. case <-suite.tickChannel:
  75. default:
  76. suite.FailNow("cannot find a tick event")
  77. }
  78. }
  79. func (suite *ConnTestSuite) TestWriteContextDone() {
  80. suite.connMock.On("Write", mock.Anything).Once().Return(len(suite.buf), nil)
  81. suite.ctxCancel()
  82. suite.tickChannel <- struct{}{}
  83. suite.c.Write(suite.buf) // nolint: errcheck
  84. }
  85. func (suite *ConnTestSuite) TearDownTest() {
  86. select {
  87. case <-suite.tickChannel:
  88. default:
  89. }
  90. close(suite.tickChannel)
  91. suite.connMock.AssertExpectations(suite.T())
  92. }
  93. func TestConn(t *testing.T) {
  94. t.Parallel()
  95. suite.Run(t, &ConnTestSuite{})
  96. }