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 }