@@ -253,15 +253,17 @@ func TestGetMSPID(t *testing.T) {
253
253
254
254
func TestChaincodeStubHandlers (t * testing.T ) {
255
255
var tests = []struct {
256
- name string
257
- resType peer.ChaincodeMessage_Type
258
- payload []byte
259
- testFunc func (* ChaincodeStub , * Handler , * testing.T , []byte )
256
+ name string
257
+ resType peer.ChaincodeMessage_Type
258
+ payload []byte
259
+ usePeerWriteBatch bool
260
+ testFunc func (* ChaincodeStub , * Handler , * testing.T , []byte )
260
261
}{
261
262
{
262
- name : "Simple Response" ,
263
- resType : peer .ChaincodeMessage_RESPONSE ,
264
- payload : []byte ("myvalue" ),
263
+ name : "Simple Response" ,
264
+ resType : peer .ChaincodeMessage_RESPONSE ,
265
+ payload : []byte ("myvalue" ),
266
+ usePeerWriteBatch : true ,
265
267
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
266
268
resp , err := s .GetState ("key" )
267
269
if err != nil {
@@ -313,13 +315,13 @@ func TestChaincodeStubHandlers(t *testing.T) {
313
315
assert .NoError (t , err )
314
316
err = s .PurgePrivateData ("" , "key" )
315
317
assert .EqualError (t , err , "collection must not be an empty string" )
316
-
317
318
},
318
319
},
319
320
{
320
- name : "Simple Response with WriteBatch" ,
321
- resType : peer .ChaincodeMessage_RESPONSE ,
322
- payload : []byte ("myvalue" ),
321
+ name : "Simple Response with WriteBatch" ,
322
+ resType : peer .ChaincodeMessage_RESPONSE ,
323
+ payload : []byte ("myvalue" ),
324
+ usePeerWriteBatch : true ,
323
325
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
324
326
s .StartWriteBatch ()
325
327
err := s .PutState ("key" , payload )
@@ -364,6 +366,7 @@ func TestChaincodeStubHandlers(t *testing.T) {
364
366
},
365
367
},
366
368
),
369
+ usePeerWriteBatch : true ,
367
370
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
368
371
resp , err := s .GetStateValidationParameter ("key" )
369
372
if err != nil {
@@ -392,6 +395,7 @@ func TestChaincodeStubHandlers(t *testing.T) {
392
395
),
393
396
},
394
397
),
398
+ usePeerWriteBatch : true ,
395
399
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
396
400
resp := s .InvokeChaincode ("cc" , [][]byte {}, "channel" )
397
401
assert .Equal (t , resp .Payload , []byte ("invokechaincode" ))
@@ -421,6 +425,7 @@ func TestChaincodeStubHandlers(t *testing.T) {
421
425
HasMore : true ,
422
426
},
423
427
),
428
+ usePeerWriteBatch : true ,
424
429
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
425
430
expectedResult := & queryresult.KV {
426
431
Key : "querykey" ,
@@ -557,6 +562,7 @@ func TestChaincodeStubHandlers(t *testing.T) {
557
562
HasMore : false ,
558
563
},
559
564
),
565
+ usePeerWriteBatch : true ,
560
566
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
561
567
expectedResult := & queryresult.KeyModification {
562
568
TxId : "txid" ,
@@ -575,9 +581,10 @@ func TestChaincodeStubHandlers(t *testing.T) {
575
581
},
576
582
},
577
583
{
578
- name : "Error Conditions" ,
579
- resType : peer .ChaincodeMessage_ERROR ,
580
- payload : []byte ("error" ),
584
+ name : "Error Conditions" ,
585
+ resType : peer .ChaincodeMessage_ERROR ,
586
+ payload : []byte ("error" ),
587
+ usePeerWriteBatch : true ,
581
588
testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
582
589
_ , err := s .GetState ("key" )
583
590
assert .EqualError (t , err , string (payload ))
@@ -619,6 +626,112 @@ func TestChaincodeStubHandlers(t *testing.T) {
619
626
assert .NoError (t , err )
620
627
},
621
628
},
629
+ {
630
+ name : "WriteBatch - Old peer (usePeerWriteBatch false)" ,
631
+ resType : peer .ChaincodeMessage_ERROR ,
632
+ payload : []byte ("error" ),
633
+ usePeerWriteBatch : false ,
634
+ testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
635
+ s .StartWriteBatch ()
636
+ err := s .PutState ("key" , payload )
637
+ assert .ErrorContains (t , err , string (payload ))
638
+ err = s .FinishWriteBatch ()
639
+ assert .NoError (t , err )
640
+ },
641
+ },
642
+ {
643
+ name : "WriteBatch - different operations on the same key" ,
644
+ resType : peer .ChaincodeMessage_RESPONSE ,
645
+ payload : []byte ("myvalue" ),
646
+ usePeerWriteBatch : true ,
647
+ testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
648
+ s .StartWriteBatch ()
649
+
650
+ err := s .PutState ("key" , payload )
651
+ assert .NoError (t , err )
652
+ err = s .DelState ("key" )
653
+ assert .NoError (t , err )
654
+
655
+ err = s .PutPrivateData ("col" , "key" , payload )
656
+ assert .NoError (t , err )
657
+ err = s .DelPrivateData ("col" , "key" )
658
+ assert .NoError (t , err )
659
+ err = s .PurgePrivateData ("col" , "key" )
660
+ assert .NoError (t , err )
661
+
662
+ err = s .FinishWriteBatch ()
663
+ assert .NoError (t , err )
664
+
665
+ chatStream , ok := s .handler .chatStream .(* mock.PeerChaincodeStream )
666
+ assert .True (t , ok )
667
+ assert .Equal (t , 1 , chatStream .SendCallCount ())
668
+ peerChaincodeMsg := chatStream .SendArgsForCall (0 )
669
+ assert .Equal (t , peer .ChaincodeMessage_WRITE_BATCH_STATE , peerChaincodeMsg .Type )
670
+ batch := & peer.WriteBatchState {}
671
+ err = proto .Unmarshal (peerChaincodeMsg .GetPayload (), batch )
672
+ assert .NoError (t , err )
673
+ assert .Equal (t , 2 , len (batch .GetRec ()))
674
+ },
675
+ },
676
+ {
677
+ name : "WriteBatch - State and StateValidationParameter keys are the same" ,
678
+ resType : peer .ChaincodeMessage_RESPONSE ,
679
+ payload : []byte ("myvalue" ),
680
+ usePeerWriteBatch : true ,
681
+ testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
682
+ s .StartWriteBatch ()
683
+
684
+ err := s .PutState ("key" , payload )
685
+ assert .NoError (t , err )
686
+ err = s .SetStateValidationParameter ("key" , payload )
687
+ assert .NoError (t , err )
688
+
689
+ err = s .PutPrivateData ("col" , "key" , payload )
690
+ assert .NoError (t , err )
691
+ err = s .SetPrivateDataValidationParameter ("col" , "key" , payload )
692
+ assert .NoError (t , err )
693
+
694
+ err = s .FinishWriteBatch ()
695
+ assert .NoError (t , err )
696
+
697
+ chatStream , ok := s .handler .chatStream .(* mock.PeerChaincodeStream )
698
+ assert .True (t , ok )
699
+ assert .Equal (t , 1 , chatStream .SendCallCount ())
700
+ peerChaincodeMsg := chatStream .SendArgsForCall (0 )
701
+ assert .Equal (t , peer .ChaincodeMessage_WRITE_BATCH_STATE , peerChaincodeMsg .Type )
702
+ batch := & peer.WriteBatchState {}
703
+ err = proto .Unmarshal (peerChaincodeMsg .GetPayload (), batch )
704
+ assert .NoError (t , err )
705
+ assert .Equal (t , 4 , len (batch .GetRec ()))
706
+ },
707
+ },
708
+ {
709
+ name : "WriteBatch - key uniqueness check c+old - col+d" ,
710
+ resType : peer .ChaincodeMessage_RESPONSE ,
711
+ payload : []byte ("myvalue" ),
712
+ usePeerWriteBatch : true ,
713
+ testFunc : func (s * ChaincodeStub , h * Handler , t * testing.T , payload []byte ) {
714
+ s .StartWriteBatch ()
715
+
716
+ err := s .PutPrivateData ("c" , "old" , payload )
717
+ assert .NoError (t , err )
718
+ err = s .PutPrivateData ("col" , "d" , payload )
719
+ assert .NoError (t , err )
720
+
721
+ err = s .FinishWriteBatch ()
722
+ assert .NoError (t , err )
723
+
724
+ chatStream , ok := s .handler .chatStream .(* mock.PeerChaincodeStream )
725
+ assert .True (t , ok )
726
+ assert .Equal (t , 1 , chatStream .SendCallCount ())
727
+ peerChaincodeMsg := chatStream .SendArgsForCall (0 )
728
+ assert .Equal (t , peer .ChaincodeMessage_WRITE_BATCH_STATE , peerChaincodeMsg .Type )
729
+ batch := & peer.WriteBatchState {}
730
+ err = proto .Unmarshal (peerChaincodeMsg .GetPayload (), batch )
731
+ assert .NoError (t , err )
732
+ assert .Equal (t , 2 , len (batch .GetRec ()))
733
+ },
734
+ },
622
735
}
623
736
624
737
for _ , test := range tests {
@@ -630,7 +743,7 @@ func TestChaincodeStubHandlers(t *testing.T) {
630
743
cc : & mockChaincode {},
631
744
responseChannels : map [string ]chan * peer.ChaincodeMessage {},
632
745
state : ready ,
633
- usePeerWriteBatch : true ,
746
+ usePeerWriteBatch : test . usePeerWriteBatch ,
634
747
maxSizeWriteBatch : 100 ,
635
748
}
636
749
stub := & ChaincodeStub {
0 commit comments