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 "os"
6 "path/filepath"
7 "testing"
8 "time"
9
10 "github.com/carlosframework/platform/internal/objstore"
11 "github.com/carlosframework/platform/internal/release"
12)
13
14type resultCollectionRunner struct {
15 *release.DirStore
16 before func()
17 beforeDelete func()
18}
19
20func (s *resultCollectionRunner) RunAppMutation(ctx context.Context, account, app, action string, fn func(context.Context) error) error {
21 if s.before != nil {
22 before := s.before
23 s.before = nil
24 before()
25 }
26 return fn(ctx)
27}
28
29func (s *resultCollectionRunner) DeleteIfMatch(ctx context.Context, key, etag string) error {
30 if s.beforeDelete != nil {
31 before := s.beforeDelete
32 s.beforeDelete = nil
33 before()
34 }
35 return s.DirStore.DeleteIfMatch(ctx, key, etag)
36}
37
38func TestRevivalResultCollectionPreservesReplacementBeforePermit(t *testing.T) {
39 testResultCollectionReplacement(t, false)
40}
41
42func TestRevivalResultCollectionConditionallyDeletesObservedRevision(t *testing.T) {
43 testResultCollectionReplacement(t, true)
44}
45
46func testResultCollectionReplacement(t *testing.T, beforeDelete bool) {
47 t.Helper()
48 ctx := context.Background()
49 dir := t.TempDir()
50 raw := release.NewDirStore(dir)
51 old := time.Now().Add(-48 * time.Hour)
52 result := &objstore.ScanResult{
53 Key: "report.pdf", Version: "old-version", Verdict: "clean", At: old,
54 }
55 if err := objstore.WriteScanResult(ctx, raw, "bab", "app", result); err != nil {
56 t.Fatal(err)
57 }
58 path := filepath.Join(dir, objstore.ScanResultKey("bab", "app", result.Key))
59 if err := os.Chtimes(path, old, old); err != nil {
60 t.Fatal(err)
61 }
62 runner := &resultCollectionRunner{DirStore: raw}
63 replace := func() {
64 fresh := &objstore.ScanResult{
65 Key: result.Key, Version: "new-version", Verdict: "infected", At: time.Now(),
66 }
67 if err := objstore.WriteScanResult(ctx, raw, "bab", "app", fresh); err != nil {
68 t.Fatal(err)
69 }
70 }
71 if beforeDelete {
72 runner.beforeDelete = replace
73 } else {
74 runner.before = replace
75 }
76 n, err := objstore.CollectScanResults(ctx, runner, "bab", "app", time.Now().Add(-24*time.Hour))
77 if err != nil || n != 0 {
78 t.Fatalf("collection removed %d results, err %v; the replacement must survive", n, err)
79 }
80 fresh, err := objstore.ReadScanResult(ctx, raw, "bab", "app", result.Key, "new-version")
81 if err != nil || fresh == nil || fresh.Verdict != "infected" {
82 t.Fatalf("replacement result = %+v, err %v", fresh, err)
83 }
84}
85