test: fix flaky test TestSyncAllMail

This commit is contained in:
James Houlahan
2020-07-03 14:33:10 +02:00
parent b25baa2524
commit 51ff880fd9
2 changed files with 43 additions and 25 deletions

View File

@ -26,7 +26,7 @@ import (
) )
func TestSyncState_IDRanges(t *testing.T) { func TestSyncState_IDRanges(t *testing.T) {
store := &mockStoreSynchronizer{} store := newSyncer()
syncState := newSyncState(store, 0, []*syncIDRange{}, []string{}) syncState := newSyncState(store, 0, []*syncIDRange{}, []string{})
syncState.initIDRanges() syncState.initIDRanges()
@ -43,7 +43,7 @@ func TestSyncState_IDRanges(t *testing.T) {
} }
func TestSyncState_IDRangesLoaded(t *testing.T) { func TestSyncState_IDRangesLoaded(t *testing.T) {
store := &mockStoreSynchronizer{} store := newSyncer()
syncState := newSyncState(store, 0, []*syncIDRange{ syncState := newSyncState(store, 0, []*syncIDRange{
{StartID: "", StopID: "100"}, {StartID: "", StopID: "100"},
{StartID: "100", StopID: ""}, {StartID: "100", StopID: ""},
@ -57,9 +57,9 @@ func TestSyncState_IDRangesLoaded(t *testing.T) {
} }
func TestSyncState_IDsToBeDeleted(t *testing.T) { func TestSyncState_IDsToBeDeleted(t *testing.T) {
store := &mockStoreSynchronizer{ store := newSyncer()
allMessageIDs: generateIDs(1, 9), store.allMessageIDs = generateIDs(1, 9)
}
syncState := newSyncState(store, 0, []*syncIDRange{}, []string{}) syncState := newSyncState(store, 0, []*syncIDRange{}, []string{})
require.Nil(t, syncState.loadMessageIDsToBeDeleted()) require.Nil(t, syncState.loadMessageIDsToBeDeleted())
@ -74,9 +74,9 @@ func TestSyncState_IDsToBeDeleted(t *testing.T) {
} }
func TestSyncState_IDsToBeDeletedLoaded(t *testing.T) { func TestSyncState_IDsToBeDeletedLoaded(t *testing.T) {
store := &mockStoreSynchronizer{ store := newSyncer()
allMessageIDs: generateIDs(1, 9), store.allMessageIDs = generateIDs(1, 9)
}
syncState := newSyncState(store, 0, []*syncIDRange{}, generateIDs(4, 9)) syncState := newSyncState(store, 0, []*syncIDRange{}, generateIDs(4, 9))
idsToBeDeleted := syncState.getIDsToBeDeleted() idsToBeDeleted := syncState.getIDsToBeDeleted()

View File

@ -20,6 +20,7 @@ package store
import ( import (
"sort" "sort"
"strconv" "strconv"
"sync"
"testing" "testing"
"github.com/ProtonMail/proton-bridge/pkg/pmapi" "github.com/ProtonMail/proton-bridge/pkg/pmapi"
@ -79,16 +80,29 @@ func (m *mockLister) ListMessages(filter *pmapi.MessagesFilter) (msgs []*pmapi.M
} }
type mockStoreSynchronizer struct { type mockStoreSynchronizer struct {
locker sync.Locker
allMessageIDs []string allMessageIDs []string
errCreateOrUpdateMessagesEvent error errCreateOrUpdateMessagesEvent error
createdMessageIDsByBatch [][]string createdMessageIDsByBatch [][]string
} }
func newSyncer() *mockStoreSynchronizer {
return &mockStoreSynchronizer{
locker: &sync.Mutex{},
}
}
func (m *mockStoreSynchronizer) getAllMessageIDs() ([]string, error) { func (m *mockStoreSynchronizer) getAllMessageIDs() ([]string, error) {
m.locker.Lock()
defer m.locker.Unlock()
return m.allMessageIDs, nil return m.allMessageIDs, nil
} }
func (m *mockStoreSynchronizer) createOrUpdateMessagesEvent(messages []*pmapi.Message) error { func (m *mockStoreSynchronizer) createOrUpdateMessagesEvent(messages []*pmapi.Message) error {
m.locker.Lock()
defer m.locker.Unlock()
if m.errCreateOrUpdateMessagesEvent != nil { if m.errCreateOrUpdateMessagesEvent != nil {
return m.errCreateOrUpdateMessagesEvent return m.errCreateOrUpdateMessagesEvent
} }
@ -101,10 +115,15 @@ func (m *mockStoreSynchronizer) createOrUpdateMessagesEvent(messages []*pmapi.Me
} }
func (m *mockStoreSynchronizer) deleteMessagesEvent([]string) error { func (m *mockStoreSynchronizer) deleteMessagesEvent([]string) error {
m.locker.Lock()
defer m.locker.Unlock()
return nil return nil
} }
func (m *mockStoreSynchronizer) saveSyncState(finishTime int64, idRanges []*syncIDRange, idsToBeDeleted []string) { func (m *mockStoreSynchronizer) saveSyncState(finishTime int64, idRanges []*syncIDRange, idsToBeDeleted []string) {
m.locker.Lock()
defer m.locker.Unlock()
} }
func newTestSyncState(store storeSynchronizer, splitIDs ...string) *syncState { func newTestSyncState(store storeSynchronizer, splitIDs ...string) *syncState {
@ -173,9 +192,9 @@ func TestSyncAllMail(t *testing.T) { //nolint[funlen]
for _, tc := range tests { for _, tc := range tests {
tc := tc tc := tc
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
store := &mockStoreSynchronizer{ store := newSyncer()
allMessageIDs: generateIDs(1, numberOfMessages+10), store.allMessageIDs = generateIDs(1, numberOfMessages+10)
}
syncState := newSyncState(store, 0, tc.idRanges, tc.idsToBeDeleted) syncState := newSyncState(store, 0, tc.idRanges, tc.idsToBeDeleted)
err := syncAllMail(m.panicHandler, store, func() messageLister { return api }, syncState) err := syncAllMail(m.panicHandler, store, func() messageLister { return api }, syncState)
@ -217,9 +236,9 @@ func TestSyncAllMail_FailedListing(t *testing.T) {
numberOfMessages := 10000 numberOfMessages := 10000
store := &mockStoreSynchronizer{ store := newSyncer()
allMessageIDs: generateIDs(1, numberOfMessages+10), store.allMessageIDs = generateIDs(1, numberOfMessages+10)
}
api := &mockLister{ api := &mockLister{
err: errors.New("error"), err: errors.New("error"),
messageIDs: generateIDs(1, numberOfMessages), messageIDs: generateIDs(1, numberOfMessages),
@ -236,10 +255,10 @@ func TestSyncAllMail_FailedCreateOrUpdateMessage(t *testing.T) {
numberOfMessages := 10000 numberOfMessages := 10000
store := &mockStoreSynchronizer{ store := newSyncer()
errCreateOrUpdateMessagesEvent: errors.New("error"), store.errCreateOrUpdateMessagesEvent = errors.New("error")
allMessageIDs: generateIDs(1, numberOfMessages+10), store.allMessageIDs = generateIDs(1, numberOfMessages+10)
}
api := &mockLister{ api := &mockLister{
messageIDs: generateIDs(1, numberOfMessages), messageIDs: generateIDs(1, numberOfMessages),
} }
@ -250,7 +269,7 @@ func TestSyncAllMail_FailedCreateOrUpdateMessage(t *testing.T) {
} }
func TestFindIDRanges(t *testing.T) { //nolint[funlen] func TestFindIDRanges(t *testing.T) { //nolint[funlen]
store := &mockStoreSynchronizer{} store := newSyncer()
syncState := newTestSyncState(store) syncState := newTestSyncState(store)
tests := []struct { tests := []struct {
@ -343,7 +362,7 @@ func TestFindIDRanges(t *testing.T) { //nolint[funlen]
} }
func TestFindIDRanges_FailedListing(t *testing.T) { func TestFindIDRanges_FailedListing(t *testing.T) {
store := &mockStoreSynchronizer{} store := newSyncer()
api := &mockLister{ api := &mockLister{
err: errors.New("error"), err: errors.New("error"),
} }
@ -466,7 +485,7 @@ func TestSyncBatch(t *testing.T) {
for _, tc := range tests { for _, tc := range tests {
tc := tc tc := tc
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
store := &mockStoreSynchronizer{} store := newSyncer()
api := &mockLister{ api := &mockLister{
messageIDs: generateIDs(1, 1000), messageIDs: generateIDs(1, 1000),
} }
@ -479,7 +498,7 @@ func TestSyncBatch(t *testing.T) {
} }
func TestSyncBatch_FailedListing(t *testing.T) { func TestSyncBatch_FailedListing(t *testing.T) {
store := &mockStoreSynchronizer{} store := newSyncer()
api := &mockLister{ api := &mockLister{
err: errors.New("error"), err: errors.New("error"),
messageIDs: generateIDs(1, 1000), messageIDs: generateIDs(1, 1000),
@ -490,9 +509,8 @@ func TestSyncBatch_FailedListing(t *testing.T) {
} }
func TestSyncBatch_FailedCreateOrUpdateMessage(t *testing.T) { func TestSyncBatch_FailedCreateOrUpdateMessage(t *testing.T) {
store := &mockStoreSynchronizer{ store := newSyncer()
errCreateOrUpdateMessagesEvent: errors.New("error"), store.errCreateOrUpdateMessagesEvent = errors.New("error")
}
api := &mockLister{ api := &mockLister{
messageIDs: generateIDs(1, 1000), messageIDs: generateIDs(1, 1000),
} }