carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package hostbox
2
3import (
4 "context"
5 "errors"
6 "testing"
7 "time"
8)
9
10func TestPlan9Fix1PrunedReceiptCannotReplayAfterClockReversal(t *testing.T) {
11 s, path, in := journalFixture(t)
12 origin := time.Now()
13 now := origin
14 s.Now = func() time.Time { return now }
15 issue := func(q JournalRequest) JournalRequest {
16 t.Helper()
17 q, err := journalPrepare(q, now)
18 if err != nil {
19 t.Fatal(err)
20 }
21 return q
22 }
23 if _, err := s.Execute(t.Context(), "peer", issue(JournalRequest{Op: "create", Launch: in})); err != nil {
24 t.Fatal(err)
25 }
26 old := issue(JournalRequest{Op: "producer", Target: in.Target, Producer: "old"})
27 if _, err := s.Execute(t.Context(), "peer", old); err != nil {
28 t.Fatal(err)
29 }
30 now = origin.Add(JournalReceiptRetention + time.Minute)
31 if _, err := s.Execute(t.Context(), "peer", issue(JournalRequest{Op: "producer", Target: in.Target, Producer: "new"})); err != nil {
32 t.Fatal(err)
33 }
34 var n int
35 if err := s.Launches.db.QueryRow("SELECT count(*) FROM journal_requests WHERE id=?", old.ID).Scan(&n); err != nil || n != 0 {
36 t.Fatalf("old receipt was not pruned: count=%d err=%v", n, err)
37 }
38 if err := s.Launches.Close(); err != nil {
39 t.Fatal(err)
40 }
41 journal, err := OpenLaunchJournal(path)
42 if err != nil {
43 t.Fatal(err)
44 }
45 defer journal.Close()
46 s, err = NewJournalService(journal)
47 if err != nil {
48 t.Fatal(err)
49 }
50 now = origin
51 s.Now = func() time.Time { return now }
52 if _, err := s.Execute(t.Context(), "peer", old); !errors.Is(err, ErrJournalUncertain) {
53 t.Fatalf("pruned request executed after clock reversal and root restart: %v", err)
54 }
55 if err := journal.db.QueryRow("SELECT count(*) FROM journal_requests WHERE id=?", old.ID).Scan(&n); err != nil || n != 0 {
56 t.Fatalf("old request regained a receipt: count=%d err=%v", n, err)
57 }
58}
59
60func TestPlan9Fix1DistinctInventoryCallsHaveDistinctNonces(t *testing.T) {
61 s, _, _ := journalFixture(t)
62 var requests []JournalRequest
63 _, client := RemoteJournals(func(ctx context.Context, q JournalRequest) (JournalResponse, error) {
64 if q.Op == "inventory-write" {
65 requests = append(requests, q)
66 }
67 return s.Execute(ctx, "peer", q)
68 })
69 in := StopInventory{Complete: true, Host: "app.example", Incarnation: "inc", InstallationStamp: 1, Box: "box", Enrollment: "enrollment", DirectoryRevision: "1"}
70 if err := client.WriteStopInventory(t.Context(), in); err != nil {
71 t.Fatal(err)
72 }
73 if err := client.WriteStopInventory(t.Context(), in); err != nil {
74 t.Fatal(err)
75 }
76 if len(requests) != 2 || requests[0].ID == requests[1].ID || requests[0].Nonce == "" || requests[1].Nonce == "" {
77 t.Fatalf("distinct inventory writes merged: %+v", requests)
78 }
79}
80
81func TestPlan9Fix1PrunedInventoryReplayNeedsPermanentCommitProof(t *testing.T) {
82 s, _, _ := journalFixture(t)
83 now := time.Now()
84 s.Now = func() time.Time { return now }
85 prepare := func(in StopInventory, revision uint64) JournalRequest {
86 t.Helper()
87 q, err := journalPrepare(JournalRequest{Op: "inventory-write", Inventory: in, Revision: revision}, now)
88 if err != nil {
89 t.Fatal(err)
90 }
91 return q
92 }
93 in := StopInventory{Complete: true, Host: "app.example", Incarnation: "inc", InstallationStamp: 1, Box: "box", Enrollment: "enrollment", DirectoryRevision: "1"}
94 old := prepare(in, 0)
95 if _, err := s.Execute(t.Context(), "peer", old); err != nil {
96 t.Fatal(err)
97 }
98 now = now.Add(JournalReceiptRetention + time.Minute)
99 other := in
100 other.Host = "other.example"
101 if _, err := s.Execute(t.Context(), "peer", prepare(other, 0)); err != nil {
102 t.Fatal(err)
103 }
104 var count int
105 if err := s.Launches.db.QueryRow("SELECT count(*) FROM journal_requests WHERE id=?", old.ID).Scan(&count); err != nil || count != 0 {
106 t.Fatalf("receipt not pruned: count=%d err=%v", count, err)
107 }
108 if _, err := s.Execute(t.Context(), "peer", old); err != nil {
109 t.Fatalf("permanent commit proof did not replay: %v", err)
110 }
111 if _, err := s.Execute(t.Context(), "peer", prepare(in, 1)); err != nil {
112 t.Fatal(err)
113 }
114 if _, err := s.Execute(t.Context(), "peer", old); !errors.Is(err, ErrJournalUncertain) {
115 t.Fatalf("expired request without remaining positive proof: %v", err)
116 }
117}
118