1
+ use async_trait:: async_trait;
1
2
use std:: sync:: Arc ;
2
3
3
4
use mithril_common:: {
4
- entities:: SignedEntityType ,
5
- signable_builder:: {
6
- CardanoImmutableFilesFullSignableBuilder , MithrilStakeDistributionSignableBuilder ,
7
- Signable , SignableBuilder ,
8
- } ,
5
+ entities:: { Beacon , Epoch , ProtocolMessage , SignedEntityType } ,
6
+ signable_builder:: { Signable , SignableBuilder } ,
9
7
StdResult ,
10
8
} ;
11
9
12
- /// SignableBuilder Service
13
- pub struct SignableBuilderService {
14
- mithril_stake_distribution_builder : MithrilStakeDistributionSignableBuilder ,
15
- immutable_signable_builder : CardanoImmutableFilesFullSignableBuilder ,
10
+ #[ cfg( test) ]
11
+ use mockall:: automock;
12
+
13
+ /// ArtifactBuilder Service trait
14
+ #[ cfg_attr( test, automock) ]
15
+ #[ async_trait]
16
+ pub trait SignableBuilderService : Send + Sync {
17
+ /// Compute signable from signed entity type
18
+ async fn compute_signable (
19
+ & self ,
20
+ signed_entity_type : SignedEntityType ,
21
+ ) -> StdResult < Arc < dyn Signable > > ;
22
+ }
23
+
24
+ /// Mithril Signable Builder Service
25
+ pub struct MithrilSignableBuilderService {
26
+ mithril_stake_distribution_builder : Arc < dyn SignableBuilder < Epoch , ProtocolMessage > > ,
27
+ immutable_signable_builder : Arc < dyn SignableBuilder < Beacon , ProtocolMessage > > ,
16
28
}
17
29
18
- impl SignableBuilderService {
19
- /// SignableBuilderService factory
30
+ impl MithrilSignableBuilderService {
31
+ /// MithrilSignableBuilderService factory
20
32
pub fn new (
21
- mithril_stake_distribution_builder : MithrilStakeDistributionSignableBuilder ,
22
- immutable_signable_builder : CardanoImmutableFilesFullSignableBuilder ,
33
+ mithril_stake_distribution_builder : Arc < dyn SignableBuilder < Epoch , ProtocolMessage > > ,
34
+ immutable_signable_builder : Arc < dyn SignableBuilder < Beacon , ProtocolMessage > > ,
23
35
) -> Self {
24
36
Self {
25
37
mithril_stake_distribution_builder,
@@ -28,7 +40,8 @@ impl SignableBuilderService {
28
40
}
29
41
}
30
42
31
- impl SignableBuilderService {
43
+ #[ async_trait]
44
+ impl SignableBuilderService for MithrilSignableBuilderService {
32
45
#[ allow( dead_code) ]
33
46
async fn compute_signable (
34
47
& self ,
@@ -53,4 +66,80 @@ impl SignableBuilderService {
53
66
}
54
67
55
68
#[ cfg( test) ]
56
- mod tests { }
69
+ mod tests {
70
+ use super :: * ;
71
+
72
+ use mithril_common:: {
73
+ entities:: { Epoch , ProtocolMessage } ,
74
+ signable_builder:: { Beacon as Beaconnable , Signable , SignableBuilder } ,
75
+ StdResult ,
76
+ } ;
77
+
78
+ use async_trait:: async_trait;
79
+ use mockall:: mock;
80
+
81
+ mock ! {
82
+ SignableBuilderImpl <U , V > { }
83
+
84
+ #[ async_trait]
85
+ impl <U , V > SignableBuilder <U , V > for SignableBuilderImpl <U , V > where
86
+ U : Beaconnable ,
87
+ V : Signable , {
88
+
89
+ async fn compute_signable( & self , beacon: U ) -> StdResult <V >;
90
+ }
91
+ }
92
+
93
+ #[ tokio:: test]
94
+ async fn build_mithril_stake_distribution_signable_when_given_mithril_stake_distribution_entity_type (
95
+ ) {
96
+ let protocol_message = ProtocolMessage :: new ( ) ;
97
+ let protocol_message_clone = protocol_message. clone ( ) ;
98
+ let mut mock_mithril_stake_distribution_signable_builder =
99
+ MockSignableBuilderImpl :: < Epoch , ProtocolMessage > :: new ( ) ;
100
+ mock_mithril_stake_distribution_signable_builder
101
+ . expect_compute_signable ( )
102
+ . once ( )
103
+ . return_once ( move |_| Ok ( protocol_message_clone) ) ;
104
+
105
+ let mock_cardano_immutable_files_full_signable_builder =
106
+ MockSignableBuilderImpl :: < Beacon , ProtocolMessage > :: new ( ) ;
107
+
108
+ let signable_builder_service = MithrilSignableBuilderService :: new (
109
+ Arc :: new ( mock_mithril_stake_distribution_signable_builder) ,
110
+ Arc :: new ( mock_cardano_immutable_files_full_signable_builder) ,
111
+ ) ;
112
+
113
+ let signed_entity_type = SignedEntityType :: MithrilStakeDistribution ( Epoch ( 1 ) ) ;
114
+ signable_builder_service
115
+ . compute_signable ( signed_entity_type)
116
+ . await
117
+ . unwrap ( ) ;
118
+ }
119
+
120
+ #[ tokio:: test]
121
+ async fn build_snapshot_signable_when_given_cardano_immutable_files_full_entity_type ( ) {
122
+ let protocol_message = ProtocolMessage :: new ( ) ;
123
+ let protocol_message_clone = protocol_message. clone ( ) ;
124
+ let mock_mithril_stake_distribution_signable_builder =
125
+ MockSignableBuilderImpl :: < Epoch , ProtocolMessage > :: new ( ) ;
126
+
127
+ let mut mock_cardano_immutable_files_full_signable_builder =
128
+ MockSignableBuilderImpl :: < Beacon , ProtocolMessage > :: new ( ) ;
129
+ mock_cardano_immutable_files_full_signable_builder
130
+ . expect_compute_signable ( )
131
+ . once ( )
132
+ . return_once ( move |_| Ok ( protocol_message_clone) ) ;
133
+
134
+ let signable_builder_service = MithrilSignableBuilderService :: new (
135
+ Arc :: new ( mock_mithril_stake_distribution_signable_builder) ,
136
+ Arc :: new ( mock_cardano_immutable_files_full_signable_builder) ,
137
+ ) ;
138
+
139
+ let signed_entity_type = SignedEntityType :: CardanoImmutableFilesFull ( Beacon :: default ( ) ) ;
140
+ signable_builder_service
141
+ . compute_signable ( signed_entity_type)
142
+ . await
143
+ . unwrap ( ) ;
144
+ }
145
+ }
0 commit comments