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 unix
2
3package hostbox
4
5import (
6 "context"
7 "errors"
8 "testing"
9
10 "github.com/carlosframework/platform/internal/genselect"
11 "github.com/carlosframework/platform/internal/hostclaim"
12)
13
14func TestWriterRefusesMissingEvidenceAndStaleCAS(t *testing.T) {
15 _, store, obs := workFixture(t)
16 ctx := context.Background()
17 in := hostclaim.Admission{Box: "box", Mode: "cold", NewGeneration: "next", Region: "ie", PredecessorRegion: "ie"}
18 writer := Writer{Claims: store, Box: "box", Region: "ie"}
19 if _, err := writer.Admit(ctx, obs, in, nil); !errors.Is(err, ErrUnsupported) {
20 t.Fatal(err)
21 }
22 checks := 0
23 writer.AdmissionEvidence = func(context.Context, hostclaim.Observed, hostclaim.Admission, *genselect.Plan) error {
24 checks++
25 return nil
26 }
27 admitted, err := writer.Admit(ctx, obs, in, nil)
28 if err != nil {
29 t.Fatal(err)
30 }
31 if admitted.Claim.Holder.Session <= obs.Claim.Holder.Session || admitted.Claim.Holder.Generation != "next" {
32 t.Fatal(admitted)
33 }
34 if _, err := writer.Admit(ctx, obs, in, nil); err == nil {
35 t.Fatal("stale observation admitted")
36 }
37 if checks != 2 {
38 t.Fatal(checks)
39 }
40 current, err := hostclaim.Read(ctx, store, obs.Host)
41 if err != nil || current.Claim.Holder.Session != admitted.Claim.Holder.Session {
42 t.Fatal(current, err)
43 }
44 if _, err := writer.Published(ctx, admitted); !errors.Is(err, ErrUnsupported) {
45 t.Fatal(err)
46 }
47 writer.NewID = func() string { return "chore" }
48 writer.PublicationEvidence = func(context.Context, hostclaim.Observed) error { return ErrChanged }
49 if _, err := writer.Published(ctx, admitted); !errors.Is(err, ErrChanged) {
50 t.Fatal(err)
51 }
52 prefix, err := GenerationPrefix(*admitted.Claim.Holder)
53 if err != nil || prefix != "instances/shop.example/g-next/" {
54 t.Fatal(prefix, err)
55 }
56}
57