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