@@ -191,13 +191,6 @@ impl AggregatorRunnerTrait for AggregatorRunner {
191
191
) ,
192
192
] ;
193
193
194
- // to be tested:
195
- // - if MithrilStakeDistribution not exist: Create and returns one (event if a CardanoImmutableFilesFull exist)
196
- // - if MithrilStakeDistribution exist but not certified returns it (event if a CardanoImmutableFilesFull exist)
197
- // - if MithrilStakeDistribution exist but certified:
198
- // -- existing not certified CardanoImmutableFilesFull ? returns it
199
- // -- existing certified CardanoImmutableFilesFull ? returns None
200
- // -- no existing CardanoImmutableFilesFull ? Create and returns one
201
194
for signed_entity_type in signed_entity_types {
202
195
let open_message = match self
203
196
. dependencies
@@ -556,22 +549,63 @@ impl AggregatorRunnerTrait for AggregatorRunner {
556
549
#[ cfg( test) ]
557
550
pub mod tests {
558
551
use crate :: certifier_service:: MockCertifierService ;
552
+ use crate :: entities:: OpenMessage ;
559
553
use crate :: {
560
554
initialize_dependencies,
561
555
runtime:: { AggregatorRunner , AggregatorRunnerTrait } ,
562
556
} ;
563
- use crate :: { MithrilSignerRegisterer , ProtocolParametersStorer , SignerRegistrationRound } ;
557
+ use crate :: {
558
+ DependencyManager , MithrilSignerRegisterer , ProtocolParametersStorer ,
559
+ SignerRegistrationRound ,
560
+ } ;
561
+ use async_trait:: async_trait;
564
562
use mithril_common:: chain_observer:: FakeObserver ;
565
563
use mithril_common:: digesters:: DumbImmutableFileObserver ;
566
564
use mithril_common:: entities:: {
567
- Beacon , CertificatePending , Epoch , SignedEntityType , StakeDistribution ,
565
+ Beacon , CertificatePending , Epoch , ProtocolMessage , SignedEntityType , StakeDistribution ,
568
566
} ;
567
+ use mithril_common:: signable_builder:: SignableBuilderService ;
569
568
use mithril_common:: store:: StakeStorer ;
570
569
use mithril_common:: test_utils:: fake_data;
571
570
use mithril_common:: test_utils:: MithrilFixtureBuilder ;
572
- use mithril_common:: { BeaconProviderImpl , CardanoNetwork } ;
571
+ use mithril_common:: { BeaconProviderImpl , CardanoNetwork , StdResult } ;
572
+ use mockall:: { mock, predicate:: eq} ;
573
573
use std:: sync:: Arc ;
574
574
575
+ mock ! {
576
+ SignableBuilderServiceImpl { }
577
+
578
+ #[ async_trait]
579
+ impl SignableBuilderService for SignableBuilderServiceImpl
580
+ {
581
+
582
+ async fn compute_protocol_message(
583
+ & self ,
584
+ signed_entity_type: SignedEntityType ,
585
+ ) -> StdResult <ProtocolMessage >;
586
+ }
587
+ }
588
+
589
+ async fn init_runner_from_dependencies ( deps : DependencyManager ) -> AggregatorRunner {
590
+ let fixture = MithrilFixtureBuilder :: default ( ) . with_signers ( 5 ) . build ( ) ;
591
+ deps. init_state_from_fixture (
592
+ & fixture,
593
+ & [ deps
594
+ . chain_observer
595
+ . get_current_epoch ( )
596
+ . await
597
+ . unwrap ( )
598
+ . unwrap ( ) ] ,
599
+ )
600
+ . await ;
601
+
602
+ let runner = AggregatorRunner :: new ( Arc :: new ( deps) ) ;
603
+ let beacon = runner. get_beacon_from_chain ( ) . await . unwrap ( ) ;
604
+ runner. update_beacon ( & beacon) . await . unwrap ( ) ;
605
+
606
+ runner
607
+ }
608
+
575
609
#[ tokio:: test]
576
610
async fn test_get_beacon_from_chain ( ) {
577
611
let expected_beacon = Beacon :: new ( "private" . to_string ( ) , 2 , 17 ) ;
@@ -869,4 +903,204 @@ pub mod tests {
869
903
let runner = AggregatorRunner :: new ( Arc :: new ( deps) ) ;
870
904
runner. certifier_inform_new_epoch ( & Epoch ( 1 ) ) . await . unwrap ( ) ;
871
905
}
906
+
907
+ #[ tokio:: test]
908
+ async fn test_get_current_non_certified_open_message_should_create_new_open_message_for_mithril_stake_distribution_if_none_exists (
909
+ ) {
910
+ let open_message_expected = OpenMessage {
911
+ signed_entity_type : SignedEntityType :: MithrilStakeDistribution (
912
+ fake_data:: beacon ( ) . epoch ,
913
+ ) ,
914
+ is_certified : false ,
915
+ ..OpenMessage :: dummy ( )
916
+ } ;
917
+ let open_message_clone = open_message_expected. clone ( ) ;
918
+
919
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
920
+ mock_certifier_service
921
+ . expect_get_open_message ( )
922
+ . return_once ( |_| Ok ( None ) )
923
+ . times ( 1 ) ;
924
+ mock_certifier_service
925
+ . expect_create_open_message ( )
926
+ . return_once ( |_, _| Ok ( open_message_clone) )
927
+ . times ( 1 ) ;
928
+
929
+ let mut deps = initialize_dependencies ( ) . await ;
930
+ deps. certifier_service = Arc :: new ( mock_certifier_service) ;
931
+
932
+ let runner = init_runner_from_dependencies ( deps) . await ;
933
+
934
+ let open_message_returned = runner
935
+ . get_current_non_certified_open_message ( )
936
+ . await
937
+ . unwrap ( ) ;
938
+ assert_eq ! ( Some ( open_message_expected) , open_message_returned) ;
939
+ }
940
+
941
+ #[ tokio:: test]
942
+ async fn test_get_current_non_certified_open_message_should_return_existing_open_message_for_mithril_stake_distribution_if_already_exists (
943
+ ) {
944
+ let open_message_expected = OpenMessage {
945
+ signed_entity_type : SignedEntityType :: MithrilStakeDistribution (
946
+ fake_data:: beacon ( ) . epoch ,
947
+ ) ,
948
+ is_certified : false ,
949
+ ..OpenMessage :: dummy ( )
950
+ } ;
951
+ let open_message_clone = open_message_expected. clone ( ) ;
952
+
953
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
954
+ mock_certifier_service
955
+ . expect_get_open_message ( )
956
+ . return_once ( |_| Ok ( Some ( open_message_clone) ) )
957
+ . times ( 1 ) ;
958
+ mock_certifier_service. expect_create_open_message ( ) . never ( ) ;
959
+
960
+ let mut deps = initialize_dependencies ( ) . await ;
961
+ deps. certifier_service = Arc :: new ( mock_certifier_service) ;
962
+
963
+ let runner = init_runner_from_dependencies ( deps) . await ;
964
+
965
+ let open_message_returned = runner
966
+ . get_current_non_certified_open_message ( )
967
+ . await
968
+ . unwrap ( ) ;
969
+ assert_eq ! ( Some ( open_message_expected) , open_message_returned) ;
970
+ }
971
+
972
+ #[ tokio:: test]
973
+ async fn test_get_current_non_certified_open_message_should_return_existing_open_message_for_cardano_immutables_if_already_exists_and_open_message_mithril_stake_distribution_already_certified (
974
+ ) {
975
+ let open_message_already_certified = OpenMessage {
976
+ signed_entity_type : SignedEntityType :: MithrilStakeDistribution (
977
+ fake_data:: beacon ( ) . epoch ,
978
+ ) ,
979
+ is_certified : true ,
980
+ ..OpenMessage :: dummy ( )
981
+ } ;
982
+ let open_message_expected = OpenMessage {
983
+ signed_entity_type : SignedEntityType :: CardanoImmutableFilesFull ( fake_data:: beacon ( ) ) ,
984
+ is_certified : false ,
985
+ ..OpenMessage :: dummy ( )
986
+ } ;
987
+ let open_message_clone = open_message_expected. clone ( ) ;
988
+
989
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
990
+ mock_certifier_service
991
+ . expect_get_open_message ( )
992
+ . return_once ( |_| Ok ( Some ( open_message_already_certified) ) )
993
+ . times ( 1 ) ;
994
+ mock_certifier_service
995
+ . expect_get_open_message ( )
996
+ . return_once ( |_| Ok ( Some ( open_message_clone) ) )
997
+ . times ( 1 ) ;
998
+ mock_certifier_service. expect_create_open_message ( ) . never ( ) ;
999
+
1000
+ let mut deps = initialize_dependencies ( ) . await ;
1001
+ deps. certifier_service = Arc :: new ( mock_certifier_service) ;
1002
+
1003
+ let runner = init_runner_from_dependencies ( deps) . await ;
1004
+
1005
+ let open_message_returned = runner
1006
+ . get_current_non_certified_open_message ( )
1007
+ . await
1008
+ . unwrap ( ) ;
1009
+ assert_eq ! ( Some ( open_message_expected) , open_message_returned) ;
1010
+ }
1011
+
1012
+ #[ tokio:: test]
1013
+ async fn test_get_current_non_certified_open_message_should_create_open_message_for_cardano_immutables_if_none_exists_and_open_message_mithril_stake_distribution_already_certified (
1014
+ ) {
1015
+ let open_message_already_certified = OpenMessage {
1016
+ signed_entity_type : SignedEntityType :: MithrilStakeDistribution (
1017
+ fake_data:: beacon ( ) . epoch ,
1018
+ ) ,
1019
+ is_certified : true ,
1020
+ ..OpenMessage :: dummy ( )
1021
+ } ;
1022
+ let open_message_expected = OpenMessage {
1023
+ signed_entity_type : SignedEntityType :: CardanoImmutableFilesFull ( fake_data:: beacon ( ) ) ,
1024
+ is_certified : false ,
1025
+ ..OpenMessage :: dummy ( )
1026
+ } ;
1027
+ let open_message_clone = open_message_expected. clone ( ) ;
1028
+
1029
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
1030
+ mock_certifier_service
1031
+ . expect_get_open_message ( )
1032
+ . with ( eq ( open_message_already_certified
1033
+ . signed_entity_type
1034
+ . clone ( ) ) )
1035
+ . return_once ( |_| Ok ( Some ( open_message_already_certified) ) )
1036
+ . times ( 1 ) ;
1037
+ mock_certifier_service
1038
+ . expect_get_open_message ( )
1039
+ . return_once ( |_| Ok ( None ) )
1040
+ . times ( 1 ) ;
1041
+ mock_certifier_service
1042
+ . expect_create_open_message ( )
1043
+ . return_once ( |_, _| Ok ( open_message_clone) )
1044
+ . times ( 1 ) ;
1045
+
1046
+ let mut mock_signable_builder_service = MockSignableBuilderServiceImpl :: new ( ) ;
1047
+ mock_signable_builder_service
1048
+ . expect_compute_protocol_message ( )
1049
+ . return_once ( |_| Ok ( ProtocolMessage :: default ( ) ) ) ;
1050
+
1051
+ let mut deps = initialize_dependencies ( ) . await ;
1052
+ deps. certifier_service = Arc :: new ( mock_certifier_service) ;
1053
+ deps. signable_builder_service = Arc :: new ( mock_signable_builder_service) ;
1054
+
1055
+ let runner = init_runner_from_dependencies ( deps) . await ;
1056
+
1057
+ let open_message_returned = runner
1058
+ . get_current_non_certified_open_message ( )
1059
+ . await
1060
+ . unwrap ( ) ;
1061
+ assert_eq ! ( Some ( open_message_expected) , open_message_returned) ;
1062
+ }
1063
+
1064
+ #[ tokio:: test]
1065
+ async fn test_get_current_non_certified_open_message_should_return_none_if_all_open_message_already_certified (
1066
+ ) {
1067
+ let open_message_already_certified_mithril_stake_distribution = OpenMessage {
1068
+ signed_entity_type : SignedEntityType :: MithrilStakeDistribution (
1069
+ fake_data:: beacon ( ) . epoch ,
1070
+ ) ,
1071
+ is_certified : true ,
1072
+ ..OpenMessage :: dummy ( )
1073
+ } ;
1074
+ let open_message_already_certified_cardano_immutable_files = OpenMessage {
1075
+ signed_entity_type : SignedEntityType :: CardanoImmutableFilesFull ( fake_data:: beacon ( ) ) ,
1076
+ is_certified : true ,
1077
+ ..OpenMessage :: dummy ( )
1078
+ } ;
1079
+
1080
+ let mut mock_certifier_service = MockCertifierService :: new ( ) ;
1081
+ mock_certifier_service
1082
+ . expect_get_open_message ( )
1083
+ . return_once ( |_| {
1084
+ Ok ( Some (
1085
+ open_message_already_certified_mithril_stake_distribution,
1086
+ ) )
1087
+ } )
1088
+ . times ( 1 ) ;
1089
+ mock_certifier_service
1090
+ . expect_get_open_message ( )
1091
+ . return_once ( |_| Ok ( Some ( open_message_already_certified_cardano_immutable_files) ) )
1092
+ . times ( 1 ) ;
1093
+ mock_certifier_service. expect_create_open_message ( ) . never ( ) ;
1094
+
1095
+ let mut deps = initialize_dependencies ( ) . await ;
1096
+ deps. certifier_service = Arc :: new ( mock_certifier_service) ;
1097
+
1098
+ let runner = init_runner_from_dependencies ( deps) . await ;
1099
+
1100
+ let open_message_returned = runner
1101
+ . get_current_non_certified_open_message ( )
1102
+ . await
1103
+ . unwrap ( ) ;
1104
+ assert ! ( open_message_returned. is_none( ) ) ;
1105
+ }
872
1106
}
0 commit comments