github.com/renegr87/renegr87@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 }