carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package release
2
3import (
4 "bytes"
5 "errors"
6 "os"
7 "path/filepath"
8 "strings"
9 "testing"
10 "time"
11
12 "github.com/carlosframework/platform/internal/rootstate"
13)
14
15// Inject the directory-sync boundary after an actual file sync and rename.
16// The embedded interface is intentionally unused: addRootHealthy needs Read
17// and Write only, under the lock already held by recordRootHealthy.
18type healthyRetryStore struct {
19 rootstate.Store
20 dir string
21 fail int
22 syncs int
23 fault error
24}
25
26func (s *healthyRetryStore) Read(name string) ([]byte, error) {
27 return os.ReadFile(filepath.Join(s.dir, name))
28}
29func (s *healthyRetryStore) Write(name string, b []byte) error {
30 f, err := os.CreateTemp(s.dir, "history-")
31 if err != nil {
32 return err
33 }
34 tmp := f.Name()
35 defer os.Remove(tmp)
36 if _, err = f.Write(b); err != nil {
37 f.Close()
38 return err
39 }
40 if err = f.Sync(); err != nil {
41 f.Close()
42 return err
43 }
44 if err = f.Close(); err != nil {
45 return err
46 }
47 if err = os.Rename(tmp, filepath.Join(s.dir, name)); err != nil {
48 return err
49 }
50 s.syncs++
51 if s.fail > 0 {
52 s.fail--
53 return s.fault
54 }
55 d, err := os.Open(s.dir)
56 if err != nil {
57 return err
58 }
59 defer d.Close()
60 return d.Sync()
61}
62func TestPlan14HealthyDuplicateRetryDurability(t *testing.T) {
63 fault := errors.New("injected account directory fsync failure")
64 s := &healthyRetryStore{dir: t.TempDir(), fail: 2, fault: fault}
65 original := HealthyBuild{SHA256: strings.Repeat("a", 64), Version: "v1", How: "live", At: time.Date(2026, 10, 12, 0, 0, 0, 0, time.UTC)}
66 if err := addRootHealthy(s, "console", original); !errors.Is(err, fault) {
67 t.Fatalf("first write: %v", err)
68 }
69 before, err := s.Read("console.json")
70 if err != nil {
71 t.Fatal(err)
72 }
73 retry := original
74 retry.At = retry.At.Add(time.Hour)
75 retry.How = "settle"
76 retry.Version = "renamed"
77 if err = addRootHealthy(s, "console", retry); !errors.Is(err, fault) {
78 t.Fatalf("visible duplicate hid failed directory sync: %v", err)
79 }
80 if err = addRootHealthy(s, "console", retry); err != nil {
81 t.Fatal(err)
82 }
83 if s.syncs != 3 {
84 t.Fatalf("directory sync attempts = %d, want 3", s.syncs)
85 }
86 after, err := s.Read("console.json")
87 if err != nil {
88 t.Fatal(err)
89 }
90 if !bytes.Equal(before, after) {
91 t.Fatal("retry replaced the original evidence bytes")
92 }
93 got, err := decodeRootHealthy(after)
94 if err != nil || len(got) != 1 || got[0] != original {
95 t.Fatalf("evidence = %#v: %v", got, err)
96 }
97}
98