forked from Silverfish/proton-bridge
test: fix flaky test TestSyncAllMail
This commit is contained in:
@ -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()
|
||||||
|
|||||||
@ -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),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user