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

statsd_test.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package stats_test
  2. import (
  3. "bytes"
  4. "net"
  5. "strings"
  6. "testing"
  7. "time"
  8. "github.com/9seconds/mtg/v2/events"
  9. "github.com/9seconds/mtg/v2/mtglib"
  10. "github.com/9seconds/mtg/v2/stats"
  11. statsd "github.com/smira/go-statsd"
  12. "github.com/stretchr/testify/suite"
  13. )
  14. const statsdSleepTime = 3 * statsd.DefaultFlushInterval
  15. type statsdFakeServer struct {
  16. conn *net.UDPConn
  17. buf *bytes.Buffer
  18. }
  19. func (s statsdFakeServer) Addr() string {
  20. return s.conn.LocalAddr().String()
  21. }
  22. func (s statsdFakeServer) Close() error {
  23. if s.conn != nil {
  24. return s.conn.Close()
  25. }
  26. return nil
  27. }
  28. func (s statsdFakeServer) String() string {
  29. return strings.TrimSpace(s.buf.String())
  30. }
  31. func statsdNewFakeServer() statsdFakeServer {
  32. conn, err := net.ListenUDP("udp", &net.UDPAddr{
  33. IP: net.ParseIP("127.0.0.1"),
  34. Port: 0,
  35. })
  36. if err != nil {
  37. panic(err)
  38. }
  39. buf := &bytes.Buffer{}
  40. go func() {
  41. currentBuffer := make([]byte, 4096)
  42. for {
  43. n, _, err := conn.ReadFromUDP(currentBuffer)
  44. if n > 0 {
  45. buf.Write(currentBuffer[:n])
  46. }
  47. if err != nil {
  48. return
  49. }
  50. }
  51. }()
  52. return statsdFakeServer{
  53. conn: conn,
  54. buf: buf,
  55. }
  56. }
  57. type StatsdTestSuite struct {
  58. suite.Suite
  59. statsdServer statsdFakeServer
  60. factory stats.StatsdFactory
  61. statsd events.Observer
  62. }
  63. func (suite *StatsdTestSuite) SetupTest() {
  64. suite.statsdServer = statsdNewFakeServer()
  65. factory, err := stats.NewStatsd(suite.statsdServer.Addr(), "mtg.", "datadog")
  66. if err != nil {
  67. panic(err)
  68. }
  69. suite.factory = factory
  70. suite.statsd = suite.factory.Make()
  71. }
  72. func (suite *StatsdTestSuite) TearDownTest() {
  73. suite.statsd.Shutdown()
  74. suite.factory.Close()
  75. suite.statsdServer.Close()
  76. }
  77. func (suite *StatsdTestSuite) TestEventStartFinish() {
  78. suite.statsd.EventStart(mtglib.EventStart{
  79. CreatedAt: time.Now(),
  80. ConnID: "connID",
  81. RemoteIP: net.ParseIP("10.0.0.10"),
  82. })
  83. time.Sleep(statsdSleepTime)
  84. suite.Equal("mtg.active_connections:+1|g|#ip_type:ipv4", suite.statsdServer.String())
  85. suite.statsd.EventFinish(mtglib.EventFinish{
  86. CreatedAt: time.Now(),
  87. ConnID: "connID",
  88. })
  89. time.Sleep(statsdSleepTime)
  90. suite.Contains(suite.statsdServer.String(), "mtg.session_duration")
  91. }
  92. func (suite *StatsdTestSuite) TestEventConcurrencyLimited() {
  93. suite.statsd.EventConcurrencyLimited(mtglib.EventConcurrencyLimited{
  94. CreatedAt: time.Now(),
  95. })
  96. time.Sleep(statsdSleepTime)
  97. suite.Equal("mtg.concurrency_limited:1|c", suite.statsdServer.String())
  98. }
  99. func (suite *StatsdTestSuite) TestEventIPBlocklisted() {
  100. suite.statsd.EventIPBlocklisted(mtglib.EventIPBlocklisted{
  101. CreatedAt: time.Now(),
  102. RemoteIP: net.ParseIP("10.0.0.10"),
  103. })
  104. time.Sleep(statsdSleepTime)
  105. suite.Equal("mtg.ip_blocklisted:1|c|#ip_type:ipv4", suite.statsdServer.String())
  106. }
  107. func TestStatsd(t *testing.T) {
  108. t.Parallel()
  109. suite.Run(t, &StatsdTestSuite{})
  110. }