carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package hostbox
2
3import (
4 "context"
5 "database/sql"
6 "errors"
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/carlosframework/platform/internal/genselect"
12)
13
14func TestColdRestoreEnrollmentPrecedesEveryMutation(t *testing.T) {
15 for _, empty := range []bool{false, true} {
16 for _, refuse := range []string{"", "legacy", "enroll"} {
17 t.Run(map[bool]string{false: "baseline", true: "empty"}[empty]+"/"+refuse, func(t *testing.T) {
18 db := filepath.Join(t.TempDir(), "legacy.db")
19 legacy := []byte("legacy database")
20 if err := os.WriteFile(db, legacy, 0600); err != nil {
21 t.Fatal(err)
22 }
23 work := &restoreWork{}
24 key, body, crc := snapshotFixture(t, "production-restore")
25 rd := &restoreReader{data: map[string][]byte{key + "@v1": body}}
26 plan := &genselect.Plan{Generation: "baseline", MaxTXID: 1, Pin: &genselect.Pin{SnapshotCRC64: crc}, Files: []genselect.File{{Key: key, VersionID: "v1", Level: 9, MinTXID: 1, MaxTXID: 1, Size: int64(len(body))}}}
27 var calls []string
28 failure := errors.New("injected enrollment refusal")
29 r := ColdRestore{Reader: rd, Bucket: "bucket", Generation: "new", Work: work,
30 BeforeLegacyInstall: func(_ context.Context, path, generation string) error {
31 if work.active || path != db || generation != "new" {
32 t.Fatal("legacy callback boundary")
33 }
34 calls = append(calls, "legacy")
35 if refuse == "legacy" {
36 return failure
37 }
38 if string(mustRead(t, db)) != string(legacy) {
39 t.Fatal("legacy source changed before parking")
40 }
41 // Explicit parking seam; root identity/retention belongs to the host tests.
42 return os.Rename(db, db+".parked")
43 },
44 BeforeInstallLocked: func(_ context.Context, path, generation string) error {
45 if !work.active || path != db || generation != "new" {
46 t.Fatal("enrollment callback boundary")
47 }
48 calls = append(calls, "enroll")
49 if _, err := os.Stat(db); !errors.Is(err, os.ErrNotExist) {
50 t.Fatal("database appeared before enrollment")
51 }
52 if _, err := os.Stat(db + ".gen"); !errors.Is(err, os.ErrNotExist) {
53 t.Fatal("marker appeared before enrollment")
54 }
55 if refuse == "enroll" {
56 return failure
57 }
58 return nil
59 }}
60 var err error
61 if empty {
62 err = r.InstallEmpty(t.Context(), db, func(context.Context) error { return nil })
63 } else {
64 err = r.Install(t.Context(), db, plan)
65 }
66 if refuse != "" {
67 if !errors.Is(err, failure) {
68 t.Fatalf("refusal: %v", err)
69 }
70 if _, err := os.Stat(db + ".gen"); !errors.Is(err, os.ErrNotExist) {
71 t.Fatal("refused enrollment wrote marker")
72 }
73 if refuse == "legacy" {
74 if string(mustRead(t, db)) != string(legacy) {
75 t.Fatal("refusal destroyed legacy database")
76 }
77 } else if string(mustRead(t, db+".parked")) != string(legacy) {
78 t.Fatal("refusal destroyed park")
79 }
80 return
81 }
82 if err != nil {
83 t.Fatal(err)
84 }
85 if len(calls) != 2 || calls[0] != "legacy" || calls[1] != "enroll" {
86 t.Fatalf("callbacks %v", calls)
87 }
88 if string(mustRead(t, db+".gen")) != "new\n" {
89 t.Fatal("missing successor marker")
90 }
91 if empty {
92 if _, err := os.Stat(db); !errors.Is(err, os.ErrNotExist) {
93 t.Fatal("empty restore wrote a database")
94 }
95 return
96 }
97 check, err := sql.Open("sqlite", db)
98 if err != nil {
99 t.Fatal(err)
100 }
101 defer check.Close()
102 var value string
103 if err := check.QueryRow("SELECT value FROM fixture").Scan(&value); err != nil || value != "production-restore" {
104 t.Fatalf("restored %q: %v", value, err)
105 }
106 })
107 }
108 }
109}
110