use chrono::Utc;
use crate::env as lambda_env;
use lambda_runtime_client;
#[derive(Default, Clone)]
pub struct Context {
pub memory_limit_in_mb: i32,
pub function_name: String,
pub function_version: String,
pub invoked_function_arn: String,
pub aws_request_id: String,
pub xray_trace_id: Option<String>,
pub log_stream_name: String,
pub log_group_name: String,
pub client_context: Option<lambda_runtime_client::ClientContext>,
pub identity: Option<lambda_runtime_client::CognitoIdentity>,
pub deadline: i64,
}
impl Context {
pub(super) fn new(local_settings: lambda_env::FunctionSettings) -> Context {
Context {
xray_trace_id: None,
memory_limit_in_mb: local_settings.memory_size,
function_name: local_settings.function_name,
function_version: local_settings.version,
log_stream_name: local_settings.log_stream,
log_group_name: local_settings.log_group,
..Default::default()
}
}
pub fn get_time_remaining_millis(&self) -> i64 {
self.deadline - Utc::now().timestamp_millis()
}
}
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use crate::env::{self, ConfigProvider};
use std::{thread::sleep, time};
fn get_deadline(timeout_secs: i64) -> i64 {
let deadline = Utc::now() + chrono::Duration::seconds(timeout_secs);
deadline.timestamp_millis()
}
pub(crate) fn test_context(timeout_secs: i64) -> Context {
Context {
memory_limit_in_mb: 128,
function_name: "test_func".to_string(),
function_version: "$LATEST".to_string(),
invoked_function_arn: "arn:aws:lambda".to_string(),
aws_request_id: "123".to_string(),
xray_trace_id: Some("123".to_string()),
log_stream_name: "logStream".to_string(),
log_group_name: "logGroup".to_string(),
client_context: Option::default(),
identity: Option::default(),
deadline: get_deadline(timeout_secs),
}
}
#[test]
fn verify_time_remaining() {
let config = env::tests::MockConfigProvider { error: false };
let mut ctx = Context::new(config.get_function_settings().unwrap());
ctx.deadline = get_deadline(10);
println!("Set deadline to: {}", ctx.deadline);
sleep(time::Duration::new(2, 0));
let remaining = ctx.get_time_remaining_millis();
assert!(
remaining > 7800 && remaining < 8200,
"Remaining time in millis outside the expected range: {}",
remaining
);
}
}