github.com/Finschia/finschia-sdk@v0.48.1/store/internal/proofs/create_test.go (about) 1 package proofs 2 3 import ( 4 "errors" 5 "testing" 6 7 ics23 "github.com/confio/ics23/go" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestCreateMembership(t *testing.T) { 12 cases := map[string]struct { 13 size int 14 loc Where 15 }{ 16 "small left": {size: 100, loc: Left}, 17 "small middle": {size: 100, loc: Middle}, 18 "small right": {size: 100, loc: Right}, 19 "big left": {size: 5431, loc: Left}, 20 "big middle": {size: 5431, loc: Middle}, 21 "big right": {size: 5431, loc: Right}, 22 } 23 24 for name, tc := range cases { 25 t.Run(name, func(t *testing.T) { 26 data := BuildMap(tc.size) 27 allkeys := SortedKeys(data) 28 key := GetKey(allkeys, tc.loc) 29 val := data[key] 30 proof, err := CreateMembershipProof(data, []byte(key)) 31 if err != nil { 32 t.Fatalf("Creating Proof: %+v", err) 33 } 34 if proof.GetExist() == nil { 35 t.Fatal("Unexpected proof format") 36 } 37 38 root := CalcRoot(data) 39 err = proof.GetExist().Verify(TendermintSpec, root, []byte(key), val) 40 if err != nil { 41 t.Fatalf("Verifying Proof: %+v", err) 42 } 43 44 valid := ics23.VerifyMembership(TendermintSpec, root, proof, []byte(key), val) 45 if !valid { 46 t.Fatalf("Membership Proof Invalid") 47 } 48 }) 49 } 50 } 51 52 func TestCreateNonMembership(t *testing.T) { 53 cases := map[string]struct { 54 size int 55 loc Where 56 }{ 57 "small left": {size: 100, loc: Left}, 58 "small middle": {size: 100, loc: Middle}, 59 "small right": {size: 100, loc: Right}, 60 "big left": {size: 5431, loc: Left}, 61 "big middle": {size: 5431, loc: Middle}, 62 "big right": {size: 5431, loc: Right}, 63 } 64 65 for name, tc := range cases { 66 t.Run(name, func(t *testing.T) { 67 data := BuildMap(tc.size) 68 allkeys := SortedKeys(data) 69 key := GetNonKey(allkeys, tc.loc) 70 71 proof, err := CreateNonMembershipProof(data, []byte(key)) 72 if err != nil { 73 t.Fatalf("Creating Proof: %+v", err) 74 } 75 if proof.GetNonexist() == nil { 76 t.Fatal("Unexpected proof format") 77 } 78 79 root := CalcRoot(data) 80 err = proof.GetNonexist().Verify(TendermintSpec, root, []byte(key)) 81 if err != nil { 82 t.Fatalf("Verifying Proof: %+v", err) 83 } 84 85 valid := ics23.VerifyNonMembership(TendermintSpec, root, proof, []byte(key)) 86 if !valid { 87 t.Fatalf("Non Membership Proof Invalid") 88 } 89 }) 90 } 91 } 92 93 func TestInvalidKey(t *testing.T) { 94 tests := []struct { 95 name string 96 f func(data map[string][]byte, key []byte) (*ics23.CommitmentProof, error) 97 data map[string][]byte 98 key []byte 99 err error 100 }{ 101 {"CreateMembershipProof empty key", CreateMembershipProof, map[string][]byte{"": nil}, []byte(""), ErrEmptyKey}, 102 {"CreateMembershipProof empty key in data", CreateMembershipProof, map[string][]byte{"": nil, " ": nil}, []byte(" "), ErrEmptyKeyInData}, 103 {"CreateNonMembershipProof empty key", CreateNonMembershipProof, map[string][]byte{" ": nil}, []byte(""), ErrEmptyKey}, 104 {"CreateNonMembershipProof empty key in data", CreateNonMembershipProof, map[string][]byte{"": nil}, []byte(" "), ErrEmptyKeyInData}, 105 } 106 for _, tc := range tests { 107 t.Run(tc.name, func(t *testing.T) { 108 _, err := tc.f(tc.data, tc.key) 109 assert.True(t, errors.Is(err, tc.err)) 110 }) 111 } 112 }