carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package dbreads
2
3import (
4 "bytes"
5 "errors"
6 "testing"
7 "time"
8)
9
10const sealID = "dbr_aaaaaaaaaaaaaaaaaaaaaaaaaa"
11
12func TestChunkSealRoundTripsAndBindsEverything(t *testing.T) {
13 t.Parallel()
14 priv, err := NewReplyKey()
15 if err != nil {
16 t.Fatal(err)
17 }
18 plain := bytes.Repeat([]byte("row\n"), 1000)
19 sealed, err := SealChunk(priv.PublicKey(), sealID, 3, StreamRows, false, plain)
20 if err != nil {
21 t.Fatal(err)
22 }
23 if len(sealed)-len(plain) >= 100 || len(sealed)-len(plain) != SealOverhead {
24 t.Fatalf("overhead %d, spec §5.7 says under 100 bytes", len(sealed)-len(plain))
25 }
26 got, err := OpenChunk(priv, sealID, 3, StreamRows, false, sealed)
27 if err != nil || !bytes.Equal(got, plain) {
28 t.Fatalf("OpenChunk = %v", err)
29 }
30 other, _ := NewReplyKey()
31 for name, open := range map[string]func() ([]byte, error){
32 "moved to another read": func() ([]byte, error) {
33 return OpenChunk(priv, "dbr_bbbbbbbbbbbbbbbbbbbbbbbbbb", 3, StreamRows, false, sealed)
34 },
35 "reordered": func() ([]byte, error) { return OpenChunk(priv, sealID, 4, StreamRows, false, sealed) },
36 "relabelled as last": func() ([]byte, error) { return OpenChunk(priv, sealID, 3, StreamRows, true, sealed) },
37 "another stream": func() ([]byte, error) { return OpenChunk(priv, sealID, 3, StreamLTX, false, sealed) },
38 "another key": func() ([]byte, error) { return OpenChunk(other, sealID, 3, StreamRows, false, sealed) },
39 "truncated": func() ([]byte, error) { return OpenChunk(priv, sealID, 3, StreamRows, false, sealed[:len(sealed)-1]) },
40 } {
41 if _, err := open(); !errors.Is(err, ErrSeal) {
42 t.Errorf("%s: %v", name, err)
43 }
44 }
45}
46
47func TestSummarySealRoundTrips(t *testing.T) {
48 t.Parallel()
49 priv, _ := NewReplyKey()
50 want := Summary{TXID: 42, At: time.Date(2026, 10, 7, 14, 0, 0, 0, time.UTC), Bytes: 10, SHA256: "ab"}
51 sealed, err := SealSummary(priv.PublicKey(), sealID, want)
52 if err != nil {
53 t.Fatal(err)
54 }
55 got, err := OpenSummary(priv, sealID, sealed)
56 if err != nil || got.TXID != want.TXID || !got.At.Equal(want.At) || got.SHA256 != want.SHA256 {
57 t.Fatalf("OpenSummary = %+v, %v", got, err)
58 }
59 if _, err := OpenSummary(priv, "dbr_bbbbbbbbbbbbbbbbbbbbbbbbbb", sealed); !errors.Is(err, ErrSeal) {
60 t.Fatalf("a summary moved to another read opened: %v", err)
61 }
62}
63
64func TestReplyKeyRefusesWhatIsNotAnUncompressedPoint(t *testing.T) {
65 t.Parallel()
66 for _, bad := range []string{"", "AAAA", "!!!!"} {
67 if _, err := ParseReplyKey(bad); err == nil {
68 t.Errorf("ParseReplyKey(%q) accepted", bad)
69 }
70 }
71}
72
73func TestResultValidKnowsTheVocabulary(t *testing.T) {
74 t.Parallel()
75 ok := []Result{
76 {State: StateDone, LastSeq: 1},
77 {State: StateDone, Code: CodeOutputCap, LastSeq: 3},
78 {State: StateFailed, Code: CodeSQLError},
79 {State: StateRefused, Code: CodeRecordChanged},
80 {State: StateCancelled},
81 }
82 for _, r := range ok {
83 if err := r.Valid(); err != nil {
84 t.Errorf("%+v: %v", r, err)
85 }
86 }
87 bad := []Result{
88 {State: StateDone, LastSeq: 0},
89 {State: "maybe"},
90 {State: StateFailed, Code: "nope"},
91 {State: StateDone, LastSeq: -1},
92 }
93 for _, r := range bad {
94 if err := r.Valid(); err == nil {
95 t.Errorf("%+v accepted", r)
96 }
97 }
98}
99