use memscope_rs::capture::backends::global_tracking::{
global_tracker, init_global_tracking, reset_global_tracking,
};
use memscope_rs::MemScopeError;
#[test]
fn test_simplified_api() -> Result<(), MemScopeError> {
reset_global_tracking();
let tracker = match global_tracker() {
Ok(t) => t,
Err(_) => {
init_global_tracking()?;
global_tracker()?
}
};
let initial_stats = tracker.get_stats();
let data = vec![1, 2, 3, 4, 5];
tracker.track(&data);
let text = String::from("Hello, world!");
tracker.track(&text);
let stats = tracker.get_stats();
assert!(stats.total_allocations >= initial_stats.total_allocations);
tracker.export_json("/tmp/test_export_json")?;
tracker.export_html("/tmp/test_export_html")?;
Ok(())
}
#[test]
fn test_init_twice() {
reset_global_tracking();
let first_result = init_global_tracking();
match first_result {
Ok(_) => {
let second_result = init_global_tracking();
assert!(second_result.is_err(), "Second initialization should fail");
}
Err(_) => {
}
}
}
#[test]
fn test_track_exact() -> Result<(), MemScopeError> {
reset_global_tracking();
let tracker = match global_tracker() {
Ok(t) => t,
Err(_) => {
init_global_tracking()?;
global_tracker()?
}
};
let initial_stats = tracker.get_stats();
let important_data = vec![10, 20, 30];
tracker.track_as(&important_data, "important_data", "test.rs", 42);
let stats = tracker.get_stats();
assert!(stats.total_allocations >= initial_stats.total_allocations);
Ok(())
}
#[test]
fn test_export_before_init() {
reset_global_tracking();
let result = global_tracker();
match result {
Ok(_) => {
}
Err(_) => {
}
}
}
#[test]
fn test_tracker_statistics() -> Result<(), MemScopeError> {
reset_global_tracking();
let tracker = match global_tracker() {
Ok(t) => t,
Err(_) => {
init_global_tracking()?;
global_tracker()?
}
};
let initial_stats = tracker.get_stats();
let data = vec![1u8; 1024]; tracker.track(&data);
let stats = tracker.get_stats();
assert!(stats.total_allocations >= initial_stats.total_allocations);
assert!(stats.current_memory_bytes >= initial_stats.current_memory_bytes);
Ok(())
}
#[test]
fn test_tracker_analysis() -> Result<(), MemScopeError> {
reset_global_tracking();
let tracker = match global_tracker() {
Ok(t) => t,
Err(_) => {
init_global_tracking()?;
global_tracker()?
}
};
let data = vec![1, 2, 3, 4, 5];
tracker.track(&data);
let report = tracker.analyze();
let _ = report.total_allocations;
Ok(())
}
#[test]
fn test_global_tracker_singleton() -> Result<(), MemScopeError> {
reset_global_tracking();
let tracker1 = match global_tracker() {
Ok(t) => t,
Err(_) => {
init_global_tracking()?;
global_tracker()?
}
};
let tracker2 = global_tracker()?;
assert!(
std::ptr::eq(&*tracker1, &*tracker2),
"Should return same instance"
);
Ok(())
}