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.5KB

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