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 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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 events.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.NewEventStart("connID", net.ParseIP("10.0.0.1"))
  33. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  34. v.
  35. On("EventStart", mock.Anything).
  36. Once().
  37. Run(func(args mock.Arguments) {
  38. caught, ok := args.Get(0).(mtglib.EventStart)
  39. suite.True(ok)
  40. suite.Equal(evt.RemoteIP.String(), caught.RemoteIP.String())
  41. suite.Equal(evt.StreamID(), caught.StreamID())
  42. suite.Equal(evt.Timestamp(), caught.Timestamp())
  43. })
  44. }
  45. suite.stream.Send(suite.ctx, evt)
  46. time.Sleep(100 * time.Millisecond)
  47. }
  48. func (suite *EventStreamTestSuite) TestEventConnectedToDC() {
  49. evt := mtglib.NewEventConnectedToDC("connID", net.ParseIP("10.0.0.1"), 3)
  50. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  51. v.
  52. On("EventConnectedToDC", mock.Anything).
  53. Once().
  54. Run(func(args mock.Arguments) {
  55. caught, ok := args.Get(0).(mtglib.EventConnectedToDC)
  56. suite.True(ok)
  57. suite.Equal(evt.RemoteIP.String(), caught.RemoteIP.String())
  58. suite.Equal(evt.StreamID(), caught.StreamID())
  59. suite.Equal(evt.DC, caught.DC)
  60. suite.Equal(evt.Timestamp(), caught.Timestamp())
  61. })
  62. }
  63. suite.stream.Send(suite.ctx, evt)
  64. time.Sleep(100 * time.Millisecond)
  65. }
  66. func (suite *EventStreamTestSuite) TestEventDomainFronting() {
  67. evt := mtglib.NewEventDomainFronting("connID")
  68. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  69. v.
  70. On("EventDomainFronting", mock.Anything).
  71. Once().
  72. Run(func(args mock.Arguments) {
  73. caught, ok := args.Get(0).(mtglib.EventDomainFronting)
  74. suite.True(ok)
  75. suite.Equal(evt.StreamID(), caught.StreamID())
  76. suite.Equal(evt.Timestamp(), caught.Timestamp())
  77. })
  78. }
  79. suite.stream.Send(suite.ctx, evt)
  80. time.Sleep(100 * time.Millisecond)
  81. }
  82. func (suite *EventStreamTestSuite) TestEventTraffic() {
  83. evt := mtglib.NewEventTraffic("connID", 1024, true)
  84. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  85. v.
  86. On("EventTraffic", mock.Anything).
  87. Once().
  88. Run(func(args mock.Arguments) {
  89. caught, ok := args.Get(0).(mtglib.EventTraffic)
  90. suite.True(ok)
  91. suite.Equal(evt.StreamID(), caught.StreamID())
  92. suite.Equal(evt.Timestamp(), caught.Timestamp())
  93. suite.Equal(evt.Traffic, caught.Traffic)
  94. suite.Equal(evt.IsRead, caught.IsRead)
  95. })
  96. }
  97. suite.stream.Send(suite.ctx, evt)
  98. time.Sleep(100 * time.Millisecond)
  99. }
  100. func (suite *EventStreamTestSuite) TestEventFinish() {
  101. evt := mtglib.NewEventFinish("connID")
  102. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  103. v.
  104. On("EventFinish", mock.Anything).
  105. Once().
  106. Run(func(args mock.Arguments) {
  107. caught, ok := args.Get(0).(mtglib.EventFinish)
  108. suite.True(ok)
  109. suite.Equal(evt.StreamID(), caught.StreamID())
  110. suite.Equal(evt.Timestamp(), caught.Timestamp())
  111. })
  112. }
  113. suite.stream.Send(suite.ctx, evt)
  114. time.Sleep(100 * time.Millisecond)
  115. }
  116. func (suite *EventStreamTestSuite) TestEventConcurrencyLimited() {
  117. evt := mtglib.NewEventConcurrencyLimited()
  118. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  119. v.
  120. On("EventConcurrencyLimited", mock.Anything).
  121. Once().
  122. Run(func(args mock.Arguments) {
  123. caught, ok := args.Get(0).(mtglib.EventConcurrencyLimited)
  124. suite.True(ok)
  125. suite.Equal(evt.Timestamp(), caught.Timestamp())
  126. suite.Empty(evt.StreamID())
  127. })
  128. }
  129. suite.stream.Send(suite.ctx, evt)
  130. time.Sleep(100 * time.Millisecond)
  131. }
  132. func (suite *EventStreamTestSuite) TestEventIPBlocklisted() {
  133. evt := mtglib.NewEventIPBlocklisted(net.ParseIP("10.0.0.10"))
  134. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  135. v.
  136. On("EventIPBlocklisted", mock.Anything).
  137. Once().
  138. Run(func(args mock.Arguments) {
  139. caught, ok := args.Get(0).(mtglib.EventIPBlocklisted)
  140. suite.True(ok)
  141. suite.Equal(evt.StreamID(), caught.StreamID())
  142. suite.Equal(evt.Timestamp(), caught.Timestamp())
  143. suite.Equal(evt.RemoteIP.String(), caught.RemoteIP.String())
  144. })
  145. }
  146. suite.stream.Send(suite.ctx, evt)
  147. time.Sleep(100 * time.Millisecond)
  148. }
  149. func (suite *EventStreamTestSuite) TestEventReplayAttack() {
  150. evt := mtglib.NewEventReplayAttack("CONNID")
  151. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  152. v.
  153. On("EventReplayAttack", mock.Anything).
  154. Once().
  155. Run(func(args mock.Arguments) {
  156. caught, ok := args.Get(0).(mtglib.EventReplayAttack)
  157. suite.True(ok)
  158. suite.Equal(evt.StreamID(), caught.StreamID())
  159. suite.Equal(evt.Timestamp(), caught.Timestamp())
  160. })
  161. }
  162. suite.stream.Send(suite.ctx, evt)
  163. time.Sleep(100 * time.Millisecond)
  164. }
  165. func (suite *EventStreamTestSuite) TestEventIPListSize() {
  166. evt := mtglib.NewEventIPListSize(10, true)
  167. for _, v := range []*ObserverMock{suite.observerMock1, suite.observerMock2} {
  168. v.
  169. On("EventIPListSize", mock.Anything).
  170. Once().
  171. Run(func(args mock.Arguments) {
  172. caught, ok := args.Get(0).(mtglib.EventIPListSize)
  173. suite.True(ok)
  174. suite.Equal(evt.Timestamp(), caught.Timestamp())
  175. suite.Equal(evt.Size, caught.Size)
  176. suite.Equal(evt.IsBlockList, caught.IsBlockList)
  177. })
  178. }
  179. suite.stream.Send(suite.ctx, evt)
  180. time.Sleep(100 * time.Millisecond)
  181. }
  182. func (suite *EventStreamTestSuite) TearDownTest() {
  183. suite.stream.Shutdown()
  184. suite.ctxCancel()
  185. time.Sleep(100 * time.Millisecond)
  186. suite.observerMock1.AssertExpectations(suite.T())
  187. suite.observerMock2.AssertExpectations(suite.T())
  188. }
  189. func TestEventStream(t *testing.T) {
  190. t.Parallel()
  191. suite.Run(t, &EventStreamTestSuite{})
  192. }