github.com/ewagmig/fabric@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/validator/statebasedval/combined_iterator_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 statebasedval
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb"
    23  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb/stateleveldb"
    24  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version"
    25  	"github.com/stretchr/testify/assert"
    26  )
    27  
    28  func TestCombinedIterator(t *testing.T) {
    29  	testDBEnv := stateleveldb.NewTestVDBEnv(t)
    30  	defer testDBEnv.Cleanup()
    31  
    32  	db, err := testDBEnv.DBProvider.GetDBHandle("TestDB")
    33  	assert.NoError(t, err)
    34  
    35  	// populate db with initial data
    36  	batch := statedb.NewUpdateBatch()
    37  	batch.Put("ns", "key1", []byte("value1"), version.NewHeight(1, 1))
    38  	batch.Put("ns", "key4", []byte("value4"), version.NewHeight(1, 1))
    39  	batch.Put("ns", "key6", []byte("value6"), version.NewHeight(1, 1))
    40  	batch.Put("ns", "key8", []byte("value8"), version.NewHeight(1, 1))
    41  	db.ApplyUpdates(batch, version.NewHeight(1, 5))
    42  
    43  	// prepare batch1
    44  	batch1 := statedb.NewUpdateBatch()
    45  	batch1.Put("ns", "key3", []byte("value3"), version.NewHeight(1, 1))
    46  	batch1.Delete("ns", "key5", version.NewHeight(1, 1))
    47  	batch1.Put("ns", "key6", []byte("value6_new"), version.NewHeight(1, 1))
    48  	batch1.Put("ns", "key7", []byte("value7"), version.NewHeight(1, 1))
    49  
    50  	// prepare batch2 (empty)
    51  	batch2 := statedb.NewUpdateBatch()
    52  
    53  	// Test db + batch1 updates (exclude endKey)
    54  	itr1, _ := newCombinedIterator(db, batch1, "ns", "key2", "key8", false)
    55  	defer itr1.Close()
    56  	checkItrResults(t, "ExcludeEndKey", itr1, []*statedb.VersionedKV{
    57  		constructVersionedKV("ns", "key3", []byte("value3"), version.NewHeight(1, 1)),
    58  		constructVersionedKV("ns", "key4", []byte("value4"), version.NewHeight(1, 1)),
    59  		constructVersionedKV("ns", "key6", []byte("value6_new"), version.NewHeight(1, 1)),
    60  		constructVersionedKV("ns", "key7", []byte("value7"), version.NewHeight(1, 1)),
    61  	})
    62  
    63  	// Test db + batch1 updates (include endKey)
    64  	itr1WithEndKey, _ := newCombinedIterator(db, batch1, "ns", "key2", "key8", true)
    65  	defer itr1WithEndKey.Close()
    66  	checkItrResults(t, "IncludeEndKey", itr1WithEndKey, []*statedb.VersionedKV{
    67  		constructVersionedKV("ns", "key3", []byte("value3"), version.NewHeight(1, 1)),
    68  		constructVersionedKV("ns", "key4", []byte("value4"), version.NewHeight(1, 1)),
    69  		constructVersionedKV("ns", "key6", []byte("value6_new"), version.NewHeight(1, 1)),
    70  		constructVersionedKV("ns", "key7", []byte("value7"), version.NewHeight(1, 1)),
    71  		constructVersionedKV("ns", "key8", []byte("value8"), version.NewHeight(1, 1)),
    72  	})
    73  
    74  	// Test db + batch1 updates (include endKey) for extra range
    75  	itr1WithEndKeyExtraRange, _ := newCombinedIterator(db, batch1, "ns", "key0", "key9", true)
    76  	defer itr1WithEndKeyExtraRange.Close()
    77  	checkItrResults(t, "IncludeEndKey_ExtraRange", itr1WithEndKeyExtraRange, []*statedb.VersionedKV{
    78  		constructVersionedKV("ns", "key1", []byte("value1"), version.NewHeight(1, 1)),
    79  		constructVersionedKV("ns", "key3", []byte("value3"), version.NewHeight(1, 1)),
    80  		constructVersionedKV("ns", "key4", []byte("value4"), version.NewHeight(1, 1)),
    81  		constructVersionedKV("ns", "key6", []byte("value6_new"), version.NewHeight(1, 1)),
    82  		constructVersionedKV("ns", "key7", []byte("value7"), version.NewHeight(1, 1)),
    83  		constructVersionedKV("ns", "key8", []byte("value8"), version.NewHeight(1, 1)),
    84  	})
    85  
    86  	// Test db + batch1 updates with full range query
    87  	itr3, _ := newCombinedIterator(db, batch1, "ns", "", "", false)
    88  	defer itr3.Close()
    89  	checkItrResults(t, "ExcludeEndKey_FullRange", itr3, []*statedb.VersionedKV{
    90  		constructVersionedKV("ns", "key1", []byte("value1"), version.NewHeight(1, 1)),
    91  		constructVersionedKV("ns", "key3", []byte("value3"), version.NewHeight(1, 1)),
    92  		constructVersionedKV("ns", "key4", []byte("value4"), version.NewHeight(1, 1)),
    93  		constructVersionedKV("ns", "key6", []byte("value6_new"), version.NewHeight(1, 1)),
    94  		constructVersionedKV("ns", "key7", []byte("value7"), version.NewHeight(1, 1)),
    95  		constructVersionedKV("ns", "key8", []byte("value8"), version.NewHeight(1, 1)),
    96  	})
    97  
    98  	// Test db + batch2 updates
    99  	itr2, _ := newCombinedIterator(db, batch2, "ns", "key2", "key8", false)
   100  	defer itr2.Close()
   101  	checkItrResults(t, "ExcludeEndKey_EmptyUpdates", itr2, []*statedb.VersionedKV{
   102  		constructVersionedKV("ns", "key4", []byte("value4"), version.NewHeight(1, 1)),
   103  		constructVersionedKV("ns", "key6", []byte("value6"), version.NewHeight(1, 1)),
   104  	})
   105  }
   106  
   107  func checkItrResults(t *testing.T, testName string, itr statedb.ResultsIterator, expectedResults []*statedb.VersionedKV) {
   108  	t.Run(testName, func(t *testing.T) {
   109  		for i := 0; i < len(expectedResults); i++ {
   110  			res, _ := itr.Next()
   111  			assert.Equal(t, expectedResults[i], res)
   112  		}
   113  		lastRes, err := itr.Next()
   114  		assert.NoError(t, err)
   115  		assert.Nil(t, lastRes)
   116  	})
   117  }
   118  
   119  func constructVersionedKV(ns string, key string, value []byte, version *version.Height) *statedb.VersionedKV {
   120  	return &statedb.VersionedKV{
   121  		CompositeKey:   statedb.CompositeKey{Namespace: ns, Key: key},
   122  		VersionedValue: statedb.VersionedValue{Value: value, Version: version}}
   123  }