github.com/ewagmig/fabric@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/validator/internal/val_test.go (about) 1 /* 2 Copyright 2018 Hitachi, Ltd. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package internal 8 9 import ( 10 "testing" 11 12 "github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset" 13 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/privacyenabledstate" 14 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil" 15 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version" 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestNewPubAndHashUpdates(t *testing.T) { 20 expected := &PubAndHashUpdates{ 21 privacyenabledstate.NewPubUpdateBatch(), 22 privacyenabledstate.NewHashedUpdateBatch(), 23 } 24 25 actual := NewPubAndHashUpdates() 26 assert.Equal(t, expected, actual) 27 } 28 29 func TestContainsPostOrderWrites(t *testing.T) { 30 u := NewPubAndHashUpdates() 31 rws := &rwsetutil.TxRwSet{} 32 u.ApplyWriteSet(rws, nil, nil, false) 33 assert.False(t, u.PubUpdates.ContainsPostOrderWrites) 34 u.ApplyWriteSet(rws, nil, nil, true) 35 assert.True(t, u.PubUpdates.ContainsPostOrderWrites) 36 // once set to true, should always return true 37 u.ApplyWriteSet(rws, nil, nil, false) 38 assert.True(t, u.PubUpdates.ContainsPostOrderWrites) 39 } 40 41 func TestContainsPvtWrites_ReturnsTrue(t *testing.T) { 42 chrs1 := &rwsetutil.CollHashedRwSet{PvtRwSetHash: []byte{0}} 43 nrs1 := &rwsetutil.NsRwSet{CollHashedRwSets: []*rwsetutil.CollHashedRwSet{chrs1}} 44 trs1 := &rwsetutil.TxRwSet{NsRwSets: []*rwsetutil.NsRwSet{nrs1}} 45 tx1 := &Transaction{RWSet: trs1} 46 47 ret1 := tx1.ContainsPvtWrites() 48 assert.True(t, ret1) 49 } 50 51 func TestContainsPvtWrites_ReturnsFalse(t *testing.T) { 52 nrs2 := &rwsetutil.NsRwSet{CollHashedRwSets: []*rwsetutil.CollHashedRwSet{}} 53 trs2 := &rwsetutil.TxRwSet{NsRwSets: []*rwsetutil.NsRwSet{nrs2}} 54 tx2 := &Transaction{RWSet: trs2} 55 56 ret2 := tx2.ContainsPvtWrites() 57 assert.False(t, ret2) 58 } 59 60 func TestRetrieveHash(t *testing.T) { 61 expected := []byte{0xde, 0xad, 0xbe, 0xef} 62 coll1 := "coll1" 63 ns1 := "ns1" 64 chrs1 := &rwsetutil.CollHashedRwSet{ 65 CollectionName: coll1, 66 PvtRwSetHash: expected} 67 nrs1 := &rwsetutil.NsRwSet{ 68 NameSpace: ns1, 69 CollHashedRwSets: []*rwsetutil.CollHashedRwSet{chrs1}} 70 trs1 := &rwsetutil.TxRwSet{NsRwSets: []*rwsetutil.NsRwSet{nrs1}} 71 tx1 := &Transaction{RWSet: trs1} 72 73 actual := tx1.RetrieveHash(ns1, coll1) 74 assert.Equal(t, expected, actual) 75 } 76 77 func TestRetrieveHash_RWSetIsNil(t *testing.T) { 78 coll2 := "coll2" 79 ns2 := "ns2" 80 tx2 := &Transaction{RWSet: nil} 81 82 ret2 := tx2.RetrieveHash(ns2, coll2) 83 assert.Nil(t, ret2) 84 } 85 86 func TestRetrieveHash_NsRwSetsNotEqualsToNs(t *testing.T) { 87 coll3 := "coll3" 88 ns3 := "ns3" 89 nrs3 := &rwsetutil.NsRwSet{ 90 NameSpace: "ns", 91 CollHashedRwSets: []*rwsetutil.CollHashedRwSet{}} 92 trs3 := &rwsetutil.TxRwSet{NsRwSets: []*rwsetutil.NsRwSet{nrs3}} 93 tx3 := &Transaction{RWSet: trs3} 94 95 ret3 := tx3.RetrieveHash(ns3, coll3) 96 assert.Nil(t, ret3) 97 } 98 99 func TestApplyWriteSet(t *testing.T) { 100 // Test parameters 101 ns1 := "ns1" 102 ver1 := &version.Height{BlockNum: 1, TxNum: 2} 103 key1, value1 := "key1", []byte{11} 104 key2, value2 := "key2", []byte{22} 105 key3, value3 := []byte{3}, []byte{33} 106 key4, value4 := []byte{4}, []byte{44} 107 coll1 := "coll1" 108 109 // Set initial state. key1/value1, key3/value3 are stored into WriteSet. 110 pahu := NewPubAndHashUpdates() 111 pahu.PubUpdates.Put(ns1, key1, value1, ver1) 112 pahu.HashUpdates.Put(ns1, coll1, key3, value3, ver1) 113 114 // Prepare parameters 115 krs1 := &kvrwset.KVRWSet{Writes: []*kvrwset.KVWrite{ 116 {IsDelete: true, Key: key1}, 117 {IsDelete: false, Key: key2, Value: value2}, 118 }} 119 hrws1 := &kvrwset.HashedRWSet{HashedWrites: []*kvrwset.KVWriteHash{ 120 {IsDelete: true, KeyHash: key3}, 121 {IsDelete: false, KeyHash: key4, ValueHash: value4}, 122 }} 123 chrs1 := &rwsetutil.CollHashedRwSet{HashedRwSet: hrws1, CollectionName: coll1} 124 nrs1 := &rwsetutil.NsRwSet{NameSpace: ns1, KvRwSet: krs1, CollHashedRwSets: []*rwsetutil.CollHashedRwSet{chrs1}} 125 txRWSet1 := &rwsetutil.TxRwSet{NsRwSets: []*rwsetutil.NsRwSet{nrs1}} 126 127 // Set expected state 128 expected := NewPubAndHashUpdates() 129 // Cannot put nil value directly, because it causes panic. 130 // Insted, put real value and delete it. 131 expected.PubUpdates.Put(ns1, key1, value1, ver1) 132 expected.PubUpdates.Delete(ns1, key1, ver1) 133 expected.PubUpdates.Put(ns1, key2, value2, ver1) 134 expected.HashUpdates.Put(ns1, coll1, key3, value3, ver1) 135 expected.HashUpdates.Delete(ns1, coll1, key3, ver1) 136 expected.HashUpdates.Put(ns1, coll1, key4, value4, ver1) 137 138 testdbEnv := &privacyenabledstate.LevelDBCommonStorageTestEnv{} 139 testdbEnv.Init(t) 140 defer testdbEnv.Cleanup() 141 testdb := testdbEnv.GetDBHandle("testdb") 142 143 // Call 144 pahu.ApplyWriteSet(txRWSet1, ver1, testdb, false) 145 146 // Check result 147 assert.Equal(t, expected, pahu) 148 }