use std::sync::atomic::{AtomicBool, Ordering};
static IS_COLD_START: AtomicBool = AtomicBool::new(true);
pub fn check_cold_start() -> bool {
if std::env::var("AWS_LAMBDA_INITIALIZATION_TYPE")
.map(|v| v == "provisioned-concurrency")
.unwrap_or(false)
{
IS_COLD_START.store(false, Ordering::SeqCst);
return false;
}
IS_COLD_START.swap(false, Ordering::SeqCst)
}
#[cfg(test)]
pub(crate) fn reset_cold_start_for_testing() {
IS_COLD_START.store(true, Ordering::SeqCst);
}
#[cfg(test)]
mod tests {
use super::*;
use serial_test::serial;
#[test]
#[serial]
fn test_cold_start_first_invocation() {
reset_cold_start_for_testing();
assert!(check_cold_start());
assert!(!check_cold_start());
assert!(!check_cold_start());
}
#[test]
#[serial]
fn test_provisioned_concurrency_not_cold_start() {
reset_cold_start_for_testing();
temp_env::with_var(
"AWS_LAMBDA_INITIALIZATION_TYPE",
Some("provisioned-concurrency"),
|| {
assert!(!check_cold_start());
},
);
}
#[test]
#[serial]
fn test_other_initialization_type_is_cold_start() {
reset_cold_start_for_testing();
temp_env::with_var("AWS_LAMBDA_INITIALIZATION_TYPE", Some("on-demand"), || {
assert!(check_cold_start());
});
}
}