Skip to content

Commit ddeeb7c

Browse files
committed
Make SignableBuilderService a trait
1 parent 0c2476b commit ddeeb7c

File tree

4 files changed

+121
-25
lines changed

4 files changed

+121
-25
lines changed

mithril-aggregator/src/dependency.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ pub struct DependencyManager {
112112
pub signer_recorder: Arc<dyn SignerRecorder>,
113113

114114
/// Signable Builder Service
115-
pub signable_builder_service: Arc<SignableBuilderService>,
115+
pub signable_builder_service: Arc<dyn SignableBuilderService>,
116116

117117
/// Artifact Builder Service
118118
pub artifact_builder_service: Arc<dyn ArtifactBuilderService>,

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::{
4848
},
4949
event_store::{EventMessage, EventStore, TransmitterService},
5050
http_server::routes::router,
51-
signable_builder::SignableBuilderService,
51+
signable_builder::{MithrilSignableBuilderService, SignableBuilderService},
5252
signer_registerer::SignerRecorder,
5353
stake_distribution_service::{MithrilStakeDistributionService, StakeDistributionService},
5454
ticker_service::{MithrilTickerService, TickerService},
@@ -172,7 +172,7 @@ pub struct DependenciesBuilder {
172172
pub signer_recorder: Option<Arc<dyn SignerRecorder>>,
173173

174174
/// Signable Builder Service
175-
pub signable_builder_service: Option<Arc<SignableBuilderService>>,
175+
pub signable_builder_service: Option<Arc<dyn SignableBuilderService>>,
176176

177177
/// Artifact Builder Service
178178
pub artifact_builder_service: Option<Arc<dyn ArtifactBuilderService>>,
@@ -877,13 +877,14 @@ impl DependenciesBuilder {
877877
Ok(self.signer_recorder.as_ref().cloned().unwrap())
878878
}
879879

880-
async fn build_signable_builder_service(&mut self) -> Result<Arc<SignableBuilderService>> {
881-
let mithril_stake_distribution_builder = MithrilStakeDistributionSignableBuilder::default();
882-
let immutable_signable_builder = CardanoImmutableFilesFullSignableBuilder::new(
880+
async fn build_signable_builder_service(&mut self) -> Result<Arc<dyn SignableBuilderService>> {
881+
let mithril_stake_distribution_builder =
882+
Arc::new(MithrilStakeDistributionSignableBuilder::default());
883+
let immutable_signable_builder = Arc::new(CardanoImmutableFilesFullSignableBuilder::new(
883884
self.get_immutable_digester().await?,
884885
self.get_logger().await?,
885-
);
886-
let signable_builder_service = Arc::new(SignableBuilderService::new(
886+
));
887+
let signable_builder_service = Arc::new(MithrilSignableBuilderService::new(
887888
mithril_stake_distribution_builder,
888889
immutable_signable_builder,
889890
));
@@ -892,7 +893,9 @@ impl DependenciesBuilder {
892893
}
893894

894895
/// [SignableBuilderService] service
895-
pub async fn get_signable_builder_service(&mut self) -> Result<Arc<SignableBuilderService>> {
896+
pub async fn get_signable_builder_service(
897+
&mut self,
898+
) -> Result<Arc<dyn SignableBuilderService>> {
896899
if self.signable_builder_service.is_none() {
897900
self.signable_builder_service = Some(self.build_signable_builder_service().await?);
898901
}

mithril-aggregator/src/signable_builder/signable_builder_service.rs

Lines changed: 104 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,37 @@
1+
use async_trait::async_trait;
12
use std::sync::Arc;
23

34
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},
97
StdResult,
108
};
119

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>>,
1628
}
1729

18-
impl SignableBuilderService {
19-
/// SignableBuilderService factory
30+
impl MithrilSignableBuilderService {
31+
/// MithrilSignableBuilderService factory
2032
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>>,
2335
) -> Self {
2436
Self {
2537
mithril_stake_distribution_builder,
@@ -28,7 +40,8 @@ impl SignableBuilderService {
2840
}
2941
}
3042

31-
impl SignableBuilderService {
43+
#[async_trait]
44+
impl SignableBuilderService for MithrilSignableBuilderService {
3245
#[allow(dead_code)]
3346
async fn compute_signable(
3447
&self,
@@ -53,4 +66,80 @@ impl SignableBuilderService {
5366
}
5467

5568
#[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+
}

mithril-common/src/signable_builder/interface.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ use std::fmt::Debug;
33

44
use crate::{entities::ProtocolMessage, StdResult};
55

6+
#[cfg(test)]
7+
use mockall::automock;
8+
69
/// Beacon trait
710
pub trait Beacon: Send + Sync {}
811

@@ -17,8 +20,9 @@ pub trait Signable: Send + Sync {
1720
pub trait Artifact: Debug + Send + Sync {}
1821

1922
/// SignableBuilder is trait for building a signable for a beacon
23+
#[cfg_attr(test, automock)]
2024
#[async_trait]
21-
pub trait SignableBuilder<U, V>
25+
pub trait SignableBuilder<U, V>: Send + Sync
2226
where
2327
U: Beacon,
2428
V: Signable,

0 commit comments

Comments
 (0)