carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package console
2
3import (
4 "bytes"
5 "context"
6 "log/slog"
7 "strings"
8 "testing"
9 "time"
10
11 "github.com/carlosframework/platform/internal/hostactors"
12 "github.com/carlosframework/platform/internal/hostfloor"
13 "github.com/carlosframework/platform/internal/release"
14)
15
16type plan9CollisionStore struct {
17 release.Store
18 cancel context.CancelFunc
19 reads int
20}
21
22func (s *plan9CollisionStore) Get(ctx context.Context, key string) ([]byte, string, error) {
23 if strings.HasPrefix(key, "status/consoles/") {
24 s.reads++
25 if s.reads == 3 {
26 s.cancel()
27 }
28 return plan9Report("foreign:2", time.Now()), "etag", nil
29 }
30 return s.Store.Get(ctx, key)
31}
32func TestPlan9Fix1RepeatedReportCollisionLogsOnceAtInfo(t *testing.T) {
33 s, d, _ := activationFixture(t)
34 observed, err := d.Read(t.Context())
35 if err != nil {
36 t.Fatal(err)
37 }
38 observed.Roster.Consoles["console-2"] = hostactors.Console{Enrollment: strings.Repeat("c", 32), InstanceID: "console-2", Namespaces: []string{"platform"}, DeploymentBucket: d.Bucket}
39 raw, err := release.SignRootEnvelope(release.RootSigner(s.cfg.Key), observed.Roster)
40 if err != nil {
41 t.Fatal(err)
42 }
43 if _, err := d.Store.Put(t.Context(), hostactors.Key, raw, observed.ETag); err != nil {
44 t.Fatal(err)
45 }
46 s.cfg.HostConsoleID, s.cfg.ReleasePub = "console-2", d.PublicKey
47 prior := hostRunningImage
48 hostRunningImage = func() (hostfloor.Running, error) { return hostfloor.Running{BootID: "boot"}, nil }
49 t.Cleanup(func() { hostRunningImage = prior })
50 ctx, cancel := context.WithTimeout(t.Context(), time.Second)
51 defer cancel()
52 spy := &plan9CollisionStore{Store: d.Store, cancel: cancel}
53 s.cfg.Releases = spy
54 var logs bytes.Buffer
55 previousLog := slog.Default()
56 slog.SetDefault(slog.New(slog.NewTextHandler(&logs, nil)))
57 t.Cleanup(func() { slog.SetDefault(previousLog) })
58 ticks := make(chan time.Time, 2)
59 ticks <- time.Now()
60 ticks <- time.Now()
61 s.runHostReports(ctx, ticks)
62 if spy.reads != 3 {
63 t.Fatalf("report ticks=%d, want 3", spy.reads)
64 }
65 if strings.Count(logs.String(), "collision=") != 1 || !strings.Contains(logs.String(), "level=INFO") {
66 t.Fatalf("collision log: %s", logs.String())
67 }
68}
69