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.

echo_server_test.go 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package network_test
  2. import (
  3. "context"
  4. "io"
  5. "net"
  6. "sync"
  7. "github.com/stretchr/testify/require"
  8. "github.com/stretchr/testify/suite"
  9. )
  10. type EchoServer struct {
  11. wg sync.WaitGroup
  12. ctx context.Context
  13. ctxCancel context.CancelFunc
  14. listener net.Listener
  15. }
  16. func (e *EchoServer) Run() {
  17. e.wg.Go(func() {
  18. <-e.ctx.Done()
  19. e.listener.Close() //nolint: errcheck
  20. })
  21. e.wg.Go(func() {
  22. for {
  23. conn, err := e.listener.Accept()
  24. if err != nil {
  25. return
  26. }
  27. e.wg.Go(func() {
  28. <-e.ctx.Done()
  29. conn.Close() //nolint: errcheck
  30. })
  31. e.wg.Go(func() {
  32. e.process(conn)
  33. })
  34. }
  35. })
  36. }
  37. func (e *EchoServer) Stop() {
  38. e.ctxCancel()
  39. e.wg.Wait()
  40. }
  41. func (e *EchoServer) Addr() string {
  42. return e.listener.Addr().String()
  43. }
  44. func (e *EchoServer) process(conn io.ReadWriter) {
  45. buf := [4096]byte{}
  46. for {
  47. select {
  48. case <-e.ctx.Done():
  49. return
  50. default:
  51. }
  52. n, err := conn.Read(buf[:])
  53. if err != nil {
  54. return
  55. }
  56. select {
  57. case <-e.ctx.Done():
  58. return
  59. default:
  60. }
  61. if _, err = conn.Write(buf[:n]); err != nil {
  62. return
  63. }
  64. }
  65. }
  66. type EchoServerTestSuite struct {
  67. suite.Suite
  68. echoServer *EchoServer
  69. }
  70. func (suite *EchoServerTestSuite) SetupSuite() {
  71. ctx, cancel := context.WithCancel(context.Background())
  72. listener, err := net.Listen("tcp", "127.0.0.1:0")
  73. require.NoError(suite.T(), err)
  74. suite.echoServer = &EchoServer{
  75. ctx: ctx,
  76. ctxCancel: cancel,
  77. listener: listener,
  78. }
  79. suite.echoServer.Run()
  80. }
  81. func (suite *EchoServerTestSuite) TearDownSuite() {
  82. suite.echoServer.Stop()
  83. }
  84. func (suite *EchoServerTestSuite) EchoServerAddr() string {
  85. return suite.echoServer.Addr()
  86. }