carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package console
2
3import (
4 "context"
5 "errors"
6 "testing"
7 "time"
8
9 "github.com/carlosframework/platform/internal/objstore"
10 "github.com/carlosframework/platform/internal/release"
11)
12
13type bucketRecordingScanner struct {
14 *objstore.MemScanner
15 buckets []string
16}
17
18func (s *bucketRecordingScanner) Scan(ctx context.Context, bucket, key, version string, size int64) (objstore.Verdict, bool, error) {
19 s.buckets = append(s.buckets, bucket)
20 return s.MemScanner.Scan(ctx, bucket, key, version, size)
21}
22
23func TestRevivalDrainRereadsConsentAndBucketInsidePermit(t *testing.T) {
24 for _, revoked := range []bool{true, false} {
25 name := "bucket replaced"
26 if revoked {
27 name = "scanning revoked"
28 }
29 t.Run(name, func(t *testing.T) {
30 ctx := context.Background()
31 fx, mem, _ := drainFixture(t)
32 scanner := &bucketRecordingScanner{MemScanner: mem}
33 enableStore(t, fx, fixtureAcct, fixtureApp, true)
34 oldBucket := drainBucket(fixtureAcct, fixtureApp)
35 newBucket := oldBucket + "-replacement"
36 key := "report.pdf"
37 for _, bucket := range []string{oldBucket, newBucket} {
38 scanner.PutObject(bucket, key, bucket+"-etag", time.Now(), 12)
39 }
40 enqueueFor(t, fx, fixtureAcct, fixtureApp, key, time.Now())
41 raw := fx.rel.(*release.DirStore)
42 runner := &resultCollectionRunner{DirStore: raw}
43 runner.before = func() {
44 rec, etag, err := objstore.Get(ctx, raw, fixtureAcct, fixtureApp)
45 if err != nil {
46 t.Fatal(err)
47 }
48 if revoked {
49 rec.Scanning.Enabled = nil
50 } else {
51 rec.Provisioned.Bucket = newBucket
52 }
53 if _, err := objstore.Put(ctx, raw, fixtureAcct, fixtureApp, rec, etag); err != nil {
54 t.Fatal(err)
55 }
56 }
57 _, _, err := objstore.DrainApp(ctx, runner, scanner, fx.srv.scanQueue, fixtureAcct, fixtureApp, 50, time.Now())
58 if revoked && !errors.Is(err, objstore.ErrQueueNotPermitted) {
59 t.Fatalf("drain after revoke = %v", err)
60 }
61 if !revoked && err != nil {
62 t.Fatal(err)
63 }
64 want := 1
65 if revoked {
66 want = 0
67 }
68 if len(scanner.buckets) != want || (want == 1 && scanner.buckets[0] != newBucket) {
69 t.Fatalf("scanned buckets = %v, want %d calls to the replacement bucket", scanner.buckets, want)
70 }
71 })
72 }
73}
74