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