use core::time::Duration;
use std::time::{Instant, SystemTime};
use crate::model::{
MetricState, ProcessIdentity, ProcessIo, ProcessMemory, ProcessSnapshot, ProcessState,
SystemSnapshot, UserIdentity,
};
use crate::units::{Percent, Rate};
pub(crate) fn process(pid: u32, start_key: u64) -> Fixture {
Fixture {
process: ProcessSnapshot {
identity: ProcessIdentity::new(pid, start_key),
parent_pid: None,
name: format!("p{pid}").into(),
command: String::new().into(),
exe: None,
user: MetricState::Unsupported,
state: ProcessState::Running,
cpu: MetricState::WarmingUp,
memory: ProcessMemory::WARMING_UP,
io: ProcessIo::UNSUPPORTED,
threads: MetricState::Unsupported,
age: MetricState::Unsupported,
started_at: MetricState::Unsupported,
is_kernel_thread: false,
},
}
}
pub(crate) fn snapshot(processes: Vec<ProcessSnapshot>) -> SystemSnapshot {
let mut snapshot = SystemSnapshot::warming_up(Instant::now(), SystemTime::UNIX_EPOCH, 8);
snapshot.processes = processes;
snapshot
}
pub(crate) struct Fixture {
process: ProcessSnapshot,
}
impl Fixture {
pub(crate) fn parent(mut self, pid: u32) -> Self {
self.process.parent_pid = Some(pid);
self
}
pub(crate) fn name(mut self, name: &str) -> Self {
self.process.name = name.into();
self
}
pub(crate) fn command(mut self, command: &str) -> Self {
self.process.command = command.into();
self
}
pub(crate) fn cpu(mut self, percent: f32) -> Self {
self.process.cpu = MetricState::Available(Percent::new(percent).expect("valid percent"));
self
}
pub(crate) fn cpu_state(mut self, state: MetricState<Percent>) -> Self {
self.process.cpu = state;
self
}
pub(crate) fn rss(mut self, bytes: u64) -> Self {
self.process.memory.rss_bytes = MetricState::Available(bytes);
self
}
pub(crate) fn virtual_bytes(mut self, bytes: u64) -> Self {
self.process.memory.virtual_bytes = MetricState::Available(bytes);
self
}
pub(crate) fn read(mut self, per_second: f64) -> Self {
self.process.io.read = MetricState::Available(Rate::new(per_second).expect("valid rate"));
self
}
pub(crate) fn write(mut self, per_second: f64) -> Self {
self.process.io.write = MetricState::Available(Rate::new(per_second).expect("valid rate"));
self
}
pub(crate) fn threads(mut self, count: u32) -> Self {
self.process.threads = MetricState::Available(count);
self
}
pub(crate) fn age(mut self, seconds: u64) -> Self {
self.process.age = MetricState::Available(Duration::from_secs(seconds));
self
}
pub(crate) fn user(mut self, uid: u32, name: Option<&str>) -> Self {
self.process.user = MetricState::Available(UserIdentity {
uid,
name: name.map(Into::into),
});
self
}
pub(crate) fn user_state(mut self, state: MetricState<UserIdentity>) -> Self {
self.process.user = state;
self
}
pub(crate) fn state(mut self, state: ProcessState) -> Self {
self.process.state = state;
self
}
pub(crate) fn kernel_thread(mut self) -> Self {
self.process.is_kernel_thread = true;
self
}
pub(crate) fn build(self) -> ProcessSnapshot {
self.process
}
}