Keepers 7419faab23
refactor drive restore & export to use sanitree (#4425)
refactors the common drive sanity checks to use the sanitree data container.  Also expands the sanitree in two ways:
1. adds leaves (individual items) to nodes for granular data comparison
2. adds multi-type support for comparing nodes of different types.

---

#### Does this PR need a docs update or release note?

- [x]  No

#### Type of change

- [x] 🤖 Supportability/Tests

#### Issue(s)

* #3988

#### Test Plan

- [x] 💪 Manual
- [x] 💚 E2E
2023-10-13 22:55:35 +00:00

121 lines
2.3 KiB
Go

package common
import (
"context"
"errors"
"fmt"
"os"
"strings"
"time"
"github.com/alcionai/clues"
"github.com/alcionai/corso/src/internal/common/dttm"
"github.com/alcionai/corso/src/pkg/logger"
)
func Assert(
ctx context.Context,
passes func() bool,
header string,
expect, have any,
) {
if passes() {
return
}
header = "TEST FAILURE: " + header
expected := fmt.Sprintf("* Expected: %+v", expect)
got := fmt.Sprintf("* Have: %+v", have)
logger.Ctx(ctx).Info(strings.Join([]string{header, expected, got}, " "))
fmt.Println("=========================")
fmt.Println(header)
fmt.Println(expected)
fmt.Println(got)
fmt.Println("=========================")
os.Exit(1)
}
func Fatal(ctx context.Context, msg string, err error) {
logger.CtxErr(ctx, err).Error("test failure: " + msg)
fmt.Println("=========================")
fmt.Println("TEST FAILURE: "+msg+": ", err)
fmt.Println(clues.ToCore(err))
fmt.Println("=========================")
os.Exit(1)
}
func MustGetTimeFromName(ctx context.Context, name string) (time.Time, bool) {
t, err := dttm.ExtractTime(name)
if err != nil && !errors.Is(err, dttm.ErrNoTimeString) {
Fatal(ctx, "extracting time from name: "+name, err)
}
return t, !errors.Is(err, dttm.ErrNoTimeString)
}
func IsWithinTimeBound(
ctx context.Context,
bound, check time.Time,
hasTime bool,
) bool {
if hasTime {
if bound.Before(check) {
logger.Ctx(ctx).
With("boundary_time", bound, "check_time", check).
Info("skipping restore folder: not older than time bound")
return false
}
}
return true
}
func FilterSlice(sl []string, remove string) []string {
r := []string{}
for _, s := range sl {
if !strings.EqualFold(s, remove) {
r = append(r, s)
}
}
return r
}
func Infof(ctx context.Context, tmpl string, vs ...any) {
logger.Ctx(ctx).Infof(tmpl, vs...)
fmt.Printf(tmpl+"\n", vs...)
}
type debugKey string
const ctxDebugKey debugKey = "ctx_debug"
func SetDebug(ctx context.Context) context.Context {
if len(os.Getenv("SANITY_TEST_DEBUG")) == 0 {
return ctx
}
return context.WithValue(ctx, ctxDebugKey, true)
}
func isDebug(ctx context.Context) bool {
cdk := ctx.Value(ctxDebugKey)
return cdk != nil && cdk.(bool)
}
func Debugf(ctx context.Context, tmpl string, vs ...any) {
if !isDebug(ctx) {
return
}
logger.Ctx(ctx).Infof(tmpl, vs...)
fmt.Printf(tmpl+"\n", vs...)
}