From e147866c11fa04404c2fe7d0aeb304f80476e217 Mon Sep 17 00:00:00 2001 From: CJ Ziegler Date: Mon, 28 Oct 2024 20:37:38 -0400 Subject: [PATCH 1/2] Implement support for function-timeout configuration --- .../Amazon.Lambda.TestTool/LambdaConfigFile.cs | 2 ++ .../Runtime/LambdaDefaultsConfigFileParser.cs | 6 +++++- .../Runtime/LambdaExecutor.cs | 3 ++- .../Runtime/LambdaFunctionInfo.cs | 8 +++++++- .../DefaultsFileParseTests.cs | 16 ++++++++++++++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs index db5a544ac..43efee45c 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs @@ -15,6 +15,8 @@ public class LambdaConfigFile public string FunctionHandler { get; set; } [JsonPropertyName("function-name")] public string FunctionName { get; set; } + [JsonPropertyName("function-timeout")] + public int? FunctionTimeOut { get; set; } [JsonPropertyName("image-command")] public string ImageCommand { get; set; } diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs index 1a21cd55b..4cee945b7 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs @@ -69,7 +69,11 @@ public static LambdaConfigInfo LoadFromFile(LambdaConfigFile configFile) info.Name = functionHandler; } - if(configFile.EnvironmentVariables != null) + info.Timeout = configFile.FunctionTimeOut.HasValue + ? TimeSpan.FromSeconds(configFile.FunctionTimeOut.Value) + : TimeSpan.FromMinutes(15); + + if (configFile.EnvironmentVariables != null) { ParseKeyValueOption(configFile.EnvironmentVariables, info.EnvironmentVariables); } diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaExecutor.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaExecutor.cs index e0b053486..14fc21118 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaExecutor.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaExecutor.cs @@ -56,7 +56,8 @@ public async Task ExecuteAsync(ExecutionRequest request) Logger = logger, AwsRequestId = Guid.NewGuid().ToString(), FunctionName = request.Function.FunctionInfo.Name, - InvokedFunctionArn = string.Format("arn:aws:lambda:{0}::function:{1}", request.AWSRegion, request.Function.FunctionInfo.Name) + InvokedFunctionArn = string.Format("arn:aws:lambda:{0}::function:{1}", request.AWSRegion, request.Function.FunctionInfo.Name), + RemainingTime = request.Function.FunctionInfo.Timeout }; object instance = null; diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaFunctionInfo.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaFunctionInfo.cs index 4c34399bd..d95ab04bd 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaFunctionInfo.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaFunctionInfo.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace Amazon.Lambda.TestTool.Runtime { @@ -14,6 +15,11 @@ public class LambdaFunctionInfo /// public string Handler { get; set; } + /// + /// The amount of time the lambda function has to run before it times out. + /// + public TimeSpan Timeout { get; set; } + public IDictionary EnvironmentVariables { get; } = new Dictionary(); } } \ No newline at end of file diff --git a/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs b/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs index 11d72953b..235920663 100644 --- a/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs +++ b/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs @@ -161,6 +161,22 @@ public void SetRegion() } } + [Fact] + public void SetTimeOut() + { + var jsonFile = WriteTempConfigFile("{\"function-timeout\" : 30, \"function-handler\" : \"Assembly::Type::Method\"}"); + try + { + var configInfo = LambdaDefaultsConfigFileParser.LoadFromFile(jsonFile); + Assert.Single(configInfo.FunctionInfos); + Assert.Equal(TimeSpan.FromSeconds(30), configInfo.FunctionInfos[0].Timeout); + } + finally + { + File.Delete(jsonFile); + } + } + [Fact] public void LoadServerlessTemplateConfig() { From 56e0897ee8a7396001342e84d80da44dfcd2c268 Mon Sep 17 00:00:00 2001 From: CJ Date: Thu, 8 May 2025 14:43:15 -0400 Subject: [PATCH 2/2] Add configuration option for overriding function timeout for debugging --- .../LambdaConfigFile.cs | 4 ++- .../Runtime/LambdaDefaultsConfigFileParser.cs | 13 ++++++--- .../DefaultsFileParseTests.cs | 27 +++++++++++++++---- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs index 43efee45c..4c5da84cd 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json.Serialization; @@ -17,6 +17,8 @@ public class LambdaConfigFile public string FunctionName { get; set; } [JsonPropertyName("function-timeout")] public int? FunctionTimeOut { get; set; } + [JsonPropertyName("function-debugtimeout")] + public int? FunctionDebugTimeOut { get; set; } [JsonPropertyName("image-command")] public string ImageCommand { get; set; } diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs index cedc3395c..26596c28e 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs @@ -69,9 +69,7 @@ public static LambdaConfigInfo LoadFromFile(LambdaConfigFile configFile) info.Name = functionHandler; } - info.Timeout = configFile.FunctionTimeOut.HasValue - ? TimeSpan.FromSeconds(configFile.FunctionTimeOut.Value) - : TimeSpan.FromMinutes(15); + info.Timeout = GetFunctionTimeOut(configFile); if (configFile.EnvironmentVariables != null) { @@ -371,5 +369,14 @@ private static void ProcessJsonServerlessTemplate(LambdaConfigInfo configInfo, s } } } + + private static TimeSpan GetFunctionTimeOut(LambdaConfigFile configFile) + { + var configValue = configFile.FunctionDebugTimeOut ?? configFile.FunctionTimeOut; + + return configValue.HasValue + ? TimeSpan.FromSeconds(configValue.Value) + : TimeSpan.FromMinutes(15); + } } } diff --git a/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs b/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs index 235920663..24711d2b0 100644 --- a/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs +++ b/Tools/LambdaTestTool/tests/Amazon.Lambda.TestTool.Tests/DefaultsFileParseTests.cs @@ -5,6 +5,7 @@ using Amazon.Lambda.TestTool.Runtime; using Amazon.Lambda.AspNetCoreServer.Internal; using System.Collections.Generic; +using System.Text.Json.Nodes; namespace Amazon.Lambda.TestTool.Tests { @@ -161,15 +162,31 @@ public void SetRegion() } } - [Fact] - public void SetTimeOut() + [Theory] + [InlineData(null, null, 15*60)] + [InlineData(30, null, 30)] + [InlineData(null, 45, 45)] + [InlineData(30, 45, 45)] + public void SetTimeOut(int? timeOut, int? debugTimeout, int expectedSeconds) { - var jsonFile = WriteTempConfigFile("{\"function-timeout\" : 30, \"function-handler\" : \"Assembly::Type::Method\"}"); + var jsonObject = new JsonObject(); + + if (timeOut != null) + { + jsonObject.Add(KeyValuePair.Create("function-timeout", timeOut.Value)); + } + if (debugTimeout != null) + { + jsonObject.Add(KeyValuePair.Create("function-debugtimeout", debugTimeout.Value)); + } + jsonObject.Add(KeyValuePair.Create("function-handler", "Assembly::Type::Method")); + + var jsonFile = WriteTempConfigFile(jsonObject.ToString()); try { var configInfo = LambdaDefaultsConfigFileParser.LoadFromFile(jsonFile); Assert.Single(configInfo.FunctionInfos); - Assert.Equal(TimeSpan.FromSeconds(30), configInfo.FunctionInfos[0].Timeout); + Assert.Equal(TimeSpan.FromSeconds(expectedSeconds), configInfo.FunctionInfos[0].Timeout); } finally { @@ -316,4 +333,4 @@ private string WriteTempConfigFile(string json) return filePath; } } -} \ No newline at end of file +}