use {
crate::flamegraph::render_per_tx_flamegraphs,
anyhow::{Context, Result},
std::{
collections::BTreeMap,
fs,
path::{Path, PathBuf},
},
};
pub const DEFAULT_PROFILE_DIR: &str = "target/anchor-v2-profile";
pub struct RenderedTest {
pub test_name: String,
pub svg_paths: Vec<PathBuf>,
}
pub fn render_all_tests(
root: &Path,
manifest_dir: Option<&Path>,
programs: &BTreeMap<String, PathBuf>,
) -> Result<Vec<RenderedTest>> {
if !root.exists() {
return Ok(Vec::new());
}
let mut out = Vec::new();
for entry in fs::read_dir(root)
.with_context(|| format!("failed to read profile root {}", root.display()))?
{
let entry = entry?;
let path = entry.path();
if !path.is_dir() {
continue;
}
let Some(test_name) = path.file_name().and_then(|n| n.to_str()) else {
continue;
};
let svg_paths = render_per_tx_flamegraphs(test_name, &path, programs, root, manifest_dir)
.with_context(|| format!("render flamegraphs for test {test_name}"))?;
if svg_paths.is_empty() {
continue;
}
out.push(RenderedTest {
test_name: test_name.to_owned(),
svg_paths,
});
}
Ok(out)
}