carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package host
2
3import (
4 "context"
5 "errors"
6 "github.com/carlosframework/platform/internal/hostguard"
7 "github.com/carlosframework/platform/internal/stopevidence"
8 "testing"
9)
10
11type plan11CompositeKernel struct{ writers, noProcess int }
12
13func (*plan11CompositeKernel) VerifyStopped(context.Context, hostguard.FenceTarget, StopInventory, DrainAcknowledgement) (StopKernelEvidence, error) {
14 return StopKernelEvidence{}, nil
15}
16func (k *plan11CompositeKernel) VerifyWritersStopped(context.Context, hostguard.FenceTarget, StopInventory, StopPeer, []stopevidence.DescriptorHint) (WritersKernelEvidence, error) {
17 k.writers++
18 return WritersKernelEvidence{}, nil
19}
20func (k *plan11CompositeKernel) VerifyNoProcess(context.Context, hostguard.FenceTarget, StopInventory) (StopKernelEvidence, error) {
21 k.noProcess++
22 return StopKernelEvidence{}, nil
23}
24
25func TestPlan11IsolatedWrapperPreservesRootObservations(t *testing.T) {
26 f := newLaunchFixture(t, servingOp())
27 if _, err := f.root.Serve(t.Context(), f.peer, f.req); err != nil {
28 t.Fatal(err)
29 }
30 if err := f.journal.CloseWriters(t.Context(), f.target); err != nil {
31 t.Fatal(err)
32 }
33 inner := &plan11CompositeKernel{}
34 k := claimUnitStopKernel{Inner: inner, Journal: f.journal, Units: f.units}
35 writers, ok := any(k).(stopWritersKernel)
36 if !ok {
37 t.Fatal("isolated wrapper hides writers-stopped observation")
38 }
39 zero, ok := any(k).(stopNoProcessKernel)
40 if !ok {
41 t.Fatal("isolated wrapper hides session-zero observation")
42 }
43 f.units.goneErr = errors.New("unit is active")
44 if _, err := writers.VerifyWritersStopped(t.Context(), f.target, StopInventory{}, f.peer, nil); err == nil || inner.writers != 0 {
45 t.Fatal("active isolated writer passed observation")
46 }
47 target := f.target
48 target.Session = 0
49 if _, err := zero.VerifyNoProcess(t.Context(), target, StopInventory{}); err == nil || inner.noProcess != 0 {
50 t.Fatal("active isolated unit passed session-zero observation")
51 }
52 f.units.goneErr = nil
53 if _, err := writers.VerifyWritersStopped(t.Context(), f.target, StopInventory{}, f.peer, nil); err != nil || inner.writers != 1 {
54 t.Fatalf("writers forwarding: %v %d", err, inner.writers)
55 }
56 if _, err := zero.VerifyNoProcess(t.Context(), target, StopInventory{}); err != nil || inner.noProcess != 1 {
57 t.Fatalf("session-zero forwarding: %v %d", err, inner.noProcess)
58 }
59}
60
61func TestPlan11WritersWitnessDoesNotShareCachedSlices(t *testing.T) {
62 f := newWritersFixture(t)
63 first, err := f.attempt.StopWriters(t.Context())
64 if err != nil {
65 t.Fatal(err)
66 }
67 expected := first.DBPaths[0]
68 first.DBPaths[0] = "forged.db"
69 next, err := f.attempt.StopWriters(t.Context())
70 if err != nil {
71 t.Fatal(err)
72 }
73 if next.DBPaths[0] != expected {
74 t.Fatal("caller changed the cached session witness")
75 }
76}
77