@@ -17,6 +17,7 @@ import (
17
17
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil"
18
18
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/validator/valinternal"
19
19
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version"
20
+ lgrutil "github.com/hyperledger/fabric/core/ledger/util"
20
21
lutils "github.com/hyperledger/fabric/core/ledger/util"
21
22
"github.com/hyperledger/fabric/protos/common"
22
23
"github.com/hyperledger/fabric/protos/peer"
@@ -117,8 +118,10 @@ func TestValidateAndPreparePvtBatch(t *testing.T) {
117
118
tx3TxRWSet , err := rwsetutil .TxRwSetFromProtoMsg (tx3SimulationResults .PubSimulationResults )
118
119
assert .NoError (t , err )
119
120
expectedPerProcessedBlock .Txs = append (expectedPerProcessedBlock .Txs , & valinternal.Transaction {IndexInBlock : 2 , ID : "tx3" , RWSet : tx3TxRWSet })
120
-
121
- actualPreProcessedBlock , err := preprocessProtoBlock (nil , block , false )
121
+ alwaysValidKVFunc := func (key string , value []byte ) error {
122
+ return nil
123
+ }
124
+ actualPreProcessedBlock , err := preprocessProtoBlock (nil , alwaysValidKVFunc , block , false )
122
125
assert .NoError (t , err )
123
126
assert .Equal (t , expectedPerProcessedBlock , actualPreProcessedBlock )
124
127
@@ -149,25 +152,27 @@ func TestValidateAndPreparePvtBatch(t *testing.T) {
149
152
}
150
153
151
154
func TestPreprocessProtoBlock (t * testing.T ) {
152
-
155
+ allwaysValidKVfunc := func (key string , value []byte ) error {
156
+ return nil
157
+ }
153
158
// good block
154
159
//_, gb := testutil.NewBlockGenerator(t, "testLedger", false)
155
160
gb := testutil .ConstructTestBlock (t , 10 , 1 , 1 )
156
- _ , err := preprocessProtoBlock (nil , gb , false )
161
+ _ , err := preprocessProtoBlock (nil , allwaysValidKVfunc , gb , false )
157
162
assert .NoError (t , err )
158
163
// bad envelope
159
164
gb = testutil .ConstructTestBlock (t , 11 , 1 , 1 )
160
165
gb .Data = & common.BlockData {Data : [][]byte {{123 }}}
161
166
gb .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ] =
162
167
lutils .NewTxValidationFlagsSetValue (len (gb .Data .Data ), peer .TxValidationCode_VALID )
163
- _ , err = preprocessProtoBlock (nil , gb , false )
168
+ _ , err = preprocessProtoBlock (nil , allwaysValidKVfunc , gb , false )
164
169
assert .Error (t , err )
165
170
t .Log (err )
166
171
// bad payload
167
172
gb = testutil .ConstructTestBlock (t , 12 , 1 , 1 )
168
173
envBytes , _ := putils .GetBytesEnvelope (& common.Envelope {Payload : []byte {123 }})
169
174
gb .Data = & common.BlockData {Data : [][]byte {envBytes }}
170
- _ , err = preprocessProtoBlock (nil , gb , false )
175
+ _ , err = preprocessProtoBlock (nil , allwaysValidKVfunc , gb , false )
171
176
assert .Error (t , err )
172
177
t .Log (err )
173
178
// bad channel header
@@ -177,7 +182,7 @@ func TestPreprocessProtoBlock(t *testing.T) {
177
182
})
178
183
envBytes , _ = putils .GetBytesEnvelope (& common.Envelope {Payload : payloadBytes })
179
184
gb .Data = & common.BlockData {Data : [][]byte {envBytes }}
180
- _ , err = preprocessProtoBlock (nil , gb , false )
185
+ _ , err = preprocessProtoBlock (nil , allwaysValidKVfunc , gb , false )
181
186
assert .Error (t , err )
182
187
t .Log (err )
183
188
@@ -191,7 +196,7 @@ func TestPreprocessProtoBlock(t *testing.T) {
191
196
flags := lutils .NewTxValidationFlags (len (gb .Data .Data ))
192
197
flags .SetFlag (0 , peer .TxValidationCode_BAD_CHANNEL_HEADER )
193
198
gb .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ] = flags
194
- _ , err = preprocessProtoBlock (nil , gb , false )
199
+ _ , err = preprocessProtoBlock (nil , allwaysValidKVfunc , gb , false )
195
200
assert .NoError (t , err ) // invalid filter should take precendence
196
201
197
202
// new block
@@ -205,7 +210,7 @@ func TestPreprocessProtoBlock(t *testing.T) {
205
210
// set logging backend for test
206
211
backend := logging .NewMemoryBackend (1 )
207
212
logging .SetBackend (backend )
208
- _ , err = preprocessProtoBlock (nil , gb , false )
213
+ _ , err = preprocessProtoBlock (nil , allwaysValidKVfunc , gb , false )
209
214
assert .NoError (t , err )
210
215
expected := fmt .Sprintf ("Channel [%s]: Block [%d] Transaction index [%d] TxId [%s]" +
211
216
" marked as invalid by committer. Reason code [%s]" ,
@@ -217,6 +222,42 @@ func TestPreprocessProtoBlock(t *testing.T) {
217
222
218
223
}
219
224
225
+ func TestPreprocessProtoBlockInvalidWriteset (t * testing.T ) {
226
+ kvValidationFunc := func (key string , value []byte ) error {
227
+ if value [0 ] == '_' {
228
+ return fmt .Errorf ("value [%s] found to be invalid by 'kvValidationFunc for testing'" , value )
229
+ }
230
+ return nil
231
+ }
232
+
233
+ rwSetBuilder := rwsetutil .NewRWSetBuilder ()
234
+ rwSetBuilder .AddToWriteSet ("ns" , "key" , []byte ("_invalidValue" )) // bad value
235
+ simulation1 , err := rwSetBuilder .GetTxSimulationResults ()
236
+ assert .NoError (t , err )
237
+ simulation1Bytes , err := simulation1 .GetPubSimulationBytes ()
238
+ assert .NoError (t , err )
239
+
240
+ rwSetBuilder = rwsetutil .NewRWSetBuilder ()
241
+ rwSetBuilder .AddToWriteSet ("ns" , "key" , []byte ("validValue" )) // good value
242
+ simulation2 , err := rwSetBuilder .GetTxSimulationResults ()
243
+ assert .NoError (t , err )
244
+ simulation2Bytes , err := simulation2 .GetPubSimulationBytes ()
245
+ assert .NoError (t , err )
246
+
247
+ block := testutil .ConstructBlock (t , 1 , testutil .ConstructRandomBytes (t , 32 ),
248
+ [][]byte {simulation1Bytes , simulation2Bytes }, false ) // block with two txs
249
+ txfilter := lgrutil .TxValidationFlags (block .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ])
250
+ assert .True (t , txfilter .IsValid (0 ))
251
+ assert .True (t , txfilter .IsValid (1 )) // both txs are valid initially at the time of block cutting
252
+
253
+ internalBlock , err := preprocessProtoBlock (nil , kvValidationFunc , block , false )
254
+ assert .NoError (t , err )
255
+ assert .False (t , txfilter .IsValid (0 )) // tx at index 0 should be marked as invalid
256
+ assert .True (t , txfilter .IsValid (1 )) // tx at index 1 should be marked as valid
257
+ assert .Len (t , internalBlock .Txs , 1 )
258
+ assert .Equal (t , internalBlock .Txs [0 ].IndexInBlock , 1 )
259
+ }
260
+
220
261
// from go-logging memory_test.go
221
262
func memoryRecordN (b * logging.MemoryBackend , n int ) * logging.Record {
222
263
node := b .Head ()
0 commit comments