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 "bytes"
5 "context"
6 "crypto/ed25519"
7 "crypto/rand"
8 "log"
9 "strings"
10 "testing"
11 "time"
12
13 "github.com/carlosframework/platform/internal/hostops"
14 "github.com/carlosframework/platform/internal/release"
15)
16
17func TestConfigureClaimBackfillMissingContractDoesNotFailStartup(t *testing.T) {
18 for _, missing := range []string{"store", "bucket", "public-key"} {
19 t.Run(missing, func(t *testing.T) {
20 s := &Server{cfg: Config{HostClaim: true, Releases: release.NewDirStore(t.TempDir()), Bucket: "bucket", ReleasePub: make(ed25519.PublicKey, ed25519.PublicKeySize)}}
21 switch missing {
22 case "store":
23 s.cfg.Releases = nil
24 case "bucket":
25 s.cfg.Bucket = ""
26 case "public-key":
27 s.cfg.ReleasePub = nil
28 }
29 var logs bytes.Buffer
30 previous := log.Writer()
31 log.SetOutput(&logs)
32 t.Cleanup(func() { log.SetOutput(previous) })
33 if err := s.ConfigureClaimBackfill(); err != nil {
34 t.Errorf("configuration failed startup: %v", err)
35 }
36 if s.cfg.HostClaimOps != nil || !strings.Contains(logs.String(), hostops.ErrContract.Error()) {
37 t.Fatalf("ops=%v log=%q", s.cfg.HostClaimOps, logs.String())
38 }
39 s.StartClaimRecoveryPass(context.Background())
40 })
41 }
42}
43
44func TestClaimBackfillQuietWithoutAdoptingPlan(t *testing.T) {
45 for _, phase := range []string{"absent", "collecting", "done", "future"} {
46 t.Run(phase, func(t *testing.T) {
47 pub, key, err := ed25519.GenerateKey(rand.Reader)
48 if err != nil {
49 t.Fatal(err)
50 }
51 store := release.NewDirStore(t.TempDir())
52 if phase != "absent" {
53 raw, err := release.SignRootEnvelope(release.RootSigner(key), hostops.BackfillPlan{V: 1, ID: "backfill", Phase: phase, CreatedAt: time.Now()})
54 if err != nil {
55 t.Fatal(err)
56 }
57 if _, err := store.Put(context.Background(), hostops.BackfillKey, raw, ""); err != nil {
58 t.Fatal(err)
59 }
60 }
61 s := &Server{cfg: Config{HostClaim: true, Releases: store, Bucket: "bucket", ReleasePub: pub}}
62 if err := s.ConfigureClaimBackfill(); err != nil {
63 t.Fatal(err)
64 }
65 ops := s.cfg.HostClaimOps
66 if ops == nil {
67 t.Fatal("backfill not configured")
68 }
69 if err := s.ConfigureClaimBackfill(); err != nil || s.cfg.HostClaimOps != ops {
70 t.Fatal("controller replaced", err)
71 }
72 var logs bytes.Buffer
73 previous := log.Writer()
74 log.SetOutput(&logs)
75 t.Cleanup(func() { log.SetOutput(previous) })
76 ctx, cancel := context.WithCancel(context.Background())
77 cancel()
78 s.StartClaimRecoveryPass(ctx)
79 if logs.Len() != 0 {
80 t.Fatalf("inactive backfill logged: %s", &logs)
81 }
82 })
83 }
84}
85