#![doc(issue_tracker_base_url = "https://github.com/adlane/exec_duration/issues/")]
#![doc(html_root_url = "https://docs.rs/exec_duration/0.1.1")]
#![doc(html_no_source)]
#![deny(missing_docs)]
#[cfg(feature = "serde")]
#[macro_use]
extern crate serde;
#[cfg(test)]
#[macro_use]
extern crate more_asserts;
mod manager;
pub mod output;
pub fn fetch_results() -> Vec<output::ExecDuration> {
let ctx = manager::get_instance();
unsafe {
let ctx: &mut manager::ExecProbeManager = &mut *ctx;
ctx.fetch_results()
}
}
impl ExecProbe {
pub fn new(name: &str) -> Self {
ExecProbe {
data: manager::ExecData::new(name),
stop_done: false,
}
}
pub fn add_point(&mut self, name: &str) {
self.data.add_point(name);
}
pub fn stop(&mut self) {
if !self.stop_done {
self.data.stop();
self.stop_done = true;
}
}
}
impl Drop for ExecProbe {
fn drop(&mut self) {
self.stop();
}
}
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ExecProbe {
data: manager::ExecData,
stop_done: bool,
}
#[cfg(test)]
mod tests {
use crate::ExecProbe;
use std::thread::sleep;
use std::time;
const NB: u64 = 10;
const SLEEP_1: u64 = 100;
const SLEEP_2: u64 = 50;
const MAIN: &str = "main";
const FUNC_1: &str = "func_1";
const FUNC_2: &str = "func_2";
#[test]
fn hello() {
let mut i = 0;
while i < NB {
let mut o = ExecProbe::new(MAIN);
func1();
o.add_point(FUNC_1);
func2();
o.add_point(FUNC_2);
i += 1;
}
let list = crate::fetch_results();
assert_eq!(list.len(), 1);
let r = list.get(0).unwrap();
assert_eq!(r.get_name(), MAIN);
assert_eq!(r.get_exec_count(), NB);
assert_le!(
r.get_avg_duration().as_millis(),
(SLEEP_1 + SLEEP_2 + 1) as u128
);
assert_le!(
r.get_total_duration().as_millis(),
((SLEEP_1 + SLEEP_2 + 1) * NB) as u128
);
assert_ge!(
r.get_avg_duration().as_millis(),
(SLEEP_1 + SLEEP_2) as u128
);
assert_ge!(
r.get_total_duration().as_millis(),
((SLEEP_1 + SLEEP_2) * NB) as u128
);
assert_eq!(r.get_elements().len(), 2);
let v = r.get_elements().get(0).unwrap();
assert_eq!(v.get_name(), FUNC_1);
assert_eq!(v.get_exec_count(), NB);
assert_le!(v.get_avg_duration().as_millis(), (SLEEP_1 + 1) as u128);
assert_le!(
v.get_total_duration().as_millis(),
((SLEEP_1 + 1) * NB) as u128
);
assert_ge!(v.get_avg_duration().as_millis(), SLEEP_1 as u128);
assert_ge!(v.get_total_duration().as_millis(), (SLEEP_1 * NB) as u128);
assert_eq!(v.get_elements().len(), 0);
let v = r.get_elements().get(1).unwrap();
assert_eq!(v.get_name(), FUNC_2);
assert_eq!(v.get_exec_count(), NB);
assert_le!(v.get_avg_duration().as_millis(), (SLEEP_2 + 1) as u128);
assert_le!(
v.get_total_duration().as_millis(),
((SLEEP_2 + 1) * NB) as u128
);
assert_ge!(v.get_avg_duration().as_millis(), SLEEP_2 as u128);
assert_ge!(v.get_total_duration().as_millis(), (SLEEP_2 * NB) as u128);
assert_eq!(v.get_elements().len(), 0);
}
fn func1() {
sleep(time::Duration::from_millis(SLEEP_1));
}
fn func2() {
sleep(time::Duration::from_millis(SLEEP_2));
}
}