Skip to content

Commit 23111e8

Browse files
committed
test: Add tests on can_sign_current_epoch and can_sign_signed_entity_type
1 parent 60402d7 commit 23111e8

File tree

1 file changed

+178
-8
lines changed

1 file changed

+178
-8
lines changed

mithril-signer/src/runtime/runner.rs

Lines changed: 178 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@ impl Runner for SignerRunner {
158158
debug!("RUNNER: register_signer_to_aggregator");
159159

160160
let (epoch, protocol_parameters) = {
161-
// Release the lock quickly at the end of this scope.
162161
let epoch_service = self.services.epoch_service.read().await;
163162
let epoch = epoch_service.epoch_of_current_data()?;
164163
let protocol_parameters = epoch_service.next_protocol_parameters()?;
@@ -260,18 +259,15 @@ impl Runner for SignerRunner {
260259
}
261260

262261
async fn can_sign_current_epoch(&self) -> StdResult<bool> {
263-
let epoch = self.epoch_service_read().await.epoch_of_current_data()?;
264-
262+
let epoch_service = self.epoch_service_read().await;
263+
let epoch = epoch_service.epoch_of_current_data()?;
265264
if let Some(protocol_initializer) = self
266265
.services
267266
.protocol_initializer_store
268267
.get_protocol_initializer(epoch.offset_to_signer_retrieval_epoch()?)
269268
.await?
270269
{
271270
debug!(" > got protocol initializer for this epoch ({epoch})");
272-
273-
let epoch_service = self.epoch_service_read().await;
274-
275271
return epoch_service.can_signer_sign_current_epoch(
276272
self.services.single_signer.get_party_id(),
277273
protocol_initializer,
@@ -453,7 +449,7 @@ mod tests {
453449
MKMap, MKMapNode, MKTreeNode, MKTreeStoreInMemory, MKTreeStorer, ProtocolInitializer,
454450
},
455451
digesters::{DumbImmutableDigester, DumbImmutableFileObserver},
456-
entities::{BlockNumber, BlockRange, CardanoDbBeacon, Epoch},
452+
entities::{BlockNumber, BlockRange, CardanoDbBeacon, Epoch, ProtocolParameters},
457453
era::{adapters::EraReaderBootstrapAdapter, EraChecker, EraReader},
458454
signable_builder::{
459455
BlockRangeRootRetriever, CardanoImmutableFilesFullSignableBuilder,
@@ -467,7 +463,10 @@ mod tests {
467463
use mithril_persistence::store::adapter::{DumbStoreAdapter, MemoryAdapter};
468464
use mithril_persistence::store::{StakeStore, StakeStorer};
469465
use mockall::mock;
470-
use std::{path::Path, sync::Arc};
466+
use rand_chacha::ChaCha20Rng;
467+
use rand_core::SeedableRng;
468+
469+
use std::{path::Path, path::PathBuf, sync::Arc};
471470

472471
use crate::metrics::MetricsService;
473472
use crate::services::{
@@ -509,6 +508,58 @@ mod tests {
509508
}
510509
}
511510

511+
struct FakeEpochServiceImpl {
512+
epoch_returned: Epoch,
513+
can_signer_sign_current_epoch_returned: Result<bool, String>,
514+
}
515+
516+
#[async_trait]
517+
impl EpochService for FakeEpochServiceImpl {
518+
fn inform_epoch_settings(&mut self, _epoch_settings: EpochSettings) -> StdResult<()> {
519+
Ok(())
520+
}
521+
fn epoch_of_current_data(&self) -> StdResult<Epoch> {
522+
Ok(self.epoch_returned)
523+
}
524+
fn next_protocol_parameters(&self) -> StdResult<&ProtocolParameters> {
525+
unimplemented!()
526+
}
527+
fn current_signers(&self) -> StdResult<&Vec<Signer>> {
528+
unimplemented!()
529+
}
530+
fn next_signers(&self) -> StdResult<&Vec<Signer>> {
531+
unimplemented!()
532+
}
533+
async fn current_signers_with_stake(&self) -> StdResult<Vec<SignerWithStake>> {
534+
Ok(vec![])
535+
}
536+
async fn next_signers_with_stake(&self) -> StdResult<Vec<SignerWithStake>> {
537+
Ok(vec![])
538+
}
539+
540+
fn can_signer_sign_current_epoch(
541+
&self,
542+
_party_id: PartyId,
543+
_protocol_initializer: ProtocolInitializer,
544+
) -> StdResult<bool> {
545+
match &self.can_signer_sign_current_epoch_returned {
546+
Ok(result) => Ok(*result),
547+
Err(e) => Err(anyhow::anyhow!(e.clone())),
548+
}
549+
}
550+
}
551+
552+
fn dummy_protocol_initializer() -> ProtocolInitializer {
553+
ProtocolInitializer::setup(
554+
fake_data::protocol_parameters().into(),
555+
None::<PathBuf>,
556+
Some(0),
557+
1234,
558+
&mut ChaCha20Rng::from_seed([0; 32]),
559+
)
560+
.unwrap()
561+
}
562+
512563
async fn init_services() -> SignerDependencyContainer {
513564
let adapter: MemoryAdapter<Epoch, ProtocolInitializer> = MemoryAdapter::new(None).unwrap();
514565
let stake_distribution_signers = fake_data::signers_with_stakes(2);
@@ -713,6 +764,125 @@ mod tests {
713764
);
714765
}
715766

767+
#[tokio::test]
768+
async fn can_sign_signed_entity_type_when_signed_entity_type_is_locked() {
769+
let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(9));
770+
let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::new());
771+
signed_entity_type_lock.lock(&signed_entity_type).await;
772+
let mut services = init_services().await;
773+
services.signed_entity_type_lock = signed_entity_type_lock.clone();
774+
775+
let runner = init_runner(Some(services), None).await;
776+
777+
assert!(
778+
!runner
779+
.can_sign_signed_entity_type(&signed_entity_type)
780+
.await
781+
);
782+
}
783+
784+
#[tokio::test]
785+
async fn can_sign_signed_entity_type_when_signed_entity_type_is_not_locked() {
786+
let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(9));
787+
let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::new());
788+
let mut services = init_services().await;
789+
services.signed_entity_type_lock = signed_entity_type_lock.clone();
790+
791+
let runner = init_runner(Some(services), None).await;
792+
793+
assert!(
794+
runner
795+
.can_sign_signed_entity_type(&signed_entity_type)
796+
.await
797+
);
798+
}
799+
800+
#[tokio::test]
801+
async fn can_sign_current_epoch_returns_false_when_epoch_service_returns_false() {
802+
let mut services = init_services().await;
803+
let epoch_service = FakeEpochServiceImpl {
804+
epoch_returned: Epoch(8),
805+
can_signer_sign_current_epoch_returned: Ok(false),
806+
};
807+
services.epoch_service = Arc::new(RwLock::new(epoch_service));
808+
809+
services
810+
.protocol_initializer_store
811+
.save_protocol_initializer(Epoch(7), dummy_protocol_initializer())
812+
.await
813+
.unwrap();
814+
815+
let runner = init_runner(Some(services), None).await;
816+
817+
assert!(!runner.can_sign_current_epoch().await.unwrap());
818+
}
819+
820+
#[tokio::test]
821+
async fn can_sign_current_epoch_returns_true_when_epoch_service_returns_true() {
822+
let mut services = init_services().await;
823+
824+
let epoch_service = FakeEpochServiceImpl {
825+
epoch_returned: Epoch(8),
826+
can_signer_sign_current_epoch_returned: Ok(true),
827+
};
828+
services.epoch_service = Arc::new(RwLock::new(epoch_service));
829+
830+
services
831+
.protocol_initializer_store
832+
.save_protocol_initializer(Epoch(7), dummy_protocol_initializer())
833+
.await
834+
.unwrap();
835+
836+
let runner = init_runner(Some(services), None).await;
837+
838+
assert!(runner.can_sign_current_epoch().await.unwrap());
839+
}
840+
841+
#[tokio::test]
842+
async fn can_sign_current_epoch_when_epoch_service_returns_error() {
843+
let mut services = init_services().await;
844+
845+
let epoch_service = FakeEpochServiceImpl {
846+
epoch_returned: Epoch(8),
847+
can_signer_sign_current_epoch_returned: Err("Simulate an error".to_string()),
848+
};
849+
services.epoch_service = Arc::new(RwLock::new(epoch_service));
850+
851+
services
852+
.protocol_initializer_store
853+
.save_protocol_initializer(Epoch(7), dummy_protocol_initializer())
854+
.await
855+
.unwrap();
856+
857+
let runner = init_runner(Some(services), None).await;
858+
859+
assert!(runner.can_sign_current_epoch().await.is_err());
860+
}
861+
862+
#[tokio::test]
863+
async fn can_sign_current_epoch_returns_false_when_cannot_get_protocol_initializer_for_current_epoch(
864+
) {
865+
let mut services = init_services().await;
866+
867+
let epoch_service = FakeEpochServiceImpl {
868+
epoch_returned: Epoch(8),
869+
can_signer_sign_current_epoch_returned: Ok(true),
870+
};
871+
services.epoch_service = Arc::new(RwLock::new(epoch_service));
872+
873+
let runner = init_runner(Some(services), None).await;
874+
875+
assert!(runner
876+
.services
877+
.protocol_initializer_store
878+
.get_protocol_initializer(Epoch(7))
879+
.await
880+
.unwrap()
881+
.is_none());
882+
883+
assert!(!runner.can_sign_current_epoch().await.unwrap());
884+
}
885+
716886
#[tokio::test]
717887
async fn test_compute_message() {
718888
let mut services = init_services().await;

0 commit comments

Comments
 (0)