use async_trait::async_trait;
use ironfix_core::error::StoreError;
use ironfix_core::message::OwnedMessage;
#[async_trait]
pub trait MessageStore: Send + Sync {
async fn store(&self, seq_num: u64, message: &[u8]) -> Result<(), StoreError>;
async fn get_range(&self, begin: u64, end: u64) -> Result<Vec<OwnedMessage>, StoreError>;
fn next_sender_seq(&self) -> u64;
fn next_target_seq(&self) -> u64;
fn set_next_sender_seq(&self, seq: u64);
fn set_next_target_seq(&self, seq: u64);
async fn reset(&self) -> Result<(), StoreError>;
fn creation_time(&self) -> std::time::SystemTime;
async fn refresh(&self) -> Result<(), StoreError> {
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
struct MockStore;
#[async_trait]
impl MessageStore for MockStore {
async fn store(&self, _seq_num: u64, _message: &[u8]) -> Result<(), StoreError> {
Ok(())
}
async fn get_range(&self, _begin: u64, _end: u64) -> Result<Vec<OwnedMessage>, StoreError> {
Ok(vec![])
}
fn next_sender_seq(&self) -> u64 {
1
}
fn next_target_seq(&self) -> u64 {
1
}
fn set_next_sender_seq(&self, _seq: u64) {}
fn set_next_target_seq(&self, _seq: u64) {}
async fn reset(&self) -> Result<(), StoreError> {
Ok(())
}
fn creation_time(&self) -> std::time::SystemTime {
std::time::SystemTime::now()
}
}
#[tokio::test]
async fn test_mock_store() {
let store = MockStore;
assert_eq!(store.next_sender_seq(), 1);
assert_eq!(store.next_target_seq(), 1);
assert!(store.store(1, b"test").await.is_ok());
assert!(store.reset().await.is_ok());
}
}