| 1 | package dbreads |
| 2 | |
| 3 | import ( |
| 4 | "bytes" |
| 5 | "strings" |
| 6 | "testing" |
| 7 | "time" |
| 8 | ) |
| 9 | |
| 10 | func TestIDsAreDbrAnd26Base32(t *testing.T) { |
| 11 | t.Parallel() |
| 12 | id, err := NewID(bytes.NewReader(make([]byte, 16))) |
| 13 | if err != nil || id != "dbr_aaaaaaaaaaaaaaaaaaaaaaaaaa" || !ValidID(id) { |
| 14 | t.Fatalf("NewID = %q, %v", id, err) |
| 15 | } |
| 16 | minted, err := MintID() |
| 17 | if err != nil || !ValidID(minted) { |
| 18 | t.Fatalf("MintID = %q, %v", minted, err) |
| 19 | } |
| 20 | for _, bad := range []string{"", "run_aaaaaaaaaaaaaaaaaaaaaaaaaa", "dbr_AAAAAAAAAAAAAAAAAAAAAAAAAA", "dbr_aaaa", "queue", "dbr_aaaaaaaaaaaaaaaaaaaaaaaaa/"} { |
| 21 | if ValidID(bad) { |
| 22 | t.Errorf("ValidID(%q) = true", bad) |
| 23 | } |
| 24 | } |
| 25 | } |
| 26 | |
| 27 | func TestKeysLiveUnderOnePrefix(t *testing.T) { |
| 28 | t.Parallel() |
| 29 | id := "dbr_aaaaaaaaaaaaaaaaaaaaaaaaaa" |
| 30 | for _, k := range []string{RequestKey(id), PickedKey(id), ChunkKey(id, 1), ResultKey(id), CancelKey(id), |
| 31 | QueueKey("uk", time.Date(2026, 10, 22, 9, 0, 5, 0, time.UTC), id)} { |
| 32 | if !strings.HasPrefix(k, "db-reads/") { |
| 33 | t.Errorf("%s is outside db-reads/", k) |
| 34 | } |
| 35 | } |
| 36 | if got := ChunkKey(id, 12); got != "db-reads/"+id+"/out/00000012" { |
| 37 | t.Fatalf("ChunkKey = %s", got) |
| 38 | } |
| 39 | if seq, ok := ParseChunkKey(ChunkKey(id, 12), OutPrefix(id)); !ok || seq != 12 { |
| 40 | t.Fatalf("ParseChunkKey = %d %v", seq, ok) |
| 41 | } |
| 42 | for _, bad := range []string{OutPrefix(id) + "0000001", OutPrefix(id) + "-0000001", OutPrefix(id) + "00000000", OutPrefix(id) + "0000001x"} { |
| 43 | if _, ok := ParseChunkKey(bad, OutPrefix(id)); ok { |
| 44 | t.Errorf("ParseChunkKey(%q) accepted", bad) |
| 45 | } |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | func TestQueueKeyRoundTrips(t *testing.T) { |
| 50 | t.Parallel() |
| 51 | id := "dbr_bbbbbbbbbbbbbbbbbbbbbbbbbb" |
| 52 | issued := time.Date(2026, 10, 22, 10, 59, 50, 0, time.UTC) |
| 53 | key := QueueKey("uk", issued, id) |
| 54 | if key != "db-reads/queue/uk/2026102210/1792666790-"+id { |
| 55 | t.Fatalf("QueueKey = %s", key) |
| 56 | } |
| 57 | e, ok := ParseQueueKey(key) |
| 58 | if !ok || e.Region != "uk" || e.Hour != "2026102210" || !e.Issued.Equal(issued) || e.ID != id { |
| 59 | t.Fatalf("ParseQueueKey = %+v %v", e, ok) |
| 60 | } |
| 61 | for _, bad := range []string{ |
| 62 | "db-reads/queue/uk/2026102210/x-" + id, |
| 63 | "db-reads/queue/uk/20261022/1792666790-" + id, |
| 64 | "db-reads/queue/../2026102210/1792666790-" + id, |
| 65 | "db-reads/queue/uk/2026102210/01792666790-" + id, |
| 66 | "db-reads/queue/uk/2026102210/1792666790-run_bbbbbbbbbbbbbbbbbbbbbbbbbb", |
| 67 | } { |
| 68 | if _, ok := ParseQueueKey(bad); ok { |
| 69 | t.Errorf("ParseQueueKey(%q) accepted", bad) |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | func TestInWindowIs60sPlus60sOfSkew(t *testing.T) { |
| 75 | t.Parallel() |
| 76 | now := time.Date(2026, 10, 22, 9, 0, 0, 0, time.UTC) |
| 77 | for _, c := range []struct { |
| 78 | issued time.Time |
| 79 | want bool |
| 80 | }{ |
| 81 | {now, true}, |
| 82 | {now.Add(-120 * time.Second), true}, |
| 83 | {now.Add(-121 * time.Second), false}, |
| 84 | {now.Add(60 * time.Second), true}, |
| 85 | {now.Add(61 * time.Second), false}, |
| 86 | } { |
| 87 | if got := InWindow(c.issued, now); got != c.want { |
| 88 | t.Errorf("InWindow(%s) = %v", c.issued.Sub(now), got) |
| 89 | } |
| 90 | } |
| 91 | } |
| 92 | |