carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1//go:build linux
2
3package host
4
5import (
6 "os"
7 "path/filepath"
8 "slices"
9 "strings"
10 "testing"
11)
12
13func plan11Rev4ReplaceRuntimeMask(t *testing.T) {
14 t.Helper()
15 replacement := filepath.Join(filepath.Dir(claimEdgeRuntimeMask), "operator-mask")
16 if err := os.Symlink("/dev/null", replacement); err != nil {
17 t.Fatal(err)
18 }
19 if err := os.Rename(replacement, claimEdgeRuntimeMask); err != nil {
20 t.Fatal(err)
21 }
22}
23
24// A same-boot boot-ID record can be an intent written before mask(2), not
25// proof that the migration created the mask now at the unit path. Recovery
26// must leave that ambiguous runtime mask in place.
27func TestPlan11Rev4IntentBeforeMaskCrashKeepsLaterOperatorMask(t *testing.T) {
28 var calls []string
29 plan9Fix2Systemctl(t, "masked-runtime", &calls)
30 owner := plan9Fix2MaskOwner(t)
31 if err := os.WriteFile(owner, []byte(plan9Fix2Boot(t)), 0600); err != nil {
32 t.Fatal(err)
33 }
34 if err := recoverLegacyClaimEdgeMask(t.Context()); err != nil {
35 t.Fatal(err)
36 }
37 for _, call := range calls {
38 if strings.HasPrefix(call, "unmask ") {
39 t.Fatalf("ambiguous operator mask was lifted: %v", calls)
40 }
41 }
42 if target, err := os.Readlink(claimEdgeRuntimeMask); err != nil || target != "/dev/null" {
43 t.Fatalf("operator mask changed: %q %v", target, err)
44 }
45}
46
47func TestPlan11Rev4IdentityIntentBeforeLinkKeepsLaterOperatorMask(t *testing.T) {
48 var calls []string
49 plan9Fix2Systemctl(t, "masked-runtime", &calls)
50 owner := plan9Fix2MaskOwner(t)
51 token := strings.Repeat("b", 32)
52 anchor := claimEdgeMaskAnchor(token)
53 if err := os.Symlink("/dev/null", anchor); err != nil {
54 t.Fatal(err)
55 }
56 record, err := currentClaimEdgeMask(anchor, plan9Fix2Boot(t), token)
57 if err != nil {
58 t.Fatal(err)
59 }
60 if err = writeClaimEdgeMaskRecord(record); err != nil {
61 t.Fatal(err)
62 }
63 if err = recoverLegacyClaimEdgeMask(t.Context()); err != nil {
64 t.Fatal(err)
65 }
66 if slices.Contains(calls, "unmask --runtime carlos-edge.service") {
67 t.Fatalf("intent authorised a later operator mask: %v", calls)
68 }
69 if target, err := os.Readlink(claimEdgeRuntimeMask); err != nil || target != "/dev/null" {
70 t.Fatalf("operator mask changed: %q %v", target, err)
71 }
72 if _, err = os.Stat(owner); !os.IsNotExist(err) {
73 t.Fatalf("stale intent remains: %v", err)
74 }
75 if _, err = os.Lstat(anchor); !os.IsNotExist(err) {
76 t.Fatalf("stale intent anchor remains: %v", err)
77 }
78}
79
80func TestPlan11Rev4ReleaseKeepsSameTargetOperatorReplacement(t *testing.T) {
81 var calls []string
82 plan9Fix2Systemctl(t, "enabled", &calls)
83 owner := plan9Fix2MaskOwner(t)
84 release, err := quiesceLegacyClaimJournals(t.Context())
85 if err != nil {
86 t.Fatal(err)
87 }
88 plan11Rev4ReplaceRuntimeMask(t)
89 calls = nil
90 release()
91 if slices.Contains(calls, "unmask --runtime carlos-edge.service") {
92 t.Fatalf("replacement mask was lifted: %v", calls)
93 }
94 if target, err := os.Readlink(claimEdgeRuntimeMask); err != nil || target != "/dev/null" {
95 t.Fatalf("replacement mask changed: %q %v", target, err)
96 }
97 if _, err = os.Stat(owner); !os.IsNotExist(err) {
98 t.Fatalf("stale ownership record remains: %v", err)
99 }
100}
101
102func TestPlan11Rev4CompletedRecoveryKeepsSameTargetReplacement(t *testing.T) {
103 var calls []string
104 plan9Fix2Systemctl(t, "masked-runtime", &calls)
105 owner := plan9Fix2MaskOwner(t)
106 plan11Rev4WriteOwnedMask(t, owner)
107 plan11Rev4ReplaceRuntimeMask(t)
108 calls = nil
109 if err := recoverLegacyClaimEdgeMask(t.Context()); err != nil {
110 t.Fatal(err)
111 }
112 if slices.Contains(calls, "unmask --runtime carlos-edge.service") {
113 t.Fatalf("completed recovery lifted replacement mask: %v", calls)
114 }
115 if target, err := os.Readlink(claimEdgeRuntimeMask); err != nil || target != "/dev/null" {
116 t.Fatalf("replacement mask changed: %q %v", target, err)
117 }
118}
119
120func TestPlan11Rev4OwnedIdentityIsDurableAndCleansUp(t *testing.T) {
121 var calls []string
122 plan9Fix2Systemctl(t, "enabled", &calls)
123 owner := plan9Fix2MaskOwner(t)
124 release, err := quiesceLegacyClaimJournals(t.Context())
125 if err != nil {
126 t.Fatal(err)
127 }
128 raw, err := os.ReadFile(owner)
129 if err != nil {
130 t.Fatal(err)
131 }
132 record, recorded := decodeClaimEdgeMaskRecord(raw, plan9Fix2Boot(t))
133 if !recorded {
134 t.Fatalf("ownership record is not a concrete identity: %q", raw)
135 }
136 if ours, identityErr := claimEdgeMaskStillOwned(record); identityErr != nil || !ours {
137 t.Fatalf("ownership does not name the live mask: %v %v", ours, identityErr)
138 }
139 info, err := os.Stat(owner)
140 if err != nil {
141 t.Fatal(err)
142 }
143 if info.Mode().Perm() != 0600 {
144 t.Fatalf("ownership mode = %o, want 0600", info.Mode().Perm())
145 }
146 if _, err = os.Stat(owner + ".tmp"); !os.IsNotExist(err) {
147 t.Fatalf("durable-write temporary remains: %v", err)
148 }
149 release()
150 if !slices.Contains(calls, "unmask --runtime carlos-edge.service") {
151 t.Fatalf("owned mask was not lifted: %v", calls)
152 }
153 if _, err = os.Lstat(claimEdgeRuntimeMask); !os.IsNotExist(err) {
154 t.Fatalf("owned runtime mask remains: %v", err)
155 }
156 if _, err = os.Stat(owner); !os.IsNotExist(err) {
157 t.Fatalf("owned mask record remains: %v", err)
158 }
159 if _, err = os.Lstat(claimEdgeMaskAnchor(record.Token)); !os.IsNotExist(err) {
160 t.Fatalf("owned mask anchor remains: %v", err)
161 }
162}
163