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  }