package objstore import ( "context" "errors" "testing" ) func TestMemProvisionerIdempotence(t *testing.T) { ctx := context.Background() p := NewMemProvisioner("eu-west-1") for i := 0; i < 2; i++ { // every verb is safe to repeat if region, err := p.EnsureBucket(ctx, "b1"); err != nil || region != "eu-west-1" { t.Fatalf("EnsureBucket #%d: %q %v", i, region, err) } if arn, err := p.EnsureUser(ctx, "u1", "/carlos-store/", "arn:aws:s3:::b1", nil); err != nil || arn == "" { t.Fatalf("EnsureUser #%d: %v", i, err) } } id1, sec1, err := p.MintKey(ctx, "u1") if err != nil || id1 == "" || sec1 == "" { t.Fatal(err) } id2, _, err := p.MintKey(ctx, "u1") if err != nil || id2 == id1 { t.Fatalf("second mint: %q vs %q, %v", id2, id1, err) } if err := p.DeleteKey(ctx, "u1", id1); err != nil { t.Fatal(err) } if err := p.DeleteKey(ctx, "u1", id1); err != nil { // already gone == success t.Fatal(err) } id3, _, err := p.MintKey(ctx, "u1") if err != nil { t.Fatal(err) } if err := p.ReapKeys(ctx, "u1", []string{id3}); err != nil { t.Fatal(err) } if got := len(p.Users["u1"].Keys); got != 1 { // id2 reaped, id3 kept t.Fatalf("after reap: %d keys", got) } if err := p.EmptyBucket(ctx, "b1"); err != nil { t.Fatal(err) } if err := p.DeleteBucket(ctx, "b1"); err != nil { t.Fatal(err) } if err := p.DeleteBucket(ctx, "b1"); err != nil { // already gone == success t.Fatal(err) } if err := p.DeleteUser(ctx, "u1"); err != nil { t.Fatal(err) } if err := p.DeleteUser(ctx, "u1"); err != nil { t.Fatal(err) } } func TestMemProvisionerFailNext(t *testing.T) { ctx := context.Background() p := NewMemProvisioner("eu-west-1") boom := errors.New("boom") p.FailNext["EnsureBucket"] = boom if _, err := p.EnsureBucket(ctx, "b1"); !errors.Is(err, boom) { t.Fatalf("want injected failure, got %v", err) } if _, err := p.EnsureBucket(ctx, "b1"); err != nil { // one-shot t.Fatalf("retry should succeed: %v", err) } }