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 "context"
5 "errors"
6 "strings"
7 "testing"
8)
9
10type taggedWorkerStore struct {
11 WorkerControlStore
12 readTag, writeTag *string
13}
14
15func (s taggedWorkerStore) Get(ctx context.Context, key string) ([]byte, string, error) {
16 raw, tag, err := s.WorkerControlStore.Get(ctx, key)
17 if s.readTag != nil {
18 tag = *s.readTag
19 }
20 return raw, tag, err
21}
22func (s taggedWorkerStore) Put(ctx context.Context, key string, raw []byte, etag string) (string, error) {
23 tag, err := s.WorkerControlStore.Put(ctx, key, raw, etag)
24 if s.writeTag != nil {
25 tag = *s.writeTag
26 }
27 return tag, err
28}
29func TestWorkerAssignmentBoundsEveryReturnedETag(t *testing.T) {
30 for _, length := range []int{0, maxWorkerControlETagBytes, maxWorkerControlETagBytes + 1} {
31 priv, pub := testKeys(t)
32 sg := RootSigner(priv)
33 ctx := t.Context()
34 store := NewDirStore(t.TempDir())
35 initial := workerTestAssignment()
36 snap, err := CreateWorkerAssignment(ctx, store, sg, initial)
37 if err != nil {
38 t.Fatal(err)
39 }
40 tag := strings.Repeat("a", length)
41 bad := taggedWorkerStore{WorkerControlStore: store, readTag: &tag}
42 _, err = ReadWorkerAssignment(ctx, bad, pub, initial.Identity)
43 if (length == maxWorkerControlETagBytes) != (err == nil) {
44 t.Fatalf("read length %d: %v", length, err)
45 }
46 snap.etag = tag
47 if _, err := snap.State(pub); (length == maxWorkerControlETagBytes) != (err == nil) {
48 t.Fatalf("snapshot length %d: %v", length, err)
49 }
50 if length == maxWorkerControlETagBytes {
51 continue
52 }
53 counted := &countedWorkerStore{WorkerControlStore: store}
54 after := initial
55 after.Revision++
56 after.Disabled = true
57 if _, err := AdvanceWorkerAssignment(ctx, counted, sg, snap, after); !errors.Is(err, ErrWorkerControl) {
58 t.Fatal("invalid snapshot sent to store", err)
59 }
60 if counted.puts.Load() != 0 {
61 t.Fatal("invalid ETag reached conditional write")
62 }
63 }
64}
65func TestWorkerAssignmentInvalidWriteETagIsUncertain(t *testing.T) {
66 for _, create := range []bool{false, true} {
67 priv, pub := testKeys(t)
68 sg := RootSigner(priv)
69 ctx := t.Context()
70 store := NewDirStore(t.TempDir())
71 initial := workerTestAssignment()
72 tag := strings.Repeat("a", maxWorkerControlETagBytes+1)
73 bad := taggedWorkerStore{WorkerControlStore: store, writeTag: &tag}
74 expected := initial
75 var err error
76 if create {
77 _, err = CreateWorkerAssignment(ctx, bad, sg, initial)
78 } else {
79 before, e := CreateWorkerAssignment(ctx, store, sg, initial)
80 if e != nil {
81 t.Fatal(e)
82 }
83 expected.Revision++
84 expected.Disabled = true
85 _, err = AdvanceWorkerAssignment(ctx, bad, sg, before, expected)
86 }
87 if !errors.Is(err, ErrWorkerControl) {
88 t.Fatal("invalid write ETag accepted", err)
89 }
90 recovered, e := ReadWorkerAssignment(ctx, store, pub, initial.Identity)
91 if e != nil {
92 t.Fatal(e)
93 }
94 got, e := recovered.State(pub)
95 if e != nil || got.Revision != expected.Revision || got.Disabled != expected.Disabled {
96 t.Fatal("uncertain write was lost", e)
97 }
98 }
99}
100func TestWorkerAssignmentEnabledNoSlotChangeNeverWrites(t *testing.T) {
101 priv, _ := testKeys(t)
102 sg := RootSigner(priv)
103 store := &countedWorkerStore{WorkerControlStore: NewDirStore(t.TempDir())}
104 state := workerTestAssignment()
105 before, err := CreateWorkerAssignment(t.Context(), store, sg, state)
106 if err != nil {
107 t.Fatal(err)
108 }
109 writes := store.puts.Load()
110 state.Revision++
111 if _, err := AdvanceWorkerAssignment(t.Context(), store, sg, before, state); !errors.Is(err, ErrWorkerControl) {
112 t.Fatal("enabled no-op accepted", err)
113 }
114 if store.puts.Load() != writes {
115 t.Fatal("enabled no-op reached storage")
116 }
117}
118