#![allow(clippy::uninlined_format_args)]
#![allow(clippy::manual_repeat_n)]
use casc_storage::manifest::{ManifestConfig, TactManifests};
#[tokio::test]
async fn test_lazy_loading_initialization() {
let config = ManifestConfig {
lazy_loading: true,
lazy_cache_limit: 1000,
..Default::default()
};
let manifests = TactManifests::new(config);
assert!(!manifests.is_loaded());
let mock_root_data = create_mock_root_data();
let mock_encoding_data = create_mock_encoding_data();
manifests.load_root_from_data(mock_root_data).unwrap();
manifests
.load_encoding_from_data(mock_encoding_data)
.unwrap();
assert!(manifests.is_loaded());
println!("✓ Lazy loading initialization test passed");
}
#[tokio::test]
async fn test_lazy_loading_fallback() {
let config = ManifestConfig {
lazy_loading: true,
..Default::default()
};
let manifests = TactManifests::new(config);
let mock_root_data = create_mock_root_data();
let mock_encoding_data = create_mock_encoding_data();
manifests.load_root_from_data(mock_root_data).unwrap();
manifests
.load_encoding_from_data(mock_encoding_data)
.unwrap();
let result = manifests.lookup_by_fdid(123456);
match result {
Ok(_) => println!("Lookup succeeded (unexpected with mock data)"),
Err(_) => println!("Lookup failed as expected with mock data"),
}
println!("✓ Lazy loading fallback test passed");
}
#[tokio::test]
async fn test_lazy_vs_full_memory_usage() {
for lazy_enabled in [false, true] {
let config = ManifestConfig {
lazy_loading: lazy_enabled,
..Default::default()
};
let manifests = TactManifests::new(config);
let large_mock_data = create_large_mock_data();
let before_memory = get_approximate_memory_usage();
manifests
.load_root_from_data(large_mock_data.clone())
.unwrap();
let encoding_data = create_large_mock_encoding_data();
manifests.load_encoding_from_data(encoding_data).unwrap();
let after_memory = get_approximate_memory_usage();
println!(
"Memory usage (lazy={}): {} -> {} bytes",
lazy_enabled, before_memory, after_memory
);
manifests.clear_cache();
let after_clear = get_approximate_memory_usage();
println!(
"Memory after cache clear (lazy={}): {} bytes",
lazy_enabled, after_clear
);
}
println!("✓ Memory usage comparison test completed");
}
fn create_mock_root_data() -> Vec<u8> {
let mut data = Vec::new();
data.extend_from_slice(b"TSFM");
data.extend_from_slice(&0x18u32.to_le_bytes());
data.extend_from_slice(&1u32.to_le_bytes());
data.extend_from_slice(&10u32.to_le_bytes());
data.extend_from_slice(&10u32.to_le_bytes());
data.extend_from_slice(&0u32.to_le_bytes());
data.extend(std::iter::repeat(0).take(100));
data
}
fn create_mock_encoding_data() -> Vec<u8> {
let mut data = Vec::new();
data.extend_from_slice(&[0x45, 0x4E]);
data.push(1);
data.push(16); data.push(16);
data.extend_from_slice(&1u16.to_be_bytes()); data.extend_from_slice(&1u16.to_be_bytes());
data.extend_from_slice(&0u32.to_be_bytes()); data.extend_from_slice(&0u32.to_be_bytes());
data.push(0);
data.extend_from_slice(&0u32.to_be_bytes());
data.extend(std::iter::repeat(0).take(100));
data
}
fn create_large_mock_data() -> Vec<u8> {
let mut base_data = create_mock_root_data();
for i in 0..10000 {
base_data.extend_from_slice(&(i as u32).to_le_bytes());
}
base_data
}
fn create_large_mock_encoding_data() -> Vec<u8> {
let mut base_data = create_mock_encoding_data();
for i in 0..10000 {
base_data.extend_from_slice(&(i as u32).to_be_bytes()); }
base_data
}
fn get_approximate_memory_usage() -> usize {
std::mem::size_of::<usize>() * 1000 }
#[test]
fn test_lazy_loading_configuration() {
let default_config = ManifestConfig::default();
assert!(
default_config.lazy_loading,
"Lazy loading should be enabled by default"
);
assert_eq!(
default_config.lazy_cache_limit, 10_000,
"Default cache limit should be 10,000"
);
let custom_config = ManifestConfig {
lazy_loading: false,
lazy_cache_limit: 5000,
..Default::default()
};
assert!(
!custom_config.lazy_loading,
"Lazy loading should be disabled when set to false"
);
assert_eq!(
custom_config.lazy_cache_limit, 5000,
"Cache limit should match configured value"
);
println!("✓ Lazy loading configuration test passed");
}
#[tokio::test]
async fn test_lazy_cache_clearing() {
let config = ManifestConfig {
lazy_loading: true,
..Default::default()
};
let manifests = TactManifests::new(config);
manifests
.load_root_from_data(create_mock_root_data())
.unwrap();
manifests
.load_encoding_from_data(create_mock_encoding_data())
.unwrap();
assert!(manifests.is_loaded());
manifests.clear_cache();
assert!(
manifests.is_loaded(),
"Clearing cache should not affect loaded status"
);
println!("✓ Lazy cache clearing test passed");
}