setting aside in case its wanted

This commit is contained in:
ryanfkeepers 2023-07-20 18:37:00 -06:00
parent 5efbd966fd
commit dab0808ca7

View File

@ -1213,6 +1213,441 @@ func (suite *ExchangeRestoreIntgSuite) TestRestore_Run_exchangeWithAdvancedOptio
})
}
// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
func (suite *ExchangeRestoreIntgSuite) TestRestore_Run_exchangePairwiseAdvancedOptions() {
var (
t = suite.T()
userID = suite.its.user.ID
initCfg = ctrlTD.DefaultRestoreConfig("exchange_adv_pairwise_init")
origItemIDs = map[path.CategoryType][]string{}
)
ctx, flush := tester.NewContext(t)
defer flush()
// a backup is required to run restores
// first: generate four items for each category to be restored
// that will allow us to restore a pairwise set of items each time:
// one item that was already restored to test skip/copy/replace,
// and one item that isn't yet restored.
acc := suite.its.ac.Contacts()
origItemIDs[path.ContactsCategory] = make([]string, 4)
gc, err := acc.CreateContainer(ctx, userID, "", initCfg.Location)
require.NoError(t, err, clues.ToCore(err))
for i := 0; i < 4; i++ {
bb := exchMock.ContactBytes(fmt.Sprintf("pairwise_%d", i))
body, err := api.BytesToContactable(bb)
require.NoError(t, err, clues.ToCore(err))
itm, err := acc.PostItem(ctx, userID, ptr.Val(gc.GetId()), body)
require.NoError(t, err, clues.ToCore(err))
origItemIDs[path.ContactsCategory][i] = ptr.Val(itm.GetId())
}
// ace := suite.its.ac.Events()
// origItemIDs[path.EventsCategory] = make([]string, 4)
// gc, err = ace.CreateContainer(ctx, userID, "", initCfg.Location)
// require.NoError(t, err, clues.ToCore(err))
// for i := 0; i < 4; i++ {
// bb := exchMock.EventBytes(fmt.Sprintf("pairwise_%d", i))
// body, err := api.BytesToEventable(bb)
// require.NoError(t, err, clues.ToCore(err))
// itm, err := ace.PostItem(ctx, userID, ptr.Val(gc.GetId()), body)
// require.NoError(t, err, clues.ToCore(err))
// origItemIDs[path.EventsCategory][i] = ptr.Val(itm.GetId())
// }
acm := suite.its.ac.Mail()
origItemIDs[path.EmailCategory] = make([]string, 4)
gc, err = acm.CreateContainer(ctx, userID, api.MsgFolderRoot, initCfg.Location)
require.NoError(t, err, clues.ToCore(err))
for i := 0; i < 4; i++ {
bb := exchMock.MessageBytes(fmt.Sprintf("pairwise_%d", i))
body, err := api.BytesToMessageable(bb)
require.NoError(t, err, clues.ToCore(err))
itm, err := acm.PostItem(ctx, userID, ptr.Val(gc.GetId()), body)
require.NoError(t, err, clues.ToCore(err))
origItemIDs[path.EmailCategory][i] = ptr.Val(itm.GetId())
}
// then backup the folders generated for this test
baseSel := selectors.NewExchangeBackup([]string{suite.its.user.ID})
baseSel.Include(
// events cannot be run, for the same reason as incremental backups: the user needs
// to have their account recycled.
// baseSel.EventCalendars([]string{initCfg.Location}, selectors.PrefixMatch()),
baseSel.ContactFolders([]string{initCfg.Location}, selectors.PrefixMatch()),
baseSel.MailFolders([]string{initCfg.Location}, selectors.PrefixMatch()))
baseSel.DiscreteOwner = suite.its.user.ID
var (
mb = evmock.NewBus()
opts = control.DefaultOptions()
)
bo, bod := prepNewTestBackupOp(t, ctx, mb, baseSel.Selector, opts, version.Backup)
defer bod.close(t, ctx)
runAndCheckBackup(t, ctx, &bo, mb, false)
rsel, err := baseSel.ToExchangeRestore()
require.NoError(t, err, clues.ToCore(err))
var (
restoreCfg = ctrlTD.DefaultRestoreConfig("exchange_adv_pairwise")
sel = rsel.Selector
countItemsInRestore int
itemIDs = map[path.CategoryType]map[string]struct{}{}
collisionKeys = map[path.CategoryType]map[string]string{}
containerIDs = map[path.CategoryType]string{}
parentContainerIDs = map[path.CategoryType]string{
path.EmailCategory: api.MsgFolderRoot,
}
testCategories = map[path.CategoryType]clientItemPager{
path.ContactsCategory: suite.its.ac.Contacts(),
path.EmailCategory: suite.its.ac.Mail(),
// path.EventsCategory: suite.its.ac.Events(),
}
)
// initial restore: only restore the first item of each four.
suite.Run("baseline", func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
rSel := selectors.NewExchangeBackup([]string{userID})
rsel.Include(
rSel.Events(
[]string{initCfg.Location},
[]string{origItemIDs[path.EventsCategory][0]}),
rSel.Contacts(
[]string{initCfg.Location},
[]string{origItemIDs[path.ContactsCategory][0]}),
rSel.Mails(
[]string{initCfg.Location},
[]string{origItemIDs[path.EmailCategory][0]}))
mb := evmock.NewBus()
ctr1 := count.New()
restoreCfg.OnCollision = control.Copy
ro, _ := prepNewTestRestoreOp(
t,
ctx,
bod.st,
bo.Results.BackupID,
mb,
ctr1,
rSel.Selector,
opts,
restoreCfg)
runAndCheckRestore(t, ctx, &ro, mb, false)
// get all files in folder, use these as the base
// set of files to compare against.
for cat, ac := range testCategories {
suite.Run(cat.String(), func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
itemIDs[cat], collisionKeys[cat], containerIDs[cat] = getCollKeysAndItemIDs(
t,
ctx,
ac,
userID,
parentContainerIDs[cat],
restoreCfg.Location)
})
}
countItemsInRestore = len(collisionKeys[path.ContactsCategory]) +
len(collisionKeys[path.EmailCategory]) +
len(collisionKeys[path.EventsCategory])
checkRestoreCounts(t, ctr1, 0, 0, countItemsInRestore)
assert.Equal(t, len(collisionKeys), countItemsInRestore, "only one item per category should be restored")
})
// skip restore; skip item 0, restore item 1
suite.Run("skip collisions", func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
rSel := selectors.NewExchangeBackup([]string{userID})
rsel.Include(
rSel.Events(
[]string{initCfg.Location},
[]string{origItemIDs[path.EventsCategory][0], origItemIDs[path.EventsCategory][1]}),
rSel.Contacts(
[]string{initCfg.Location},
[]string{origItemIDs[path.ContactsCategory][0], origItemIDs[path.ContactsCategory][1]}),
rSel.Mails(
[]string{initCfg.Location},
[]string{origItemIDs[path.EmailCategory][0], origItemIDs[path.EmailCategory][1]}))
mb := evmock.NewBus()
ctr2 := count.New()
restoreCfg.OnCollision = control.Skip
ro, _ := prepNewTestRestoreOp(
t,
ctx,
bod.st,
bo.Results.BackupID,
mb,
ctr2,
rSel.Selector,
opts,
restoreCfg)
deets := runAndCheckRestore(t, ctx, &ro, mb, false)
assert.Equal(t, len(origItemIDs), len(deets.Entries), "one item per category should have been restored")
checkRestoreCounts(t, ctr2, len(origItemIDs), 0, len(origItemIDs))
result := map[string]string{}
for cat, ac := range testCategories {
suite.Run(cat.String(), func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
m := filterCollisionKeyResults(
t,
ctx,
userID,
containerIDs[cat],
GetItemsInContainerByCollisionKeyer[string](ac),
collisionKeys[cat])
maps.Copy(result, m)
currentIDs, err := ac.GetItemIDsInContainer(ctx, userID, containerIDs[cat])
require.NoError(t, err, clues.ToCore(err))
assert.Subset(t, maps.Keys(currentIDs), maps.Keys(itemIDs[cat]), "restore should contain all previous ids")
})
}
assert.Len(t, result, len(origItemIDs), "one item per category should get added")
})
// copy restore; copy item 0, restore item 2
suite.Run("copy collisions", func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
rSel := selectors.NewExchangeBackup([]string{userID})
rsel.Include(
rSel.Events(
[]string{initCfg.Location},
[]string{origItemIDs[path.EventsCategory][0], origItemIDs[path.EventsCategory][2]}),
rSel.Contacts(
[]string{initCfg.Location},
[]string{origItemIDs[path.ContactsCategory][0], origItemIDs[path.ContactsCategory][2]}),
rSel.Mails(
[]string{initCfg.Location},
[]string{origItemIDs[path.EmailCategory][0], origItemIDs[path.EmailCategory][2]}))
mb := evmock.NewBus()
ctr4 := count.New()
restoreCfg.OnCollision = control.Copy
ro, _ := prepNewTestRestoreOp(
t,
ctx,
bod.st,
bo.Results.BackupID,
mb,
ctr4,
sel,
opts,
restoreCfg)
deets := runAndCheckRestore(t, ctx, &ro, mb, false)
filtEnts := []details.Entry{}
for _, e := range deets.Entries {
if e.Folder == nil {
filtEnts = append(filtEnts, e)
}
}
assert.Len(t, filtEnts, countItemsInRestore, "every item should have been copied")
checkRestoreCounts(t, ctr4, 0, 0, countItemsInRestore)
result := map[string]string{}
for cat, ac := range testCategories {
suite.Run(cat.String(), func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
m := filterCollisionKeyResults(
t,
ctx,
userID,
containerIDs[cat],
GetItemsInContainerByCollisionKeyer[string](ac),
collisionKeys[cat])
maps.Copy(result, m)
currentIDs, err := ac.GetItemIDsInContainer(ctx, userID, containerIDs[cat])
require.NoError(t, err, clues.ToCore(err))
assert.Equal(t, 2*len(itemIDs[cat]), len(currentIDs), "count of ids should be double from before")
assert.Subset(t, maps.Keys(currentIDs), maps.Keys(itemIDs[cat]), "original item should exist after copy")
})
}
// TODO: we have the option of modifying copy creations in exchange
// so that the results don't collide. But we haven't made that
// decision yet.
assert.Len(t, result, 0, "no items should have been added as copies")
})
// replace restore; replace item 0, restore item 3
suite.Run("replace collisions", func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
rSel := selectors.NewExchangeBackup([]string{userID})
rsel.Include(
rSel.Events(
[]string{initCfg.Location},
[]string{origItemIDs[path.EventsCategory][0], origItemIDs[path.EventsCategory][2]}),
rSel.Contacts(
[]string{initCfg.Location},
[]string{origItemIDs[path.ContactsCategory][0], origItemIDs[path.ContactsCategory][2]}),
rSel.Mails(
[]string{initCfg.Location},
[]string{origItemIDs[path.EmailCategory][0], origItemIDs[path.EmailCategory][2]}))
mb := evmock.NewBus()
ctr3 := count.New()
restoreCfg.OnCollision = control.Replace
ro, _ := prepNewTestRestoreOp(
t,
ctx,
bod.st,
bo.Results.BackupID,
mb,
ctr3,
sel,
opts,
restoreCfg)
deets := runAndCheckRestore(t, ctx, &ro, mb, false)
filtEnts := []details.Entry{}
for _, e := range deets.Entries {
if e.Folder == nil {
filtEnts = append(filtEnts, e)
}
}
assert.Len(t, filtEnts, len(origItemIDs), "one item for each category should have been replaced")
checkRestoreCounts(t, ctr3, 0, len(origItemIDs), len(origItemIDs))
result := map[string]string{}
for cat, ac := range testCategories {
suite.Run(cat.String(), func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
m := filterCollisionKeyResults(
t,
ctx,
userID,
containerIDs[cat],
GetItemsInContainerByCollisionKeyer[string](ac),
collisionKeys[cat])
maps.Copy(result, m)
currentIDs, err := ac.GetItemIDsInContainer(ctx, userID, containerIDs[cat])
require.NoError(t, err, clues.ToCore(err))
assert.Equal(t, 3*len(itemIDs[cat]), len(currentIDs), "3x items have been restored so far")
for orig := range itemIDs[cat] {
assert.NotContains(t, currentIDs, orig, "original item should not exist after replacement")
}
// note: this changes the count of itemIDs from 1 to 3
itemIDs[cat] = currentIDs
})
}
assert.Len(t, result, len(origItemIDs), "one item per category should have been replaced")
})
}
func (suite *ExchangeRestoreIntgSuite) TestRestore_Run_exchangeAlternateProtectedResource() {
t := suite.T()