blob: 81350059679da6107047385ea294565e8da2ec2c [file]
use crate::streaming::common::test_setup::TestSetup;
use iggy::consumer::ConsumerKind;
use server::configs::system::SystemConfig;
use server::streaming::partitions::partition::ConsumerOffset;
use server::streaming::storage::PartitionStorageKind;
use std::sync::Arc;
use tokio::fs;
#[tokio::test]
async fn should_persist_consumer_offsets_and_then_load_them_from_disk() {
let setup = TestSetup::init().await;
let storage = setup.storage.partition.as_ref();
assert_persisted_offsets(&setup.config, storage, ConsumerKind::Consumer).await;
assert_persisted_offsets(&setup.config, storage, ConsumerKind::ConsumerGroup).await;
}
async fn assert_persisted_offsets(
config: &Arc<SystemConfig>,
storage: &PartitionStorageKind,
kind: ConsumerKind,
) {
let consumer_ids_count = 3;
let offsets_count = 5;
let path = match kind {
ConsumerKind::Consumer => "consumer_offsets",
ConsumerKind::ConsumerGroup => "consumer_group_offsets",
};
let path = format!("{}/{}", config.get_system_path(), path);
fs::create_dir(&path).await.unwrap();
for consumer_id in 1..=consumer_ids_count {
let expected_offsets_count = consumer_id;
for offset in 0..=offsets_count {
let consumer_offset = ConsumerOffset::new(kind, consumer_id, offset, &path);
assert_persisted_offset(&path, storage, &consumer_offset, expected_offsets_count).await;
}
}
}
async fn assert_persisted_offset(
path: &str,
storage: &PartitionStorageKind,
consumer_offset: &ConsumerOffset,
expected_offsets_count: u32,
) {
storage
.save_consumer_offset(consumer_offset.offset, &consumer_offset.path)
.await
.unwrap();
let consumer_offsets = storage
.load_consumer_offsets(consumer_offset.kind, path)
.await
.unwrap();
let expected_offsets_count = expected_offsets_count as usize;
assert_eq!(consumer_offsets.len(), expected_offsets_count);
let loaded_consumer_offset = consumer_offsets.get(expected_offsets_count - 1).unwrap();
assert!(loaded_consumer_offset.offset == consumer_offset.offset);
assert_eq!(loaded_consumer_offset.kind, consumer_offset.kind);
assert_eq!(
loaded_consumer_offset.consumer_id,
consumer_offset.consumer_id
);
assert_eq!(loaded_consumer_offset.path, consumer_offset.path);
}