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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

event_stream_test.go 5.7KB

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