github.com/Hnampk/fabric@v2.1.1+incompatible/core/ledger/kvledger/txmgmt/rwsetutil/query_results_helper_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  	"crypto/sha256"
    21  	"fmt"
    22  	"testing"
    23  
    24  	"github.com/golang/protobuf/proto"
    25  	"github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset"
    26  	"github.com/hyperledger/fabric/bccsp/sw"
    27  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version"
    28  	"github.com/stretchr/testify/assert"
    29  )
    30  
    31  func TestQueryResultHelper_NoResults(t *testing.T) {
    32  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
    33  	assert.NoError(t, err)
    34  	helper, _ := NewRangeQueryResultsHelper(true, 3, cryptoProvider)
    35  	r, h, err := helper.Done()
    36  	assert.NoError(t, err)
    37  	assert.Nil(t, h)
    38  	assert.Nil(t, r)
    39  }
    40  
    41  func TestQueryResultHelper_HashNotEnabled(t *testing.T) {
    42  	kvReads := buildTestKVReads(t, 5)
    43  	r, h := buildTestResults(t, false, 3, kvReads)
    44  	assert.Nil(t, h)
    45  	assert.Equal(t, kvReads, r)
    46  }
    47  
    48  func TestQueryResultHelper_ResultsNoMoreThanMaxDegree(t *testing.T) {
    49  	maxDegree := 3
    50  	numResults := 3
    51  	kvReads := buildTestKVReads(t, numResults)
    52  	r, h := buildTestResults(t, true, maxDegree, kvReads)
    53  	assert.Nil(t, h)
    54  	assert.Equal(t, kvReads, r)
    55  }
    56  
    57  func TestQueryResultHelper_Hash_OneLevel(t *testing.T) {
    58  	maxDegree := 3
    59  	kvReads := buildTestKVReads(t, 9)
    60  	r, h := buildTestResults(t, true, maxDegree, kvReads)
    61  	level1_1 := computeTestHashKVReads(t, kvReads[0:4])
    62  	level1_2 := computeTestHashKVReads(t, kvReads[4:8])
    63  	level1_3 := computeTestHashKVReads(t, kvReads[8:])
    64  	assert.Nil(t, r)
    65  	assert.Equal(t, &kvrwset.QueryReadsMerkleSummary{
    66  		MaxDegree:      uint32(maxDegree),
    67  		MaxLevel:       1,
    68  		MaxLevelHashes: hashesToBytes([]Hash{level1_1, level1_2, level1_3})}, h)
    69  
    70  }
    71  
    72  func TestQueryResultHelper_Hash_TwoLevel(t *testing.T) {
    73  	maxDegree := 3
    74  	kvReads := buildTestKVReads(t, 25)
    75  	r, h := buildTestResults(t, true, maxDegree, kvReads)
    76  	level1_1 := computeTestHashKVReads(t, kvReads[0:4])
    77  	level1_2 := computeTestHashKVReads(t, kvReads[4:8])
    78  	level1_3 := computeTestHashKVReads(t, kvReads[8:12])
    79  	level1_4 := computeTestHashKVReads(t, kvReads[12:16])
    80  	level1_5 := computeTestHashKVReads(t, kvReads[16:20])
    81  	level1_6 := computeTestHashKVReads(t, kvReads[20:24])
    82  	level1_7 := computeTestHashKVReads(t, kvReads[24:])
    83  
    84  	level2_1 := computeTestCombinedHash(t, level1_1, level1_2, level1_3, level1_4)
    85  	level2_2 := computeTestCombinedHash(t, level1_5, level1_6, level1_7)
    86  	assert.Nil(t, r)
    87  	assert.Equal(t, &kvrwset.QueryReadsMerkleSummary{
    88  		MaxDegree:      uint32(maxDegree),
    89  		MaxLevel:       2,
    90  		MaxLevelHashes: hashesToBytes([]Hash{level2_1, level2_2})}, h)
    91  
    92  }
    93  
    94  func TestQueryResultHelper_Hash_ThreeLevel(t *testing.T) {
    95  	maxDegree := 3
    96  	kvReads := buildTestKVReads(t, 65)
    97  	r, h := buildTestResults(t, true, maxDegree, kvReads)
    98  	level1_1 := computeTestHashKVReads(t, kvReads[0:4])
    99  	level1_2 := computeTestHashKVReads(t, kvReads[4:8])
   100  	level1_3 := computeTestHashKVReads(t, kvReads[8:12])
   101  	level1_4 := computeTestHashKVReads(t, kvReads[12:16])
   102  	level1_5 := computeTestHashKVReads(t, kvReads[16:20])
   103  	level1_6 := computeTestHashKVReads(t, kvReads[20:24])
   104  	level1_7 := computeTestHashKVReads(t, kvReads[24:28])
   105  	level1_8 := computeTestHashKVReads(t, kvReads[28:32])
   106  	level1_9 := computeTestHashKVReads(t, kvReads[32:36])
   107  	level1_10 := computeTestHashKVReads(t, kvReads[36:40])
   108  	level1_11 := computeTestHashKVReads(t, kvReads[40:44])
   109  	level1_12 := computeTestHashKVReads(t, kvReads[44:48])
   110  	level1_13 := computeTestHashKVReads(t, kvReads[48:52])
   111  	level1_14 := computeTestHashKVReads(t, kvReads[52:56])
   112  	level1_15 := computeTestHashKVReads(t, kvReads[56:60])
   113  	level1_16 := computeTestHashKVReads(t, kvReads[60:64])
   114  	level1_17 := computeTestHashKVReads(t, kvReads[64:])
   115  
   116  	level2_1 := computeTestCombinedHash(t, level1_1, level1_2, level1_3, level1_4)
   117  	level2_2 := computeTestCombinedHash(t, level1_5, level1_6, level1_7, level1_8)
   118  	level2_3 := computeTestCombinedHash(t, level1_9, level1_10, level1_11, level1_12)
   119  	level2_4 := computeTestCombinedHash(t, level1_13, level1_14, level1_15, level1_16)
   120  
   121  	level3_1 := computeTestCombinedHash(t, level2_1, level2_2, level2_3, level2_4)
   122  	level3_2 := level1_17
   123  	assert.Nil(t, r)
   124  	assert.Equal(t, &kvrwset.QueryReadsMerkleSummary{
   125  		MaxDegree:      uint32(maxDegree),
   126  		MaxLevel:       3,
   127  		MaxLevelHashes: hashesToBytes([]Hash{level3_1, level3_2})}, h)
   128  
   129  }
   130  
   131  func TestQueryResultHelper_Hash_MaxLevelIncrementNeededInDone(t *testing.T) {
   132  	maxDegree := 2
   133  	kvReads := buildTestKVReads(t, 24)
   134  	r, h := buildTestResults(t, true, maxDegree, kvReads)
   135  	level1_1 := computeTestHashKVReads(t, kvReads[0:3])
   136  	level1_2 := computeTestHashKVReads(t, kvReads[3:6])
   137  	level1_3 := computeTestHashKVReads(t, kvReads[6:9])
   138  	level1_4 := computeTestHashKVReads(t, kvReads[9:12])
   139  	level1_5 := computeTestHashKVReads(t, kvReads[12:15])
   140  	level1_6 := computeTestHashKVReads(t, kvReads[15:18])
   141  	level1_7 := computeTestHashKVReads(t, kvReads[18:21])
   142  	level1_8 := computeTestHashKVReads(t, kvReads[21:24])
   143  
   144  	level2_1 := computeTestCombinedHash(t, level1_1, level1_2, level1_3)
   145  	level2_2 := computeTestCombinedHash(t, level1_4, level1_5, level1_6)
   146  	level2_3 := computeTestCombinedHash(t, level1_7, level1_8)
   147  
   148  	level3_1 := computeTestCombinedHash(t, level2_1, level2_2, level2_3)
   149  
   150  	assert.Nil(t, r)
   151  	assert.Equal(t, &kvrwset.QueryReadsMerkleSummary{
   152  		MaxDegree:      uint32(maxDegree),
   153  		MaxLevel:       3,
   154  		MaxLevelHashes: hashesToBytes([]Hash{level3_1})}, h)
   155  
   156  }
   157  
   158  func TestQueryResultHelper_Hash_FirstLevelSkipNeededInDone(t *testing.T) {
   159  	maxDegree := 2
   160  	kvReads := buildTestKVReads(t, 45)
   161  	r, h := buildTestResults(t, true, maxDegree, kvReads)
   162  	level1_1 := computeTestHashKVReads(t, kvReads[0:3])
   163  	level1_2 := computeTestHashKVReads(t, kvReads[3:6])
   164  	level1_3 := computeTestHashKVReads(t, kvReads[6:9])
   165  	level1_4 := computeTestHashKVReads(t, kvReads[9:12])
   166  	level1_5 := computeTestHashKVReads(t, kvReads[12:15])
   167  	level1_6 := computeTestHashKVReads(t, kvReads[15:18])
   168  	level1_7 := computeTestHashKVReads(t, kvReads[18:21])
   169  	level1_8 := computeTestHashKVReads(t, kvReads[21:24])
   170  	level1_9 := computeTestHashKVReads(t, kvReads[24:27])
   171  	level1_10 := computeTestHashKVReads(t, kvReads[27:30])
   172  	level1_11 := computeTestHashKVReads(t, kvReads[30:33])
   173  	level1_12 := computeTestHashKVReads(t, kvReads[33:36])
   174  	level1_13 := computeTestHashKVReads(t, kvReads[36:39])
   175  	level1_14 := computeTestHashKVReads(t, kvReads[39:42])
   176  	level1_15 := computeTestHashKVReads(t, kvReads[42:45])
   177  
   178  	level2_1 := computeTestCombinedHash(t, level1_1, level1_2, level1_3)
   179  	level2_2 := computeTestCombinedHash(t, level1_4, level1_5, level1_6)
   180  	level2_3 := computeTestCombinedHash(t, level1_7, level1_8, level1_9)
   181  	level2_4 := computeTestCombinedHash(t, level1_10, level1_11, level1_12)
   182  	level2_5 := computeTestCombinedHash(t, level1_13, level1_14, level1_15)
   183  
   184  	level3_1 := computeTestCombinedHash(t, level2_1, level2_2, level2_3)
   185  	level3_2 := computeTestCombinedHash(t, level2_4, level2_5)
   186  
   187  	assert.Nil(t, r)
   188  	assert.Equal(t, &kvrwset.QueryReadsMerkleSummary{
   189  		MaxDegree:      uint32(maxDegree),
   190  		MaxLevel:       3,
   191  		MaxLevelHashes: hashesToBytes([]Hash{level3_1, level3_2})}, h)
   192  
   193  }
   194  
   195  func buildTestResults(t *testing.T, enableHashing bool, maxDegree int, kvReads []*kvrwset.KVRead) ([]*kvrwset.KVRead, *kvrwset.QueryReadsMerkleSummary) {
   196  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   197  	assert.NoError(t, err)
   198  	helper, _ := NewRangeQueryResultsHelper(enableHashing, uint32(maxDegree), cryptoProvider)
   199  	for _, kvRead := range kvReads {
   200  		helper.AddResult(kvRead)
   201  	}
   202  	r, h, err := helper.Done()
   203  	assert.NoError(t, err)
   204  	return r, h
   205  }
   206  
   207  func buildTestKVReads(t *testing.T, num int) []*kvrwset.KVRead {
   208  	kvreads := []*kvrwset.KVRead{}
   209  	for i := 0; i < num; i++ {
   210  		kvreads = append(kvreads, NewKVRead(fmt.Sprintf("key_%d", i), version.NewHeight(1, uint64(i))))
   211  	}
   212  	return kvreads
   213  }
   214  
   215  func computeTestHashKVReads(t *testing.T, kvReads []*kvrwset.KVRead) Hash {
   216  	queryReads := &kvrwset.QueryReads{}
   217  	queryReads.KvReads = kvReads
   218  	b, err := proto.Marshal(queryReads)
   219  	assert.NoError(t, err)
   220  	hash := sha256.New()
   221  	_, err = hash.Write(b)
   222  	assert.NoError(t, err)
   223  	h := hash.Sum(nil)
   224  	return h
   225  }
   226  
   227  func computeTestCombinedHash(t *testing.T, hashes ...Hash) Hash {
   228  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   229  	assert.NoError(t, err)
   230  	h, err := computeCombinedHash(hashes, cryptoProvider)
   231  	assert.NoError(t, err)
   232  	return h
   233  }