carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package moves
2
3import (
4 "crypto/rand"
5 "regexp"
6 "strings"
7 "testing"
8
9 "github.com/carlosframework/platform/internal/provision"
10)
11
12func TestOpIDsAreShapedBySpec(t *testing.T) {
13 // §3: mv_ or rb_ plus 26 lowercase base32 characters.
14 shape := regexp.MustCompile(`^(mv|rb)_[a-z2-7]{26}$`)
15 mv, err := NewMoveID(rand.Reader)
16 if err != nil || !shape.MatchString(mv) {
17 t.Fatalf("move id %q, err %v", mv, err)
18 }
19 rb, err := NewRollbackID(rand.Reader)
20 if err != nil || !shape.MatchString(rb) {
21 t.Fatalf("rollback id %q, err %v", rb, err)
22 }
23 if !ValidOpID(mv) || !ValidOpID(rb) || OpIDKind(mv) != "move" || OpIDKind(rb) != "rollback" {
24 t.Fatal("valid ids refused or misclassified")
25 }
26 for _, bad := range []string{"", "mv_", "MV_abcdefghijklmnopqrstuvwxyz", "mv_abcdefghijklmnopqrstuvwxy1", "mv_abcdefghijklmnopqrstuvwxyz/", "xx_abcdefghijklmnopqrstuvwxyz"} {
27 if ValidOpID(bad) || OpIDKind(bad) != "" {
28 t.Fatalf("%q accepted", bad)
29 }
30 }
31 if a, _ := NewMoveID(rand.Reader); a == mv {
32 t.Fatal("two ids equal")
33 }
34}
35
36func TestOpIDMintFailsOnShortRandomSource(t *testing.T) {
37 if id, err := NewMoveID(strings.NewReader("short")); err == nil || id != "" {
38 t.Fatalf("short reader gave %q, %v", id, err)
39 }
40 if id, err := NewRollbackID(strings.NewReader("")); err == nil || id != "" {
41 t.Fatalf("empty reader gave %q, %v", id, err)
42 }
43}
44
45// opIDShape and provision's two shapes are twins (moves imports provision,
46// so the copy is forced): every id minted here passes provision's check for
47// its kind and fails the other's, and ValidOpID agrees with the pair.
48func TestOpIDShapeTwinsProvision(t *testing.T) {
49 for i := 0; i < 64; i++ {
50 mv, err := NewMoveID(rand.Reader)
51 if err != nil {
52 t.Fatal(err)
53 }
54 rb, err := NewRollbackID(rand.Reader)
55 if err != nil {
56 t.Fatal(err)
57 }
58 if !provision.ValidMoveID(mv) || provision.ValidRollbackID(mv) || !provision.ValidRollbackID(rb) || provision.ValidMoveID(rb) {
59 t.Fatalf("minted %q and %q disagree with provision", mv, rb)
60 }
61 }
62 for _, id := range []string{"mv_abcdefghijklmnopqrstuvwxyz", "rb_abcdefghijklmnopqrstuvwxyz", "rb_short", "xx_abcdefghijklmnopqrstuvwxyz", "rb_ABCDEFGHIJKLMNOPQRSTUVWXYZ", ""} {
63 if ValidOpID(id) != (provision.ValidMoveID(id) || provision.ValidRollbackID(id)) {
64 t.Fatalf("ValidOpID(%q) disagrees with provision", id)
65 }
66 }
67}
68