@@ -885,3 +885,62 @@ func TestViewChangeTimer(t *testing.T) {
885
885
}
886
886
}
887
887
}
888
+
889
+ func TestResendViewChange (t * testing.T ) {
890
+ N := uint64 (4 )
891
+ sys := newTestSystem (N )
892
+ var repls []* SBFT
893
+ var adapters []* testSystemAdapter
894
+ for i := uint64 (0 ); i < N ; i ++ {
895
+ a := sys .NewAdapter (i )
896
+ s , err := New (i , & Config {N : N , F : 1 , BatchDurationNsec : 2000000000 , BatchSizeBytes : 10 , RequestTimeoutNsec : 20000000000 }, a )
897
+ if err != nil {
898
+ t .Fatal (err )
899
+ }
900
+ repls = append (repls , s )
901
+ adapters = append (adapters , a )
902
+ }
903
+
904
+ phase := make (map [uint64 ]int )
905
+
906
+ // prevent first view change from being delivered
907
+ sys .filterFn = func (e testElem ) (testElem , bool ) {
908
+ if msg , ok := e .ev .(* testMsgEvent ); ok {
909
+ if msg .dst == msg .src {
910
+ return e , true
911
+ } else if phase [msg .src ] == 0 && msg .msg .GetViewChange () != nil {
912
+ return e , false
913
+ } else if msg .msg .GetHello () != nil {
914
+ phase [msg .src ] = 1
915
+ }
916
+ }
917
+
918
+ return e , true
919
+ }
920
+
921
+ for _ , r := range repls {
922
+ r .sendViewChange ()
923
+ }
924
+ sys .Run ()
925
+
926
+ connectAll (sys )
927
+ r1 := []byte {1 , 2 , 3 }
928
+ repls [0 ].Request (r1 )
929
+ sys .Run ()
930
+ r2 := []byte {3 , 1 , 2 }
931
+ r3 := []byte {3 , 5 , 2 }
932
+ repls [1 ].Request (r2 )
933
+ repls [1 ].Request (r3 )
934
+ sys .Run ()
935
+ for _ , a := range adapters {
936
+ if len (a .batches ) != 3 {
937
+ t .Fatal ("expected execution of 2 batches" )
938
+ }
939
+ if ! reflect .DeepEqual ([][]byte {r1 }, a .batches [1 ].Payloads ) {
940
+ t .Error ("wrong request executed (1)" )
941
+ }
942
+ if ! reflect .DeepEqual ([][]byte {r2 , r3 }, a .batches [2 ].Payloads ) {
943
+ t .Error ("wrong request executed (2)" )
944
+ }
945
+ }
946
+ }
0 commit comments