Fix of all known flaky tests
This commit is contained in:
@ -24,7 +24,6 @@ import (
|
||||
|
||||
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@ -54,10 +53,10 @@ func TestEventLoopProcessMoreEvents(t *testing.T) {
|
||||
}, nil),
|
||||
)
|
||||
m.newStoreNoEvents(true)
|
||||
m.client.EXPECT().ListMessages(gomock.Any()).Return([]*pmapi.Message{}, 0, nil).AnyTimes()
|
||||
|
||||
// Event loop runs in goroutine and will be stopped by deferred mock clearing.
|
||||
go m.store.eventLoop.start()
|
||||
// Event loop runs in goroutine started during store creation (newStoreNoEvents).
|
||||
// Force to run the next event.
|
||||
m.store.eventLoop.pollNow()
|
||||
|
||||
// More events are processed right away.
|
||||
require.Eventually(t, func() bool {
|
||||
@ -78,38 +77,42 @@ func TestEventLoopUpdateMessageFromLoop(t *testing.T) {
|
||||
subject := "old subject"
|
||||
newSubject := "new subject"
|
||||
|
||||
// First sync will add message with old subject to database.
|
||||
m.client.EXPECT().GetMessage("msg1").Return(&pmapi.Message{
|
||||
m.newStoreNoEvents(true, &pmapi.Message{
|
||||
ID: "msg1",
|
||||
Subject: subject,
|
||||
}, nil)
|
||||
// Event will update the subject.
|
||||
m.client.EXPECT().GetEvent("latestEventID").Return(&pmapi.Event{
|
||||
EventID: "event1",
|
||||
Messages: []*pmapi.EventMessage{{
|
||||
EventItem: pmapi.EventItem{
|
||||
ID: "msg1",
|
||||
Action: pmapi.EventUpdate,
|
||||
},
|
||||
Updated: &pmapi.EventMessageUpdated{
|
||||
ID: "msg1",
|
||||
Subject: &newSubject,
|
||||
},
|
||||
}},
|
||||
}, nil)
|
||||
})
|
||||
|
||||
m.newStoreNoEvents(true)
|
||||
eventReceived := make(chan struct{})
|
||||
m.client.EXPECT().GetEvent("latestEventID").DoAndReturn(func(eventID string) (*pmapi.Event, error) {
|
||||
defer close(eventReceived)
|
||||
return &pmapi.Event{
|
||||
EventID: "event1",
|
||||
Messages: []*pmapi.EventMessage{{
|
||||
EventItem: pmapi.EventItem{
|
||||
ID: "msg1",
|
||||
Action: pmapi.EventUpdate,
|
||||
},
|
||||
Updated: &pmapi.EventMessageUpdated{
|
||||
ID: "msg1",
|
||||
Subject: &newSubject,
|
||||
},
|
||||
}},
|
||||
}, nil
|
||||
})
|
||||
|
||||
// Event loop runs in goroutine and will be stopped by deferred mock clearing.
|
||||
go m.store.eventLoop.start()
|
||||
// Event loop runs in goroutine started during store creation (newStoreNoEvents).
|
||||
// Force to run the next event.
|
||||
m.store.eventLoop.pollNow()
|
||||
|
||||
var err error
|
||||
assert.Eventually(t, func() bool {
|
||||
var msg *pmapi.Message
|
||||
msg, err = m.store.getMessageFromDB("msg1")
|
||||
return err == nil && msg.Subject == newSubject
|
||||
}, time.Second, 10*time.Millisecond)
|
||||
select {
|
||||
case <-eventReceived:
|
||||
case <-time.After(5 * time.Second):
|
||||
require.Fail(t, "latestEventID was not processed")
|
||||
}
|
||||
|
||||
msg, err := m.store.getMessageFromDB("msg1")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, newSubject, msg.Subject)
|
||||
}
|
||||
|
||||
func TestEventLoopUpdateMessage(t *testing.T) {
|
||||
|
||||
@ -18,11 +18,12 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
storemocks "github.com/ProtonMail/proton-bridge/internal/store/mocks"
|
||||
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
|
||||
@ -89,7 +90,7 @@ func initMocks(tb testing.TB) (*mocksForStore, func()) {
|
||||
}
|
||||
}
|
||||
|
||||
func (mocks *mocksForStore) newStoreNoEvents(combinedMode bool) { //nolint[unparam]
|
||||
func (mocks *mocksForStore) newStoreNoEvents(combinedMode bool, msgs ...*pmapi.Message) { //nolint[unparam]
|
||||
mocks.user.EXPECT().ID().Return("userID").AnyTimes()
|
||||
mocks.user.EXPECT().IsConnected().Return(true)
|
||||
mocks.user.EXPECT().IsCombinedAddressMode().Return(combinedMode)
|
||||
@ -102,20 +103,19 @@ func (mocks *mocksForStore) newStoreNoEvents(combinedMode bool) { //nolint[unpar
|
||||
})
|
||||
mocks.client.EXPECT().ListLabels()
|
||||
mocks.client.EXPECT().CountMessages("")
|
||||
mocks.client.EXPECT().GetEvent(gomock.Any()).
|
||||
Return(&pmapi.Event{
|
||||
EventID: "latestEventID",
|
||||
}, nil).AnyTimes()
|
||||
|
||||
// We want to wait until first sync has finished.
|
||||
firstSyncWaiter := sync.WaitGroup{}
|
||||
firstSyncWaiter.Add(1)
|
||||
mocks.client.EXPECT().
|
||||
ListMessages(gomock.Any()).
|
||||
DoAndReturn(func(*pmapi.MessagesFilter) ([]*pmapi.Message, int, error) {
|
||||
firstSyncWaiter.Done()
|
||||
return []*pmapi.Message{}, 0, nil
|
||||
})
|
||||
// Call to get latest event ID and then to process first event.
|
||||
mocks.client.EXPECT().GetEvent("").Return(&pmapi.Event{
|
||||
EventID: "firstEventID",
|
||||
}, nil)
|
||||
mocks.client.EXPECT().GetEvent("firstEventID").Return(&pmapi.Event{
|
||||
EventID: "latestEventID",
|
||||
}, nil)
|
||||
|
||||
mocks.client.EXPECT().ListMessages(gomock.Any()).Return(msgs, len(msgs), nil).AnyTimes()
|
||||
for _, msg := range msgs {
|
||||
mocks.client.EXPECT().GetMessage(msg.ID).Return(msg, nil).AnyTimes()
|
||||
}
|
||||
|
||||
var err error
|
||||
mocks.store, err = New(
|
||||
@ -128,6 +128,16 @@ func (mocks *mocksForStore) newStoreNoEvents(combinedMode bool) { //nolint[unpar
|
||||
)
|
||||
require.NoError(mocks.tb, err)
|
||||
|
||||
// Wait for sync to finish.
|
||||
firstSyncWaiter.Wait()
|
||||
// We want to wait until first sync has finished.
|
||||
require.Eventually(mocks.tb, func() bool {
|
||||
for _, msg := range msgs {
|
||||
_, err := mocks.store.getMessageFromDB(msg.ID)
|
||||
if err != nil {
|
||||
// To see in test result the latest error for debugging.
|
||||
fmt.Println("Sync wait error:", err)
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}, 5*time.Second, 10*time.Millisecond)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user