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

telegram_internal_test.go 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package telegram
  2. import (
  3. "context"
  4. "errors"
  5. "io"
  6. "net"
  7. "strconv"
  8. "testing"
  9. "github.com/9seconds/mtg/v2/internal/testlib"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/mock"
  12. "github.com/stretchr/testify/suite"
  13. )
  14. type TelegramTestSuite struct {
  15. suite.Suite
  16. dialerMock *testlib.MtglibNetworkMock
  17. t *Telegram
  18. }
  19. func (suite *TelegramTestSuite) SetupTest() {
  20. suite.dialerMock = &testlib.MtglibNetworkMock{}
  21. suite.t, _ = New(suite.dialerMock, "prefer-ipv4", false)
  22. }
  23. func (suite *TelegramTestSuite) TearDownTest() {
  24. suite.dialerMock.AssertExpectations(suite.T())
  25. }
  26. func (suite *TelegramTestSuite) TestUnknownDC() {
  27. testData := []int{
  28. -1,
  29. 0,
  30. 6,
  31. 100,
  32. }
  33. for _, v := range testData {
  34. value := v
  35. suite.T().Run(strconv.Itoa(value), func(t *testing.T) {
  36. _, err := suite.t.Dial(context.Background(), value)
  37. assert.Error(t, err)
  38. assert.False(t, suite.t.IsKnownDC(value))
  39. })
  40. }
  41. }
  42. func (suite *TelegramTestSuite) TestDialToCorrectIPs() {
  43. testData := map[int][]tgAddr{}
  44. for i := 1; i <= 5; i++ {
  45. testData[i] = []tgAddr{}
  46. testData[i] = append(testData[i], productionV4Addresses[i-1]...)
  47. testData[i] = append(testData[i], productionV6Addresses[i-1]...)
  48. }
  49. for i, v := range testData {
  50. idx := i
  51. addresses := v
  52. suite.T().Run(strconv.Itoa(idx), func(t *testing.T) {
  53. for _, addr := range addresses {
  54. suite.dialerMock.
  55. On("DialContext", mock.Anything, addr.network, addr.address).
  56. Once().
  57. Return((*net.TCPConn)(nil), io.EOF)
  58. }
  59. _, err := suite.t.Dial(context.Background(), idx)
  60. assert.True(t, errors.Is(err, io.EOF))
  61. assert.True(t, suite.t.IsKnownDC(idx))
  62. })
  63. }
  64. }
  65. func (suite *TelegramTestSuite) TestDialPreferIPRange() {
  66. testData := map[string][]tgAddr{
  67. "prefer-ipv4": {testV4Addresses[0][0], testV6Addresses[0][0]},
  68. "prefer-ipv6": {testV6Addresses[0][0], testV4Addresses[0][0]},
  69. "only-ipv4": {testV4Addresses[0][0]},
  70. "only-ipv6": {testV6Addresses[0][0]},
  71. }
  72. for k, v := range testData {
  73. name := k
  74. addresses := v
  75. suite.T().Run(name, func(t *testing.T) {
  76. for _, addr := range addresses {
  77. suite.dialerMock.
  78. On("DialContext", mock.Anything, addr.network, addr.address).
  79. Once().
  80. Return((*net.TCPConn)(nil), io.EOF)
  81. }
  82. tg, _ := New(suite.dialerMock, name, true)
  83. _, err := tg.Dial(context.Background(), 1)
  84. assert.True(t, errors.Is(err, io.EOF))
  85. })
  86. }
  87. }
  88. func (suite *TelegramTestSuite) TestDialPreferIPPriority() {
  89. testData := map[string]tgAddr{
  90. "prefer-ipv4": productionV4Addresses[0][0],
  91. "prefer-ipv6": productionV6Addresses[0][0],
  92. }
  93. for k, v := range testData {
  94. name := k
  95. addr := v
  96. suite.T().Run(name, func(t *testing.T) {
  97. conn := &net.TCPConn{}
  98. suite.dialerMock.
  99. On("DialContext", mock.Anything, addr.network, addr.address).
  100. Once().
  101. Return(conn, nil)
  102. tg, _ := New(suite.dialerMock, name, false)
  103. res, err := tg.Dial(context.Background(), 1)
  104. assert.NoError(t, err)
  105. assert.Equal(t, conn, res)
  106. })
  107. }
  108. }
  109. func (suite *TelegramTestSuite) TestUnknownPreferIP() {
  110. _, err := New(suite.dialerMock, "xxx", false)
  111. suite.Error(err)
  112. }
  113. func (suite *TelegramTestSuite) TestFallbackDC() {
  114. dcs := make([]int, 10)
  115. for i := 0; i < len(dcs); i++ {
  116. dcs[i] = suite.t.GetFallbackDC()
  117. }
  118. for _, v := range dcs {
  119. value := v
  120. suite.T().Run(strconv.Itoa(value), func(t *testing.T) {
  121. assert.True(t, suite.t.IsKnownDC(value))
  122. })
  123. }
  124. }
  125. func TestTelegram(t *testing.T) {
  126. t.Parallel()
  127. suite.Run(t, &TelegramTestSuite{})
  128. }