mithril_cardano_node_internal_database/test/double/
immutable_file_observer.rs

1use std::ops::Add;
2
3use anyhow::anyhow;
4use async_trait::async_trait;
5use tokio::sync::RwLock;
6
7use mithril_common::StdResult;
8use mithril_common::entities::ImmutableFileNumber;
9
10use crate::{ImmutableFileObserver, ImmutableFileObserverError};
11
12/// An [ImmutableFileObserver] yielding fixed results for test purpose.
13pub struct DumbImmutableFileObserver {
14    /// The [ImmutableFileNumber] that shall be returned by
15    /// [get_last_immutable_number][ImmutableFileObserver::get_last_immutable_number]
16    pub shall_return: RwLock<Option<ImmutableFileNumber>>,
17}
18
19impl Default for DumbImmutableFileObserver {
20    fn default() -> Self {
21        let mut observer = Self::new();
22        observer.shall_return = RwLock::new(Some(500));
23
24        observer
25    }
26}
27
28impl DumbImmutableFileObserver {
29    /// [DumbImmutableFileObserver] factory.
30    pub fn new() -> Self {
31        Self {
32            shall_return: RwLock::new(None),
33        }
34    }
35
36    /// Update the stored [immutable file number][DumbImmutableFileObserver::shall_return].
37    pub async fn shall_return(&self, what: Option<u64>) -> &Self {
38        let mut shall_return = self.shall_return.write().await;
39        *shall_return = what;
40        self
41    }
42
43    /// Increase by one the stored [immutable file number][DumbImmutableFileObserver::shall_return],
44    /// return the updated value.
45    pub async fn increase(&self) -> StdResult<u64> {
46        let new_number = self
47            .shall_return
48            .write()
49            .await
50            .ok_or_else(|| anyhow!(ImmutableFileObserverError::Missing()))?
51            .add(1);
52        self.shall_return(Some(new_number)).await;
53
54        Ok(new_number)
55    }
56}
57
58#[async_trait]
59impl ImmutableFileObserver for DumbImmutableFileObserver {
60    async fn get_last_immutable_number(&self) -> StdResult<ImmutableFileNumber> {
61        self.shall_return
62            .read()
63            .await
64            .ok_or_else(|| anyhow!(ImmutableFileObserverError::Missing()))
65    }
66}