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

event_stream_test.go 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package events_test
  2. import (
  3. "context"
  4. "net"
  5. "testing"
  6. "time"
  7. "github.com/9seconds/mtg/v2/events"
  8. "github.com/9seconds/mtg/v2/mtglib"
  9. "github.com/stretchr/testify/mock"
  10. "github.com/stretchr/testify/suite"
  11. )
  12. type EventStreamTestSuite struct {
  13. suite.Suite
  14. ctx context.Context
  15. ctxCancel context.CancelFunc
  16. observerMock1 *ObserverMock
  17. observerMock2 *ObserverMock
  18. stream mtglib.EventStream
  19. }
  20. func (suite *EventStreamTestSuite) SetupTest() {
  21. suite.ctx, suite.ctxCancel = context.WithCancel(context.Background())
  22. suite.observerMock1 = &ObserverMock{}
  23. suite.observerMock2 = &ObserverMock{}
  24. suite.observerMock1.On("Shutdown")
  25. suite.observerMock2.On("Shutdown")
  26. factories := make([]events.ObserverFactory, 2)
  27. factories[0] = func() events.Observer { return suite.observerMock1 }
  28. factories[1] = func() events.Observer { return suite.observerMock2 }
  29. suite.stream = events.NewEventStream(factories)
  30. }
  31. func (suite *EventStreamTestSuite) TestEventStart() {
  32. evt := mtglib.EventStart{
  33. CreatedAt: time.Now(),
  34. ConnID: "connID",
  35. RemoteIP: net.ParseIP("10.0.0.1"),
  36. }
  37. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  38. v.
  39. On("EventStart", mock.Anything).
  40. Once().
  41. Run(func(args mock.Arguments) {
  42. caught := args.Get(0).(mtglib.EventStart)
  43. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  44. suite.Equal(evt.ConnID, caught.ConnID)
  45. suite.Equal(evt.RemoteIP.String(), caught.RemoteIP.String())
  46. suite.Equal(evt.StreamID(), caught.StreamID())
  47. })
  48. }
  49. suite.stream.Send(suite.ctx, evt)
  50. time.Sleep(100 * time.Millisecond)
  51. }
  52. func (suite *EventStreamTestSuite) TestEventConnectedToDC() {
  53. evt := mtglib.EventConnectedToDC{
  54. CreatedAt: time.Now(),
  55. ConnID: "connID",
  56. RemoteIP: net.ParseIP("10.0.0.1"),
  57. DC: 3,
  58. }
  59. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  60. v.
  61. On("EventConnectedToDC", mock.Anything).
  62. Once().
  63. Run(func(args mock.Arguments) {
  64. caught := args.Get(0).(mtglib.EventConnectedToDC)
  65. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  66. suite.Equal(evt.ConnID, caught.ConnID)
  67. suite.Equal(evt.RemoteIP.String(), caught.RemoteIP.String())
  68. suite.Equal(evt.StreamID(), caught.StreamID())
  69. suite.Equal(evt.DC, caught.DC)
  70. })
  71. }
  72. suite.stream.Send(suite.ctx, evt)
  73. time.Sleep(100 * time.Millisecond)
  74. }
  75. func (suite *EventStreamTestSuite) TestEventDomainFronting() {
  76. evt := mtglib.EventDomainFronting{
  77. CreatedAt: time.Now(),
  78. ConnID: "connID",
  79. }
  80. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  81. v.
  82. On("EventDomainFronting", mock.Anything).
  83. Once().
  84. Run(func(args mock.Arguments) {
  85. caught := args.Get(0).(mtglib.EventDomainFronting)
  86. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  87. suite.Equal(evt.ConnID, caught.ConnID)
  88. suite.Equal(evt.StreamID(), caught.StreamID())
  89. })
  90. }
  91. suite.stream.Send(suite.ctx, evt)
  92. time.Sleep(100 * time.Millisecond)
  93. }
  94. func (suite *EventStreamTestSuite) TestEventTraffic() {
  95. evt := mtglib.EventTraffic{
  96. CreatedAt: time.Now(),
  97. ConnID: "connID",
  98. Traffic: 1024,
  99. IsRead: true,
  100. }
  101. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  102. v.
  103. On("EventTraffic", mock.Anything).
  104. Once().
  105. Run(func(args mock.Arguments) {
  106. caught := args.Get(0).(mtglib.EventTraffic)
  107. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  108. suite.Equal(evt.ConnID, caught.ConnID)
  109. suite.Equal(evt.StreamID(), caught.StreamID())
  110. suite.Equal(evt.Traffic, caught.Traffic)
  111. suite.Equal(evt.IsRead, caught.IsRead)
  112. })
  113. }
  114. suite.stream.Send(suite.ctx, evt)
  115. time.Sleep(100 * time.Millisecond)
  116. }
  117. func (suite *EventStreamTestSuite) TestEventFinish() {
  118. evt := mtglib.EventFinish{
  119. CreatedAt: time.Now(),
  120. ConnID: "connID",
  121. }
  122. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  123. v.
  124. On("EventFinish", mock.Anything).
  125. Once().
  126. Run(func(args mock.Arguments) {
  127. caught := args.Get(0).(mtglib.EventFinish)
  128. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  129. suite.Equal(evt.ConnID, caught.ConnID)
  130. suite.Equal(evt.StreamID(), caught.StreamID())
  131. })
  132. }
  133. suite.stream.Send(suite.ctx, evt)
  134. time.Sleep(100 * time.Millisecond)
  135. }
  136. func (suite *EventStreamTestSuite) TestEventConcurrencyLimited() {
  137. evt := mtglib.EventConcurrencyLimited{
  138. CreatedAt: time.Now(),
  139. }
  140. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  141. v.
  142. On("EventConcurrencyLimited", mock.Anything).
  143. Once().
  144. Run(func(args mock.Arguments) {
  145. caught := args.Get(0).(mtglib.EventConcurrencyLimited)
  146. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  147. })
  148. }
  149. suite.stream.Send(suite.ctx, evt)
  150. time.Sleep(100 * time.Millisecond)
  151. }
  152. func (suite *EventStreamTestSuite) TestEventIPBlocklisted() {
  153. evt := mtglib.EventIPBlocklisted{
  154. CreatedAt: time.Now(),
  155. RemoteIP: net.ParseIP("10.0.0.10"),
  156. }
  157. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  158. v.
  159. On("EventIPBlocklisted", mock.Anything).
  160. Once().
  161. Run(func(args mock.Arguments) {
  162. caught := args.Get(0).(mtglib.EventIPBlocklisted)
  163. suite.Equal(evt.CreatedAt, caught.CreatedAt)
  164. suite.Equal(evt.StreamID(), caught.StreamID())
  165. suite.Equal(evt.RemoteIP.String(), caught.RemoteIP.String())
  166. })
  167. }
  168. suite.stream.Send(suite.ctx, evt)
  169. time.Sleep(100 * time.Millisecond)
  170. }
  171. func (suite *EventStreamTestSuite) TearDownTest() {
  172. suite.stream.Shutdown()
  173. suite.ctxCancel()
  174. time.Sleep(100 * time.Millisecond)
  175. suite.observerMock1.AssertExpectations(suite.T())
  176. suite.observerMock2.AssertExpectations(suite.T())
  177. }
  178. func TestEventStream(t *testing.T) {
  179. t.Parallel()
  180. suite.Run(t, &EventStreamTestSuite{})
  181. }