diff --git a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/LambdaConfigFile.cs index db5a544ac..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; @@ -15,6 +15,10 @@ 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("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 70ea92e47..26596c28e 100644 --- a/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs +++ b/Tools/LambdaTestTool/src/Amazon.Lambda.TestTool/Runtime/LambdaDefaultsConfigFileParser.cs @@ -69,7 +69,9 @@ public static LambdaConfigInfo LoadFromFile(LambdaConfigFile configFile) info.Name = functionHandler; } - if(configFile.EnvironmentVariables != null) + info.Timeout = GetFunctionTimeOut(configFile); + + if (configFile.EnvironmentVariables != null) { ParseKeyValueOption(configFile.EnvironmentVariables, info.EnvironmentVariables); } @@ -367,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/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..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,6 +162,38 @@ public void SetRegion() } } + [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 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(expectedSeconds), configInfo.FunctionInfos[0].Timeout); + } + finally + { + File.Delete(jsonFile); + } + } + [Fact] public void LoadServerlessTemplateConfig() { @@ -300,4 +333,4 @@ private string WriteTempConfigFile(string json) return filePath; } } -} \ No newline at end of file +}