@@ -159,6 +159,17 @@ func (mock *committerMock) Close() {
159
159
mock .Called ()
160
160
}
161
161
162
+ type validatorMock struct {
163
+ err error
164
+ }
165
+
166
+ func (v * validatorMock ) Validate (block * common.Block ) error {
167
+ if v .err != nil {
168
+ return v .err
169
+ }
170
+ return nil
171
+ }
172
+
162
173
type digests []* proto.PvtDataDigest
163
174
164
175
func (d digests ) Equal (other digests ) bool {
@@ -425,6 +436,84 @@ var expectedCommittedPrivateData2 = map[uint64]*ledger.TxPvtData{
425
436
}},
426
437
}
427
438
439
+ func TestCoordinatorStoreInvalidBlock (t * testing.T ) {
440
+ hash := util2 .ComputeSHA256 ([]byte ("rws-pre-image" ))
441
+ committer := & committerMock {}
442
+ committer .On ("CommitWithPvtData" , mock .Anything ).Run (func (args mock.Arguments ) {
443
+ t .Fatal ("Shouldn't have committed" )
444
+ }).Return (nil )
445
+ store := & mockTransientStore {t : t }
446
+ fetcher := & fetcherMock {t : t }
447
+ pdFactory := & pvtDataFactory {}
448
+ bf := & blockFactory {
449
+ channelID : "test" ,
450
+ }
451
+
452
+ block := bf .withoutMetadata ().create ()
453
+ // Scenario I: Block we got doesn't have any metadata with it
454
+ pvtData := pdFactory .create ()
455
+ coordinator := NewCoordinator (committer , store , fetcher , & validatorMock {})
456
+ err := coordinator .StoreBlock (block , pvtData )
457
+ assert .Error (t , err )
458
+ assert .Contains (t , err .Error (), "Block.Metadata is nil or Block.Metadata lacks a Tx filter bitmap" )
459
+
460
+ // Scenario II: Validator has an error while validating the block
461
+ block = bf .create ()
462
+ pvtData = pdFactory .create ()
463
+ coordinator = NewCoordinator (committer , store , fetcher , & validatorMock {fmt .Errorf ("failed validating block" )})
464
+ err = coordinator .StoreBlock (block , pvtData )
465
+ assert .Error (t , err )
466
+ assert .Contains (t , err .Error (), "failed validating block" )
467
+
468
+ // Scenario III: Block we got contains an inadequate length of Tx filter in the metadata
469
+ block = bf .withMetadataSize (100 ).create ()
470
+ pvtData = pdFactory .create ()
471
+ coordinator = NewCoordinator (committer , store , fetcher , & validatorMock {})
472
+ err = coordinator .StoreBlock (block , pvtData )
473
+ assert .Error (t , err )
474
+ assert .Contains (t , err .Error (), "Block data size" )
475
+ assert .Contains (t , err .Error (), "is different from Tx filter size" )
476
+
477
+ // Scenario IV: The second transaction in the block we got is invalid, and we have no private data for that.
478
+ // If the coordinator would try to fetch private data, the test would fall because we haven't defined the
479
+ // mock operations for the transientstore (or for gossip) in this test.
480
+ var commitHappened bool
481
+ assertCommitHappened := func () {
482
+ assert .True (t , commitHappened )
483
+ commitHappened = false
484
+ }
485
+ committer = & committerMock {}
486
+ committer .On ("CommitWithPvtData" , mock .Anything ).Run (func (args mock.Arguments ) {
487
+ var privateDataPassed2Ledger privateData = args .Get (0 ).(* ledger.BlockAndPvtData ).BlockPvtData
488
+ commitHappened = true
489
+ // Only the first transaction's private data is passed to the ledger
490
+ assert .Len (t , privateDataPassed2Ledger , 1 )
491
+ assert .Equal (t , 0 , int (privateDataPassed2Ledger [0 ].SeqInBlock ))
492
+ // The private data passed to the ledger contains "ns1" and has 2 collections in it
493
+ assert .Len (t , privateDataPassed2Ledger [0 ].WriteSet .NsPvtRwset , 1 )
494
+ assert .Equal (t , "ns1" , privateDataPassed2Ledger [0 ].WriteSet .NsPvtRwset [0 ].Namespace )
495
+ assert .Len (t , privateDataPassed2Ledger [0 ].WriteSet .NsPvtRwset [0 ].CollectionPvtRwset , 2 )
496
+ }).Return (nil )
497
+ block = bf .withInvalidTxns (1 ).AddTxn ("tx1" , "ns1" , hash , "c1" , "c2" ).AddTxn ("tx2" , "ns2" , hash , "c1" ).create ()
498
+ pvtData = pdFactory .addRWSet ().addNSRWSet ("ns1" , "c1" , "c2" ).create ()
499
+ coordinator = NewCoordinator (committer , store , fetcher , & validatorMock {})
500
+ err = coordinator .StoreBlock (block , pvtData )
501
+ assert .NoError (t , err )
502
+ assertCommitHappened ()
503
+
504
+ // Scenario V: Block doesn't contain a header
505
+ block .Header = nil
506
+ err = coordinator .StoreBlock (block , pvtData )
507
+ assert .Error (t , err )
508
+ assert .Contains (t , err .Error (), "Block header is nil" )
509
+
510
+ // Scenario V: Block doesn't contain Data
511
+ block .Data = nil
512
+ err = coordinator .StoreBlock (block , pvtData )
513
+ assert .Error (t , err )
514
+ assert .Contains (t , err .Error (), "Block data is empty" )
515
+ }
516
+
428
517
func TestCoordinatorStoreBlock (t * testing.T ) {
429
518
// Green path test, all private data should be obtained successfully
430
519
var commitHappened bool
@@ -452,7 +541,7 @@ func TestCoordinatorStoreBlock(t *testing.T) {
452
541
// If the coordinator tries fetching from the transientstore, or peers it would result in panic,
453
542
// because we didn't define yet the "On(...)" invocation of the transient store or other peers.
454
543
pvtData := pdFactory .addRWSet ().addNSRWSet ("ns1" , "c1" , "c2" ).addRWSet ().addNSRWSet ("ns2" , "c1" ).create ()
455
- coordinator := NewCoordinator (committer , store , fetcher )
544
+ coordinator := NewCoordinator (committer , store , fetcher , & validatorMock {} )
456
545
err := coordinator .StoreBlock (block , pvtData )
457
546
assert .NoError (t , err )
458
547
assertCommitHappened ()
@@ -551,7 +640,7 @@ func TestCoordinatorStoreBlock(t *testing.T) {
551
640
assert .True (t , privateDataPassed2Ledger .Equal (expectedCommittedPrivateData2 ))
552
641
commitHappened = true
553
642
}).Return (nil )
554
- coordinator = NewCoordinator (committer , store , fetcher )
643
+ coordinator = NewCoordinator (committer , store , fetcher , & validatorMock {} )
555
644
err = coordinator .StoreBlock (block , nil )
556
645
assert .NoError (t , err )
557
646
assertCommitHappened ()
@@ -561,7 +650,7 @@ func TestCoordinatorGetBlocks(t *testing.T) {
561
650
committer := & committerMock {}
562
651
store := & mockTransientStore {t : t }
563
652
fetcher := & fetcherMock {t : t }
564
- coordinator := NewCoordinator (committer , store , fetcher )
653
+ coordinator := NewCoordinator (committer , store , fetcher , & validatorMock {} )
565
654
566
655
// Bad path: block is not returned
567
656
committer .On ("GetBlocks" , mock .Anything ).Return ([]* common.Block {})
0 commit comments