github.com/ewagmig/fabric@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/rwsetutil/rwset_proto_util_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2016 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package rwsetutil
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/davecgh/go-spew/spew"
    23  	"github.com/golang/protobuf/proto"
    24  	"github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset"
    25  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version"
    26  	"github.com/kr/pretty"
    27  	"github.com/stretchr/testify/assert"
    28  )
    29  
    30  func TestTxRWSetMarshalUnmarshal(t *testing.T) {
    31  	txRwSet := &TxRwSet{}
    32  
    33  	rqi1 := &kvrwset.RangeQueryInfo{StartKey: "k0", EndKey: "k9", ItrExhausted: true}
    34  	SetRawReads(rqi1, []*kvrwset.KVRead{
    35  		{Key: "k1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}},
    36  		{Key: "k2", Version: &kvrwset.Version{BlockNum: 1, TxNum: 2}},
    37  	})
    38  
    39  	rqi2 := &kvrwset.RangeQueryInfo{StartKey: "k00", EndKey: "k90", ItrExhausted: true}
    40  	SetMerkelSummary(rqi2, &kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
    41  
    42  	txRwSet.NsRwSets = []*NsRwSet{
    43  		{NameSpace: "ns1", KvRwSet: &kvrwset.KVRWSet{
    44  			Reads:            []*kvrwset.KVRead{{Key: "key1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
    45  			RangeQueriesInfo: []*kvrwset.RangeQueryInfo{rqi1},
    46  			Writes:           []*kvrwset.KVWrite{{Key: "key2", IsDelete: false, Value: []byte("value2")}},
    47  		}},
    48  
    49  		{NameSpace: "ns2", KvRwSet: &kvrwset.KVRWSet{
    50  			Reads:            []*kvrwset.KVRead{{Key: "key3", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
    51  			RangeQueriesInfo: []*kvrwset.RangeQueryInfo{rqi2},
    52  			Writes:           []*kvrwset.KVWrite{{Key: "key3", IsDelete: false, Value: []byte("value3")}},
    53  		}},
    54  
    55  		{NameSpace: "ns3", KvRwSet: &kvrwset.KVRWSet{
    56  			Reads:            []*kvrwset.KVRead{{Key: "key4", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
    57  			RangeQueriesInfo: nil,
    58  			Writes:           []*kvrwset.KVWrite{{Key: "key4", IsDelete: false, Value: []byte("value4")}},
    59  		}},
    60  	}
    61  
    62  	protoBytes, err := txRwSet.ToProtoBytes()
    63  	assert.NoError(t, err)
    64  	txRwSet1 := &TxRwSet{}
    65  	assert.NoError(t, txRwSet1.FromProtoBytes(protoBytes))
    66  	t.Logf("txRwSet=%s, txRwSet1=%s", spew.Sdump(txRwSet), spew.Sdump(txRwSet1))
    67  	assert.Equal(t, len(txRwSet1.NsRwSets), len(txRwSet.NsRwSets))
    68  	for i, rwset := range txRwSet.NsRwSets {
    69  		assert.Equal(t, txRwSet1.NsRwSets[i].NameSpace, rwset.NameSpace)
    70  		assert.True(t, proto.Equal(txRwSet1.NsRwSets[i].KvRwSet, rwset.KvRwSet), "proto messages are not equal")
    71  		assert.Equal(t, txRwSet1.NsRwSets[i].CollHashedRwSets, rwset.CollHashedRwSets)
    72  	}
    73  }
    74  
    75  func TestTxRwSetConversion(t *testing.T) {
    76  	txRwSet := sampleTxRwSet()
    77  	protoMsg, err := txRwSet.toProtoMsg()
    78  	assert.NoError(t, err)
    79  	txRwSet1, err := TxRwSetFromProtoMsg(protoMsg)
    80  	assert.NoError(t, err)
    81  	t.Logf("txRwSet=%s, txRwSet1=%s", spew.Sdump(txRwSet), spew.Sdump(txRwSet1))
    82  	assert.Equal(t, len(txRwSet1.NsRwSets), len(txRwSet.NsRwSets))
    83  	for i, rwset := range txRwSet.NsRwSets {
    84  		assert.Equal(t, txRwSet1.NsRwSets[i].NameSpace, rwset.NameSpace)
    85  		assert.True(t, proto.Equal(txRwSet1.NsRwSets[i].KvRwSet, rwset.KvRwSet), "proto messages are not equal")
    86  		for j, hashedRwSet := range rwset.CollHashedRwSets {
    87  			assert.Equal(t, txRwSet1.NsRwSets[i].CollHashedRwSets[j].CollectionName, hashedRwSet.CollectionName)
    88  			assert.True(t, proto.Equal(txRwSet1.NsRwSets[i].CollHashedRwSets[j].HashedRwSet, hashedRwSet.HashedRwSet), "proto messages are not equal")
    89  			assert.Equal(t, txRwSet1.NsRwSets[i].CollHashedRwSets[j].PvtRwSetHash, hashedRwSet.PvtRwSetHash)
    90  		}
    91  	}
    92  }
    93  
    94  func TestNsRwSetConversion(t *testing.T) {
    95  	nsRwSet := sampleNsRwSet("ns-1")
    96  	protoMsg, err := nsRwSet.toProtoMsg()
    97  	assert.NoError(t, err)
    98  	nsRwSet1, err := nsRwSetFromProtoMsg(protoMsg)
    99  	assert.NoError(t, err)
   100  	t.Logf("nsRwSet=%s, nsRwSet1=%s", spew.Sdump(nsRwSet), spew.Sdump(nsRwSet1))
   101  	assert.Equal(t, nsRwSet1.NameSpace, nsRwSet.NameSpace)
   102  	assert.True(t, proto.Equal(nsRwSet1.KvRwSet, nsRwSet.KvRwSet), "proto messages are not equal")
   103  	for j, hashedRwSet := range nsRwSet.CollHashedRwSets {
   104  		assert.Equal(t, nsRwSet1.CollHashedRwSets[j].CollectionName, hashedRwSet.CollectionName)
   105  		assert.True(t, proto.Equal(nsRwSet1.CollHashedRwSets[j].HashedRwSet, hashedRwSet.HashedRwSet), "proto messages are not equal")
   106  		assert.Equal(t, nsRwSet1.CollHashedRwSets[j].PvtRwSetHash, hashedRwSet.PvtRwSetHash)
   107  	}
   108  }
   109  
   110  func TestNsRWSetConversionNoCollHashedRWs(t *testing.T) {
   111  	nsRwSet := sampleNsRwSetWithNoCollHashedRWs("ns-1")
   112  	protoMsg, err := nsRwSet.toProtoMsg()
   113  	assert.NoError(t, err)
   114  	assert.Nil(t, protoMsg.CollectionHashedRwset)
   115  }
   116  
   117  func TestCollHashedRwSetConversion(t *testing.T) {
   118  	collHashedRwSet := sampleCollHashedRwSet("coll-1")
   119  	protoMsg, err := collHashedRwSet.toProtoMsg()
   120  	assert.NoError(t, err)
   121  	collHashedRwSet1, err := collHashedRwSetFromProtoMsg(protoMsg)
   122  	assert.NoError(t, err)
   123  	assert.Equal(t, collHashedRwSet.CollectionName, collHashedRwSet1.CollectionName)
   124  	assert.True(t, proto.Equal(collHashedRwSet.HashedRwSet, collHashedRwSet1.HashedRwSet), "proto messages are not equal")
   125  	assert.Equal(t, collHashedRwSet.PvtRwSetHash, collHashedRwSet1.PvtRwSetHash)
   126  }
   127  
   128  func TestNumCollections(t *testing.T) {
   129  	var txRwSet *TxRwSet
   130  	assert.Equal(t, 0, txRwSet.NumCollections())         // nil TxRwSet
   131  	assert.Equal(t, 0, (&TxRwSet{}).NumCollections())    // empty TxRwSet
   132  	assert.Equal(t, 4, sampleTxRwSet().NumCollections()) // sample TxRwSet
   133  }
   134  
   135  func sampleTxRwSet() *TxRwSet {
   136  	txRwSet := &TxRwSet{}
   137  	txRwSet.NsRwSets = append(txRwSet.NsRwSets, sampleNsRwSet("ns-1"))
   138  	txRwSet.NsRwSets = append(txRwSet.NsRwSets, sampleNsRwSet("ns-2"))
   139  	return txRwSet
   140  }
   141  
   142  func sampleNsRwSet(ns string) *NsRwSet {
   143  	nsRwSet := &NsRwSet{
   144  		NameSpace: ns,
   145  		KvRwSet:   sampleKvRwSet(),
   146  	}
   147  	nsRwSet.CollHashedRwSets = append(nsRwSet.CollHashedRwSets, sampleCollHashedRwSet("coll-1"))
   148  	nsRwSet.CollHashedRwSets = append(nsRwSet.CollHashedRwSets, sampleCollHashedRwSet("coll-2"))
   149  	return nsRwSet
   150  }
   151  
   152  func sampleNsRwSetWithNoCollHashedRWs(ns string) *NsRwSet {
   153  	return &NsRwSet{NameSpace: ns, KvRwSet: sampleKvRwSet()}
   154  }
   155  
   156  func sampleKvRwSet() *kvrwset.KVRWSet {
   157  	rqi1 := &kvrwset.RangeQueryInfo{StartKey: "k0", EndKey: "k9", ItrExhausted: true}
   158  	SetRawReads(rqi1, []*kvrwset.KVRead{
   159  		{Key: "k1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}},
   160  		{Key: "k2", Version: &kvrwset.Version{BlockNum: 1, TxNum: 2}},
   161  	})
   162  
   163  	rqi2 := &kvrwset.RangeQueryInfo{StartKey: "k00", EndKey: "k90", ItrExhausted: true}
   164  	SetMerkelSummary(rqi2, &kvrwset.QueryReadsMerkleSummary{MaxDegree: 5, MaxLevel: 4, MaxLevelHashes: [][]byte{[]byte("Hash-1"), []byte("Hash-2")}})
   165  	return &kvrwset.KVRWSet{
   166  		Reads:            []*kvrwset.KVRead{{Key: "key1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
   167  		RangeQueriesInfo: []*kvrwset.RangeQueryInfo{rqi1},
   168  		Writes:           []*kvrwset.KVWrite{{Key: "key2", IsDelete: false, Value: []byte("value2")}},
   169  	}
   170  }
   171  
   172  func sampleCollHashedRwSet(collectionName string) *CollHashedRwSet {
   173  	collHashedRwSet := &CollHashedRwSet{
   174  		CollectionName: collectionName,
   175  		HashedRwSet: &kvrwset.HashedRWSet{
   176  			HashedReads: []*kvrwset.KVReadHash{
   177  				{KeyHash: []byte("Key-1-hash"), Version: &kvrwset.Version{BlockNum: 1, TxNum: 2}},
   178  				{KeyHash: []byte("Key-2-hash"), Version: &kvrwset.Version{BlockNum: 2, TxNum: 3}},
   179  			},
   180  			HashedWrites: []*kvrwset.KVWriteHash{
   181  				{KeyHash: []byte("Key-3-hash"), ValueHash: []byte("value-3-hash"), IsDelete: false},
   182  				{KeyHash: []byte("Key-4-hash"), ValueHash: []byte("value-4-hash"), IsDelete: true},
   183  			},
   184  		},
   185  		PvtRwSetHash: []byte(collectionName + "-pvt-rwset-hash"),
   186  	}
   187  	return collHashedRwSet
   188  }
   189  
   190  ///////////////////////////////////////////////////////////////////////////////
   191  // tests for private read-write set
   192  ///////////////////////////////////////////////////////////////////////////////
   193  
   194  func TestTxPvtRwSetConversion(t *testing.T) {
   195  	txPvtRwSet := sampleTxPvtRwSet()
   196  	protoMsg, err := txPvtRwSet.toProtoMsg()
   197  	assert.NoError(t, err)
   198  	txPvtRwSet1, err := TxPvtRwSetFromProtoMsg(protoMsg)
   199  	assert.NoError(t, err)
   200  	t.Logf("txPvtRwSet=%s, txPvtRwSet1=%s, Diff:%s", spew.Sdump(txPvtRwSet), spew.Sdump(txPvtRwSet1), pretty.Diff(txPvtRwSet, txPvtRwSet1))
   201  	assert.Equal(t, len(txPvtRwSet1.NsPvtRwSet), len(txPvtRwSet.NsPvtRwSet))
   202  	for i, rwset := range txPvtRwSet.NsPvtRwSet {
   203  		assert.Equal(t, txPvtRwSet1.NsPvtRwSet[i].NameSpace, rwset.NameSpace)
   204  		for j, hashedRwSet := range rwset.CollPvtRwSets {
   205  			assert.Equal(t, txPvtRwSet1.NsPvtRwSet[i].CollPvtRwSets[j].CollectionName, hashedRwSet.CollectionName)
   206  			assert.True(t, proto.Equal(txPvtRwSet1.NsPvtRwSet[i].CollPvtRwSets[j].KvRwSet, hashedRwSet.KvRwSet), "proto messages are not equal")
   207  		}
   208  	}
   209  }
   210  
   211  func sampleTxPvtRwSet() *TxPvtRwSet {
   212  	txPvtRwSet := &TxPvtRwSet{}
   213  	txPvtRwSet.NsPvtRwSet = append(txPvtRwSet.NsPvtRwSet, sampleNsPvtRwSet("ns-1"))
   214  	txPvtRwSet.NsPvtRwSet = append(txPvtRwSet.NsPvtRwSet, sampleNsPvtRwSet("ns-2"))
   215  	return txPvtRwSet
   216  }
   217  
   218  func sampleNsPvtRwSet(ns string) *NsPvtRwSet {
   219  	nsRwSet := &NsPvtRwSet{NameSpace: ns}
   220  	nsRwSet.CollPvtRwSets = append(nsRwSet.CollPvtRwSets, sampleCollPvtRwSet("coll-1"))
   221  	nsRwSet.CollPvtRwSets = append(nsRwSet.CollPvtRwSets, sampleCollPvtRwSet("coll-2"))
   222  	return nsRwSet
   223  }
   224  
   225  func sampleCollPvtRwSet(collectionName string) *CollPvtRwSet {
   226  	return &CollPvtRwSet{CollectionName: collectionName,
   227  		KvRwSet: &kvrwset.KVRWSet{
   228  			Reads:  []*kvrwset.KVRead{{Key: "key1", Version: &kvrwset.Version{BlockNum: 1, TxNum: 1}}},
   229  			Writes: []*kvrwset.KVWrite{{Key: "key2", IsDelete: false, Value: []byte("value2")}},
   230  		}}
   231  }
   232  
   233  func TestVersionConversion(t *testing.T) {
   234  	protoVer := &kvrwset.Version{BlockNum: 5, TxNum: 2}
   235  	internalVer := version.NewHeight(5, 2)
   236  	// convert proto to internal
   237  	assert.Nil(t, NewVersion(nil))
   238  	assert.Equal(t, internalVer, NewVersion(protoVer))
   239  
   240  	// convert internal to proto
   241  	assert.Nil(t, newProtoVersion(nil))
   242  	assert.Equal(t, protoVer, newProtoVersion(internalVer))
   243  }