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