use crate::{Claim, Value};
pub fn normalize_local_clocks(claims: &mut [Claim], host_utc_offset_secs: i64) {
for claim in claims.iter_mut() {
if !claim.provenance.source.clock_is_local() {
continue;
}
if let Value::Timestamp(secs) = &mut claim.value {
*secs -= host_utc_offset_secs;
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::model::{Attribute, DeviceKey, Provenance, SourceKind};
fn claim(src: SourceKind, value: Value) -> Claim {
Claim {
device: DeviceKey("SN1".into()),
attribute: Attribute::FirstConnected,
value,
provenance: Provenance {
source: src,
locator: "l".into(),
},
}
}
#[test]
fn local_timestamp_is_shifted_utc_is_not() {
let mut claims = [
claim(SourceKind::SetupApi, Value::Timestamp(1_700_000_000)), claim(SourceKind::Usbstor, Value::Timestamp(1_700_000_000)), claim(SourceKind::SetupApi, Value::Text("KINGSTON".into())), ];
normalize_local_clocks(&mut claims, 3600); assert_eq!(claims[0].value, Value::Timestamp(1_699_996_400)); assert_eq!(claims[1].value, Value::Timestamp(1_700_000_000)); assert_eq!(claims[2].value, Value::Text("KINGSTON".into())); }
#[test]
fn clock_is_local_for_setupapi_and_linux_kernel_log() {
assert!(SourceKind::SetupApi.clock_is_local());
assert!(SourceKind::LinuxKernelLog.clock_is_local());
assert!(!SourceKind::Usbstor.clock_is_local());
assert!(!SourceKind::Lnk.clock_is_local());
}
#[test]
fn linux_kernel_log_timestamp_is_shifted_like_setupapi() {
let mut claims = [claim(
SourceKind::LinuxKernelLog,
Value::Timestamp(1_700_000_000),
)];
normalize_local_clocks(&mut claims, 3600);
assert_eq!(claims[0].value, Value::Timestamp(1_699_996_400));
}
}