Issue 902 onedriveindividual (#1140)

## Description

Added an additional set of test suites to load_test
to focus on the backup of a single user who will
have their account prepared with a significant amount
of data (many emails, many events, large files, etc).

## Type of change

- [x] 🤖 Test

## Issue(s)

* #902 

## Test Plan

- [x] 💪 Manual
- [x] 💚 E2E
This commit is contained in:
Keepers 2022-10-14 11:45:06 -06:00 committed by GitHub
parent 39f9c7f50f
commit 7facdf1cc3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -34,7 +34,6 @@ var users = []string{
"IsaiahL@8qzvrj.onmicrosoft.com", "IsaiahL@8qzvrj.onmicrosoft.com",
"JohannaL@8qzvrj.onmicrosoft.com", "JohannaL@8qzvrj.onmicrosoft.com",
"JoniS@8qzvrj.onmicrosoft.com", "JoniS@8qzvrj.onmicrosoft.com",
"LeeG@8qzvrj.onmicrosoft.com",
"LidiaH@8qzvrj.onmicrosoft.com", "LidiaH@8qzvrj.onmicrosoft.com",
"LynneR@8qzvrj.onmicrosoft.com", "LynneR@8qzvrj.onmicrosoft.com",
"MeganB@8qzvrj.onmicrosoft.com", "MeganB@8qzvrj.onmicrosoft.com",
@ -46,8 +45,15 @@ var users = []string{
"Rfinders@8qzvrj.onmicrosoft.com", "Rfinders@8qzvrj.onmicrosoft.com",
"vkarma@8qzvrj.onmicrosoft.com", "vkarma@8qzvrj.onmicrosoft.com",
"greg.sanders@8qzvrj.onmicrosoft.com", "greg.sanders@8qzvrj.onmicrosoft.com",
// avoid adding the following users
// they are reserved for other purposes
// "LeeG@8qzvrj.onmicrosoft.com",
} }
var largeDatasetUser = []string{"LeeG@8qzvrj.onmicrosoft.com"}
func initM365Repo(t *testing.T) ( func initM365Repo(t *testing.T) (
context.Context, repository.Repository, account.Account, storage.Storage, context.Context, repository.Repository, account.Account, storage.Storage,
) { ) {
@ -73,12 +79,17 @@ func initM365Repo(t *testing.T) (
return ctx, repo, ac, st return ctx, repo, ac, st
} }
// ------------------------------------------------------------------------------------------------
// Common
// ------------------------------------------------------------------------------------------------
//revive:disable:context-as-argument //revive:disable:context-as-argument
func runBackupLoadTest( func runBackupLoadTest(
t *testing.T, t *testing.T,
ctx context.Context, ctx context.Context,
b *operations.BackupOperation, b *operations.BackupOperation,
name string, name string,
users []string,
) { ) {
//revive:enable:context-as-argument //revive:enable:context-as-argument
t.Run("backup_"+name, func(t *testing.T) { t.Run("backup_"+name, func(t *testing.T) {
@ -147,6 +158,7 @@ func runBackupDetailsLoadTest(
ctx context.Context, ctx context.Context,
r repository.Repository, r repository.Repository,
name, backupID string, name, backupID string,
users []string,
) { ) {
//revive:enable:context-as-argument //revive:enable:context-as-argument
require.NotEmpty(t, backupID, "backup ID to retrieve deails") require.NotEmpty(t, backupID, "backup ID to retrieve deails")
@ -171,7 +183,7 @@ func runBackupDetailsLoadTest(
b.ItemsWritten, len(noFolders(t, ds.Entries)), b.ItemsWritten, len(noFolders(t, ds.Entries)),
"items written to backup must match the count of entries, minus folder entries") "items written to backup must match the count of entries, minus folder entries")
ensureAllUsersInDetails(t, ds, "backup", name) ensureAllUsersInDetails(t, users, ds, "backup", name)
}) })
} }
@ -182,6 +194,7 @@ func runRestoreLoadTest(
r operations.RestoreOperation, r operations.RestoreOperation,
name string, name string,
expectItemCount int, expectItemCount int,
users []string,
) { ) {
//revive:enable:context-as-argument //revive:enable:context-as-argument
t.Run("restore_"+name, func(t *testing.T) { t.Run("restore_"+name, func(t *testing.T) {
@ -202,12 +215,12 @@ func runRestoreLoadTest(
assert.Equal(t, r.Results.ItemsWritten, len(ds.Entries), "count of items written matches restored entries in details") assert.Equal(t, r.Results.ItemsWritten, len(ds.Entries), "count of items written matches restored entries in details")
assert.Less(t, 0, r.Results.ItemsRead, "items read") assert.Less(t, 0, r.Results.ItemsRead, "items read")
assert.Less(t, 0, r.Results.ItemsWritten, "items written") assert.Less(t, 0, r.Results.ItemsWritten, "items written")
assert.Less(t, 0, r.Results.ResourceOwners, "resource owners") assert.Equal(t, len(users), r.Results.ResourceOwners, "resource owners")
assert.Zero(t, r.Results.ReadErrors, "read errors") assert.Zero(t, r.Results.ReadErrors, "read errors")
assert.Zero(t, r.Results.WriteErrors, "write errors") assert.Zero(t, r.Results.WriteErrors, "write errors")
assert.Equal(t, expectItemCount, r.Results.ItemsWritten, "backup and restore wrote the same count of items") assert.Equal(t, expectItemCount, r.Results.ItemsWritten, "backup and restore wrote the same count of items")
ensureAllUsersInDetails(t, ds, "restore", name) ensureAllUsersInDetails(t, users, ds, "restore", name)
}) })
} }
@ -228,6 +241,7 @@ func noFolders(t *testing.T, des []details.DetailsEntry) []*details.DetailsEntry
func ensureAllUsersInDetails( func ensureAllUsersInDetails(
t *testing.T, t *testing.T,
users []string,
ds *details.Details, ds *details.Details,
prefix, name string, prefix, name string,
) { ) {
@ -283,6 +297,8 @@ func ensureAllUsersInDetails(
// Exchange // Exchange
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// multiple users
type RepositoryLoadTestExchangeSuite struct { type RepositoryLoadTestExchangeSuite struct {
suite.Suite suite.Suite
ctx context.Context ctx context.Context
@ -317,22 +333,23 @@ func (suite *RepositoryLoadTestExchangeSuite) TestExchange() {
t = suite.T() t = suite.T()
r = suite.repo r = suite.repo
service = "exchange" service = "exchange"
usersUnderTest = users
) )
// backup // backup
bsel := selectors.NewExchangeBackup() bsel := selectors.NewExchangeBackup()
bsel.Include(bsel.MailFolders(users, []string{exchange.DefaultMailFolder})) bsel.Include(bsel.MailFolders(usersUnderTest, []string{exchange.DefaultMailFolder}))
bsel.Include(bsel.ContactFolders(users, []string{exchange.DefaultContactFolder})) bsel.Include(bsel.ContactFolders(usersUnderTest, []string{exchange.DefaultContactFolder}))
bsel.Include(bsel.EventCalendars(users, []string{exchange.DefaultCalendar})) bsel.Include(bsel.EventCalendars(usersUnderTest, []string{exchange.DefaultCalendar}))
b, err := r.NewBackup(ctx, bsel.Selector) b, err := r.NewBackup(ctx, bsel.Selector)
require.NoError(t, err) require.NoError(t, err)
runBackupLoadTest(t, ctx, &b, service) runBackupLoadTest(t, ctx, &b, service, usersUnderTest)
bid := string(b.Results.BackupID) bid := string(b.Results.BackupID)
runBackupListLoadTest(t, ctx, r, service, bid) runBackupListLoadTest(t, ctx, r, service, bid)
runBackupDetailsLoadTest(t, ctx, r, service, bid) runBackupDetailsLoadTest(t, ctx, r, service, bid, usersUnderTest)
// restore // restore
rsel, err := bsel.ToExchangeRestore() rsel, err := bsel.ToExchangeRestore()
@ -343,7 +360,73 @@ func (suite *RepositoryLoadTestExchangeSuite) TestExchange() {
rst, err := r.NewRestore(ctx, bid, rsel.Selector, dest) rst, err := r.NewRestore(ctx, bid, rsel.Selector, dest)
require.NoError(t, err) require.NoError(t, err)
runRestoreLoadTest(t, ctx, rst, service, b.Results.ItemsWritten) runRestoreLoadTest(t, ctx, rst, service, b.Results.ItemsWritten, usersUnderTest)
}
// single user, lots of data
type RepositoryIndividualLoadTestExchangeSuite struct {
suite.Suite
ctx context.Context
repo repository.Repository
acct account.Account
st storage.Storage
}
func TestRepositoryIndividualLoadTestExchangeSuite(t *testing.T) {
if err := tester.RunOnAny(tester.CorsoLoadTests); err != nil {
t.Skip(err)
}
suite.Run(t, new(RepositoryIndividualLoadTestExchangeSuite))
}
func (suite *RepositoryIndividualLoadTestExchangeSuite) SetupSuite() {
t := suite.T()
t.Parallel()
suite.ctx, suite.repo, suite.acct, suite.st = initM365Repo(t)
}
func (suite *RepositoryIndividualLoadTestExchangeSuite) TeardownSuite() {
suite.repo.Close(suite.ctx)
}
func (suite *RepositoryIndividualLoadTestExchangeSuite) TestExchange() {
ctx, flush := tester.NewContext()
defer flush()
var (
t = suite.T()
r = suite.repo
service = "exchange"
usersUnderTest = largeDatasetUser
)
// backup
bsel := selectors.NewExchangeBackup()
bsel.Include(bsel.MailFolders(usersUnderTest, []string{exchange.DefaultMailFolder}))
bsel.Include(bsel.ContactFolders(usersUnderTest, []string{exchange.DefaultContactFolder}))
bsel.Include(bsel.EventCalendars(usersUnderTest, []string{exchange.DefaultCalendar}))
b, err := r.NewBackup(ctx, bsel.Selector)
require.NoError(t, err)
runBackupLoadTest(t, ctx, &b, service, usersUnderTest)
bid := string(b.Results.BackupID)
runBackupListLoadTest(t, ctx, r, service, bid)
runBackupDetailsLoadTest(t, ctx, r, service, bid, usersUnderTest)
// restore
rsel, err := bsel.ToExchangeRestore()
require.NoError(t, err)
dest := tester.DefaultTestRestoreDestination()
rst, err := r.NewRestore(ctx, bid, rsel.Selector, dest)
require.NoError(t, err)
runRestoreLoadTest(t, ctx, rst, service, b.Results.ItemsWritten, usersUnderTest)
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -385,20 +468,21 @@ func (suite *RepositoryLoadTestOneDriveSuite) TestOneDrive() {
t = suite.T() t = suite.T()
r = suite.repo r = suite.repo
service = "one_drive" service = "one_drive"
usersUnderTest = users
) )
// backup // backup
bsel := selectors.NewOneDriveBackup() bsel := selectors.NewOneDriveBackup()
bsel.Include(bsel.Users(users)) bsel.Include(bsel.Users(usersUnderTest))
b, err := r.NewBackup(ctx, bsel.Selector) b, err := r.NewBackup(ctx, bsel.Selector)
require.NoError(t, err) require.NoError(t, err)
runBackupLoadTest(t, ctx, &b, service) runBackupLoadTest(t, ctx, &b, service, usersUnderTest)
bid := string(b.Results.BackupID) bid := string(b.Results.BackupID)
runBackupListLoadTest(t, ctx, r, service, bid) runBackupListLoadTest(t, ctx, r, service, bid)
runBackupDetailsLoadTest(t, ctx, r, service, bid) runBackupDetailsLoadTest(t, ctx, r, service, bid, usersUnderTest)
// restore // restore
rsel, err := bsel.ToOneDriveRestore() rsel, err := bsel.ToOneDriveRestore()
@ -409,5 +493,68 @@ func (suite *RepositoryLoadTestOneDriveSuite) TestOneDrive() {
rst, err := r.NewRestore(ctx, bid, rsel.Selector, dest) rst, err := r.NewRestore(ctx, bid, rsel.Selector, dest)
require.NoError(t, err) require.NoError(t, err)
runRestoreLoadTest(t, ctx, rst, service, b.Results.ItemsWritten) runRestoreLoadTest(t, ctx, rst, service, b.Results.ItemsWritten, usersUnderTest)
}
type RepositoryIndividualLoadTestOneDriveSuite struct {
suite.Suite
ctx context.Context
repo repository.Repository
acct account.Account
st storage.Storage
}
func TestRepositoryIndividualLoadTestOneDriveSuite(t *testing.T) {
if err := tester.RunOnAny(tester.CorsoLoadTests); err != nil {
t.Skip(err)
}
suite.Run(t, new(RepositoryIndividualLoadTestOneDriveSuite))
}
func (suite *RepositoryIndividualLoadTestOneDriveSuite) SetupSuite() {
t := suite.T()
t.Skip("temp issue-902-live")
t.Parallel()
suite.ctx, suite.repo, suite.acct, suite.st = initM365Repo(t)
}
func (suite *RepositoryIndividualLoadTestOneDriveSuite) TeardownSuite() {
suite.repo.Close(suite.ctx)
}
func (suite *RepositoryIndividualLoadTestOneDriveSuite) TestOneDrive() {
ctx, flush := tester.NewContext()
defer flush()
var (
t = suite.T()
r = suite.repo
service = "one_drive"
usersUnderTest = largeDatasetUser
)
// backup
bsel := selectors.NewOneDriveBackup()
bsel.Include(bsel.Users(usersUnderTest))
b, err := r.NewBackup(ctx, bsel.Selector)
require.NoError(t, err)
runBackupLoadTest(t, ctx, &b, service, usersUnderTest)
bid := string(b.Results.BackupID)
runBackupListLoadTest(t, ctx, r, service, bid)
runBackupDetailsLoadTest(t, ctx, r, service, bid, usersUnderTest)
// restore
rsel, err := bsel.ToOneDriveRestore()
require.NoError(t, err)
dest := tester.DefaultTestRestoreDestination()
rst, err := r.NewRestore(ctx, bid, rsel.Selector, dest)
require.NoError(t, err)
runRestoreLoadTest(t, ctx, rst, service, b.Results.ItemsWritten, usersUnderTest)
} }