mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-16 15:16:44 +00:00
fix(GODT-2827): Restore ticker to event poller
This commit is contained in:
@ -84,6 +84,11 @@ func TestBridge_Refresh(t *testing.T) {
|
|||||||
withBridge(ctx, t, s.GetHostURL(), netCtl, locator, storeKey, func(b *bridge.Bridge, mocks *bridge.Mocks) {
|
withBridge(ctx, t, s.GetHostURL(), netCtl, locator, storeKey, func(b *bridge.Bridge, mocks *bridge.Mocks) {
|
||||||
mocks.Reporter.EXPECT().ReportMessageWithContext(gomock.Any(), gomock.Any()).AnyTimes()
|
mocks.Reporter.EXPECT().ReportMessageWithContext(gomock.Any(), gomock.Any()).AnyTimes()
|
||||||
|
|
||||||
|
// Wait for refresh event first
|
||||||
|
refreshCh, refreshChDone := chToType[events.Event, events.UserRefreshed](b.GetEvents(events.UserRefreshed{}))
|
||||||
|
defer refreshChDone()
|
||||||
|
require.Equal(t, userID, (<-refreshCh).UserID)
|
||||||
|
// Then sync event
|
||||||
syncCh, done := chToType[events.Event, events.SyncFinished](b.GetEvents(events.SyncFinished{}))
|
syncCh, done := chToType[events.Event, events.SyncFinished](b.GetEvents(events.SyncFinished{}))
|
||||||
defer done()
|
defer done()
|
||||||
|
|
||||||
|
|||||||
@ -52,7 +52,7 @@ type Service struct {
|
|||||||
eventIDStore EventIDStore
|
eventIDStore EventIDStore
|
||||||
log *logrus.Entry
|
log *logrus.Entry
|
||||||
eventPublisher events.EventPublisher
|
eventPublisher events.EventPublisher
|
||||||
timer *time.Ticker
|
timer *proton.Ticker
|
||||||
eventTimeout time.Duration
|
eventTimeout time.Duration
|
||||||
paused uint32
|
paused uint32
|
||||||
panicHandler async.PanicHandler
|
panicHandler async.PanicHandler
|
||||||
@ -74,6 +74,7 @@ func NewService(
|
|||||||
store EventIDStore,
|
store EventIDStore,
|
||||||
eventPublisher events.EventPublisher,
|
eventPublisher events.EventPublisher,
|
||||||
pollPeriod time.Duration,
|
pollPeriod time.Duration,
|
||||||
|
jitter time.Duration,
|
||||||
eventTimeout time.Duration,
|
eventTimeout time.Duration,
|
||||||
panicHandler async.PanicHandler,
|
panicHandler async.PanicHandler,
|
||||||
) *Service {
|
) *Service {
|
||||||
@ -86,7 +87,7 @@ func NewService(
|
|||||||
"user": userID,
|
"user": userID,
|
||||||
}),
|
}),
|
||||||
eventPublisher: eventPublisher,
|
eventPublisher: eventPublisher,
|
||||||
timer: time.NewTicker(pollPeriod),
|
timer: proton.NewTicker(pollPeriod, jitter, panicHandler),
|
||||||
paused: 1,
|
paused: 1,
|
||||||
eventTimeout: eventTimeout,
|
eventTimeout: eventTimeout,
|
||||||
panicHandler: panicHandler,
|
panicHandler: panicHandler,
|
||||||
@ -209,7 +210,7 @@ func (s *Service) Start(ctx context.Context, group *orderedtasks.OrderedCancelGr
|
|||||||
|
|
||||||
func (s *Service) run(ctx context.Context, lastEventID string) {
|
func (s *Service) run(ctx context.Context, lastEventID string) {
|
||||||
s.log.Infof("Starting service Last EventID=%v", lastEventID)
|
s.log.Infof("Starting service Last EventID=%v", lastEventID)
|
||||||
defer s.close()
|
defer s.timer.Stop()
|
||||||
defer s.log.Info("Exiting service")
|
defer s.log.Info("Exiting service")
|
||||||
defer s.Close()
|
defer s.Close()
|
||||||
|
|
||||||
@ -488,10 +489,6 @@ func (s *Service) removeSubscription(subscription Subscription) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) close() {
|
|
||||||
s.timer.Stop()
|
|
||||||
}
|
|
||||||
|
|
||||||
type pendingOp int
|
type pendingOp int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@ -39,7 +39,16 @@ func TestServiceHandleEventError_SubscriberEventUnwrapping(t *testing.T) {
|
|||||||
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
||||||
eventIDStore := NewInMemoryEventIDStore()
|
eventIDStore := NewInMemoryEventIDStore()
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
lastEventID := "PrevEvent"
|
lastEventID := "PrevEvent"
|
||||||
event := proton.Event{EventID: "MyEvent"}
|
event := proton.Event{EventID: "MyEvent"}
|
||||||
@ -67,7 +76,16 @@ func TestServiceHandleEventError_BadEventPutsServiceOnPause(t *testing.T) {
|
|||||||
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
||||||
eventIDStore := NewInMemoryEventIDStore()
|
eventIDStore := NewInMemoryEventIDStore()
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
service.Resume()
|
service.Resume()
|
||||||
lastEventID := "PrevEvent"
|
lastEventID := "PrevEvent"
|
||||||
event := proton.Event{EventID: "MyEvent"}
|
event := proton.Event{EventID: "MyEvent"}
|
||||||
@ -91,7 +109,16 @@ func TestServiceHandleEventError_BadEventFromPublishTimeout(t *testing.T) {
|
|||||||
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
||||||
eventIDStore := NewInMemoryEventIDStore()
|
eventIDStore := NewInMemoryEventIDStore()
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
lastEventID := "PrevEvent"
|
lastEventID := "PrevEvent"
|
||||||
event := proton.Event{EventID: "MyEvent"}
|
event := proton.Event{EventID: "MyEvent"}
|
||||||
err := ErrPublishTimeoutExceeded
|
err := ErrPublishTimeoutExceeded
|
||||||
@ -112,7 +139,16 @@ func TestServiceHandleEventError_NoBadEventCheck(t *testing.T) {
|
|||||||
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
||||||
eventIDStore := NewInMemoryEventIDStore()
|
eventIDStore := NewInMemoryEventIDStore()
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
lastEventID := "PrevEvent"
|
lastEventID := "PrevEvent"
|
||||||
event := proton.Event{EventID: "MyEvent"}
|
event := proton.Event{EventID: "MyEvent"}
|
||||||
_, _ = service.handleEventError(context.Background(), lastEventID, event, context.Canceled)
|
_, _ = service.handleEventError(context.Background(), lastEventID, event, context.Canceled)
|
||||||
@ -128,7 +164,16 @@ func TestServiceHandleEventError_JsonUnmarshalEventProducesUncategorizedErrorEve
|
|||||||
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
eventPublisher := mocks.NewMockEventPublisher(mockCtrl)
|
||||||
eventIDStore := NewInMemoryEventIDStore()
|
eventIDStore := NewInMemoryEventIDStore()
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
lastEventID := "PrevEvent"
|
lastEventID := "PrevEvent"
|
||||||
event := proton.Event{EventID: "MyEvent"}
|
event := proton.Event{EventID: "MyEvent"}
|
||||||
err := &json.UnmarshalTypeError{}
|
err := &json.UnmarshalTypeError{}
|
||||||
|
|||||||
@ -58,7 +58,16 @@ func TestServiceHandleEvent_CheckEventCategoriesHandledInOrder(t *testing.T) {
|
|||||||
secondRefreshHandler := NewMockRefreshSubscriber(mockCtrl)
|
secondRefreshHandler := NewMockRefreshSubscriber(mockCtrl)
|
||||||
secondRefreshHandler.EXPECT().handle(gomock.Any(), gomock.Any()).After(userSpaceCall).Times(1).Return(nil)
|
secondRefreshHandler.EXPECT().handle(gomock.Any(), gomock.Any()).After(userSpaceCall).Times(1).Return(nil)
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
service.addSubscription(Subscription{
|
service.addSubscription(Subscription{
|
||||||
User: userHandler,
|
User: userHandler,
|
||||||
@ -106,7 +115,16 @@ func TestServiceHandleEvent_CheckEventFailureCausesError(t *testing.T) {
|
|||||||
|
|
||||||
messageHandler := NewMockMessageSubscriber(mockCtrl)
|
messageHandler := NewMockMessageSubscriber(mockCtrl)
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
service.addSubscription(Subscription{
|
service.addSubscription(Subscription{
|
||||||
Address: addressHandler,
|
Address: addressHandler,
|
||||||
@ -133,7 +151,16 @@ func TestServiceHandleEvent_CheckEventFailureCausesErrorParallel(t *testing.T) {
|
|||||||
addressHandler2 := NewMockAddressSubscriber(mockCtrl)
|
addressHandler2 := NewMockAddressSubscriber(mockCtrl)
|
||||||
addressHandler2.EXPECT().handle(gomock.Any(), gomock.Any()).MaxTimes(1).Return(nil)
|
addressHandler2.EXPECT().handle(gomock.Any(), gomock.Any()).MaxTimes(1).Return(nil)
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
service.addSubscription(Subscription{
|
service.addSubscription(Subscription{
|
||||||
Address: addressHandler,
|
Address: addressHandler,
|
||||||
@ -173,7 +200,16 @@ func TestServiceHandleEvent_SubscriberTimeout(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}).MaxTimes(1)
|
}).MaxTimes(1)
|
||||||
|
|
||||||
service := NewService("foo", &NullEventSource{}, eventIDStore, eventPublisher, 100*time.Millisecond, 500*time.Millisecond, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
&NullEventSource{},
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
100*time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
500*time.Millisecond,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
service.addSubscription(Subscription{
|
service.addSubscription(Subscription{
|
||||||
Address: addressHandler,
|
Address: addressHandler,
|
||||||
|
|||||||
@ -66,7 +66,16 @@ func TestService_EventIDLoadStore(t *testing.T) {
|
|||||||
eventSource.EXPECT().GetLatestEventID(gomock.Any()).Times(1).Return(firstEventID, nil)
|
eventSource.EXPECT().GetLatestEventID(gomock.Any()).Times(1).Return(firstEventID, nil)
|
||||||
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(firstEventID)).MinTimes(1).Return(secondEvent, false, nil)
|
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(firstEventID)).MinTimes(1).Return(secondEvent, false, nil)
|
||||||
|
|
||||||
service := NewService("foo", eventSource, eventIDStore, eventPublisher, 1*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
eventSource,
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
require.NoError(t, service.Start(context.Background(), group))
|
require.NoError(t, service.Start(context.Background(), group))
|
||||||
service.Resume()
|
service.Resume()
|
||||||
group.Wait()
|
group.Wait()
|
||||||
@ -110,7 +119,16 @@ func TestService_RetryEventOnNonCatastrophicFailure(t *testing.T) {
|
|||||||
subscriber.EXPECT().handle(gomock.Any(), gomock.Eq(messageEvents)).After(firstCall).Times(1).Return(nil)
|
subscriber.EXPECT().handle(gomock.Any(), gomock.Eq(messageEvents)).After(firstCall).Times(1).Return(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
service := NewService("foo", eventSource, eventIDStore, eventPublisher, 1*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
eventSource,
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
service.Subscribe(Subscription{Messages: subscriber})
|
service.Subscribe(Subscription{Messages: subscriber})
|
||||||
|
|
||||||
require.NoError(t, service.Start(context.Background(), group))
|
require.NoError(t, service.Start(context.Background(), group))
|
||||||
@ -149,7 +167,16 @@ func TestService_OnBadEventServiceIsPaused(t *testing.T) {
|
|||||||
subscriber.EXPECT().name().AnyTimes().Return("Foo")
|
subscriber.EXPECT().name().AnyTimes().Return("Foo")
|
||||||
subscriber.EXPECT().handle(gomock.Any(), gomock.Eq(messageEvents)).Times(1).Return(badEventErr)
|
subscriber.EXPECT().handle(gomock.Any(), gomock.Eq(messageEvents)).Times(1).Return(badEventErr)
|
||||||
|
|
||||||
service := NewService("foo", eventSource, eventIDStore, eventPublisher, 1*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
eventSource,
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
// Event publisher expectations.
|
// Event publisher expectations.
|
||||||
eventPublisher.EXPECT().PublishEvent(gomock.Any(), events.UserBadEvent{
|
eventPublisher.EXPECT().PublishEvent(gomock.Any(), events.UserBadEvent{
|
||||||
@ -203,7 +230,16 @@ func TestService_UnsubscribeDuringEventHandlingDoesNotCauseDeadlock(t *testing.T
|
|||||||
// Event Source expectations.
|
// Event Source expectations.
|
||||||
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(firstEventID)).MinTimes(1).Return(secondEvent, false, nil)
|
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(firstEventID)).MinTimes(1).Return(secondEvent, false, nil)
|
||||||
|
|
||||||
service := NewService("foo", eventSource, eventIDStore, eventPublisher, 1*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
eventSource,
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
// Subscriber expectations.
|
// Subscriber expectations.
|
||||||
subscriber.EXPECT().name().AnyTimes().Return("Foo")
|
subscriber.EXPECT().name().AnyTimes().Return("Foo")
|
||||||
@ -252,7 +288,16 @@ func TestService_UnsubscribeBeforeHandlingEventIsNotConsideredError(t *testing.T
|
|||||||
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(firstEventID)).MinTimes(1).Return(secondEvent, false, nil)
|
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(firstEventID)).MinTimes(1).Return(secondEvent, false, nil)
|
||||||
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(secondEventID)).AnyTimes().Return(secondEvent, false, nil)
|
eventSource.EXPECT().GetEvent(gomock.Any(), gomock.Eq(secondEventID)).AnyTimes().Return(secondEvent, false, nil)
|
||||||
|
|
||||||
service := NewService("foo", eventSource, eventIDStore, eventPublisher, 1*time.Millisecond, time.Second, async.NoopPanicHandler{})
|
service := NewService(
|
||||||
|
"foo",
|
||||||
|
eventSource,
|
||||||
|
eventIDStore,
|
||||||
|
eventPublisher,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Millisecond,
|
||||||
|
time.Second,
|
||||||
|
async.NoopPanicHandler{},
|
||||||
|
)
|
||||||
|
|
||||||
// start subscriber
|
// start subscriber
|
||||||
group.Go(context.Background(), "", "", func(_ context.Context) {
|
group.Go(context.Background(), "", "", func(_ context.Context) {
|
||||||
|
|||||||
@ -206,6 +206,7 @@ func newImpl(
|
|||||||
userevents.NewVaultEventIDStore(encVault),
|
userevents.NewVaultEventIDStore(encVault),
|
||||||
user,
|
user,
|
||||||
EventPeriod,
|
EventPeriod,
|
||||||
|
EventJitter,
|
||||||
5*time.Minute,
|
5*time.Minute,
|
||||||
crashHandler,
|
crashHandler,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user