corso/src/internal/operations/backup_test.go
Keepers 8725cacc22
add restore, backup result persistence skeleton (#275)
e2e wiring of persistence is not yet complete.
Will need modelstore integration, and additional
information about file and error counts from kw and gc.
2022-07-05 14:42:10 -06:00

150 lines
3.8 KiB
Go

package operations
import (
"context"
"testing"
"time"
multierror "github.com/hashicorp/go-multierror"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/internal/connector"
"github.com/alcionai/corso/internal/kopia"
ctesting "github.com/alcionai/corso/internal/testing"
"github.com/alcionai/corso/pkg/account"
)
// ---------------------------------------------------------------------------
// unit
// ---------------------------------------------------------------------------
type BackupOpSuite struct {
suite.Suite
}
func TestBackupOpSuite(t *testing.T) {
suite.Run(t, new(BackupOpSuite))
}
// TODO: after modelStore integration is added, mock the store and/or
// move this to an integration test.
func (suite *BackupOpSuite) TestBackupOperation_PersistResults() {
t := suite.T()
ctx := context.Background()
var (
kw = &kopia.KopiaWrapper{}
acct = account.Account{}
now = time.Now()
cs = []connector.DataCollection{&connector.ExchangeDataCollection{}}
readErrs = multierror.Append(nil, assert.AnError)
writeErrs = assert.AnError
stats = &kopia.BackupStats{
TotalFileCount: 1,
}
)
op, err := NewBackupOperation(ctx, Options{}, kw, acct, nil)
require.NoError(t, err)
op.persistResults(now, cs, stats, readErrs, writeErrs)
assert.Equal(t, op.Status, Failed)
assert.Equal(t, op.Results.ItemsRead, len(cs))
assert.Equal(t, op.Results.ReadErrors, readErrs)
assert.Equal(t, op.Results.ItemsWritten, stats.TotalFileCount)
assert.Equal(t, op.Results.WriteErrors, writeErrs)
assert.Equal(t, op.Results.StartedAt, now)
assert.Less(t, now, op.Results.CompletedAt)
}
// ---------------------------------------------------------------------------
// integration
// ---------------------------------------------------------------------------
type BackupOpIntegrationSuite struct {
suite.Suite
}
func TestBackupOpIntegrationSuite(t *testing.T) {
if err := ctesting.RunOnAny(ctesting.CorsoCITests); err != nil {
t.Skip(err)
}
suite.Run(t, new(BackupOpIntegrationSuite))
}
func (suite *BackupOpIntegrationSuite) SetupSuite() {
_, err := ctesting.GetRequiredEnvVars(
append(
ctesting.AWSStorageCredEnvs,
ctesting.M365AcctCredEnvs...,
)...,
)
require.NoError(suite.T(), err)
}
func (suite *BackupOpIntegrationSuite) TestNewBackupOperation() {
kw := &kopia.KopiaWrapper{}
acct, err := ctesting.NewM365Account()
require.NoError(suite.T(), err)
table := []struct {
name string
opts Options
kw *kopia.KopiaWrapper
acct account.Account
targets []string
errCheck assert.ErrorAssertionFunc
}{
{"good", Options{}, kw, acct, nil, assert.NoError},
{"missing kopia", Options{}, nil, acct, nil, assert.Error},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
_, err := NewBackupOperation(
context.Background(),
Options{},
test.kw,
test.acct,
nil)
test.errCheck(t, err)
})
}
}
func (suite *BackupOpIntegrationSuite) TestBackup_Run() {
t := suite.T()
ctx := context.Background()
// m365User := "lidiah@8qzvrj.onmicrosoft.com"
// not the user we want to use, but all the others are
// suffering from JsonParseNode syndrome
m365User := "george.martinez@8qzvrj.onmicrosoft.com"
acct, err := ctesting.NewM365Account()
require.NoError(t, err)
// need to initialize the repository before we can test connecting to it.
st, err := ctesting.NewPrefixedS3Storage(t)
require.NoError(t, err)
k := kopia.New(st)
require.NoError(t, k.Initialize(ctx))
bo, err := NewBackupOperation(
ctx,
Options{},
k,
acct,
[]string{m365User})
require.NoError(t, err)
stats, err := bo.Run(ctx)
require.NoError(t, err)
require.NotNil(t, stats)
assert.Equal(t, bo.Status, Successful)
assert.Greater(t, stats.TotalFileCount, 0)
assert.Zero(t, stats.ErrorCount)
}