mod common;
use crate::common::{build_git_repo, with_temp_dir};
use benchie::{append_benchmark, load_all_benchmarks, Benchmark, ExecutionResult, GitInfo, Value};
use serial_test::serial;
use std::collections::HashMap;
use std::env::set_current_dir;
use std::fs;
use std::fs::create_dir;
use std::path::Path;
use std::time::Duration;
#[test]
#[serial]
fn test_with_missing_dir() {
with_temp_dir(|temp_dir| {
let data_file_path = temp_dir.path().join(".benchie/data.json");
assert!(!data_file_path.exists());
let result = load_all_benchmarks();
assert!(
result.is_ok(),
"should not fail to read data with missing benchie directory"
);
assert!(
!data_file_path.exists(),
"should not have created a file, while reading"
);
let result = append_benchmark(&create_benchmark());
assert!(result.is_ok(), "should not fail with empty dir");
assert!(
data_file_path.exists(),
"should have created a file as a result"
);
})
}
#[test]
#[serial]
fn test_with_existing_dir_but_missing_data() {
with_temp_dir(|temp_dir| {
let benchie_dir = temp_dir.path().join(".benchie");
let data_file_path = benchie_dir.join("data.json");
let _ = create_dir(&benchie_dir);
assert!(benchie_dir.exists());
assert!(!data_file_path.exists());
let result = load_all_benchmarks();
assert!(
result.is_ok(),
"should not fail to read data with empty dir"
);
assert!(
!data_file_path.exists(),
"should not have created a file as a result"
);
let result = append_benchmark(&create_benchmark());
assert!(result.is_ok(), "should not fail with empty dir");
assert!(
data_file_path.exists(),
"should have created a file as a result"
);
})
}
#[test]
#[serial]
fn test_with_existing_dir_and_data() {
with_temp_dir(|temp_dir| {
let benchie_dir = temp_dir.path().join(".benchie");
let data_file_path = benchie_dir.join("data.json");
let _ = create_dir(&benchie_dir);
let benchmark = create_benchmark();
let data = format!(
"{{ \"schema\": 1, \"benchmarks\": [{}]}}",
serde_json::to_string_pretty(&benchmark).unwrap()
);
let _ = fs::write(&data_file_path, data);
let result = load_all_benchmarks();
assert!(
result.is_ok(),
"should not fail to read data with missing data file"
);
assert_eq!(
result.unwrap().len(),
1,
"should be able to load pre saved benchmark"
);
let result = append_benchmark(&create_benchmark());
assert!(result.is_ok(), "should succeed to append a benchmark");
let result = load_all_benchmarks();
assert!(
result.is_ok(),
"should successfully load multiple benchmarks"
);
assert_eq!(result.unwrap().len(), 2, "should have added a benchmark");
})
}
#[test]
#[serial]
fn should_save_tags_in_benchmark() {
with_temp_dir(|_| {
append_benchmark(&create_benchmark()).expect("should succeed to append a benchmark");
let benchmarks = load_all_benchmarks().expect("should successfully load benchmarks");
let benchmark = benchmarks.get(0).expect("should have loaded one benchmark");
assert_eq!(
benchmark.data.get("key"),
Some(&Value::String(String::from("value"))),
"should have added a key=value pair"
);
})
}
#[test]
#[serial]
fn should_use_git_repo_as_base_path_if_repo_discovered() {
with_temp_dir(|dir| {
build_git_repo(dir.path());
let subpath = dir.path().join("something");
let _ = create_dir(&subpath);
let _ = set_current_dir(&subpath);
append_benchmark(&create_benchmark()).expect("should succeed to append a benchmark");
assert!(
dir.path().join(".benchie/data.json").exists(),
"should have created a benchie data file in git root"
);
})
}
#[test]
#[serial]
fn should_use_current_dir_as_base_path_if_repo_can_not_be_found() {
with_temp_dir(|dir| {
let subpath = dir.path().join("something");
let _ = create_dir(&subpath);
let _ = set_current_dir(&subpath);
append_benchmark(&create_benchmark()).expect("should succeed to append a benchmark");
assert!(
dir.path().join("something/.benchie/data.json").exists(),
"should have created a benchie data file in current directory root"
);
})
}
fn create_execution_result() -> ExecutionResult {
ExecutionResult {
real_time: Duration::from_secs(1),
..Default::default()
}
}
fn create_benchmark() -> Benchmark {
let result = create_execution_result();
let info = GitInfo {
commit_id: "adfadsfasd".to_string(),
commit_message: "hello commit".to_string(),
branch: Some("master".to_string()),
is_dirty: false,
path: Path::new("bla").to_path_buf(),
};
let mut tags = HashMap::new();
tags.insert(String::from("key"), String::from("value"));
Benchmark::new(
&["ls".to_string(), "-la".to_string()],
&result,
&Some(info),
&tags,
)
}