public void Can_get_lambda_instance() { var lambdaFunctionInfos = new Dictionary <string, LambdaFunctionInfo>(); var lambdaFunctionInfo = new LambdaFunctionInfo( "test", typeof(ReverseStringFunction), nameof(ReverseStringFunction.Reverse)); lambdaFunctionInfos.Add(lambdaFunctionInfo.Name, lambdaFunctionInfo); var lambdaAccountPool = new LambdaAccountPool(1000, lambdaFunctionInfos); var lambdaInstance = lambdaAccountPool.Get("test"); lambdaInstance.ShouldNotBeNull(); }
/// Adapted from Amazon.Lambda.TestTools private static async Task <string?> ProcessReturnAsync(LambdaFunctionInfo functionInfo, object?lambdaReturnObject) { Stream?lambdaReturnStream = null; if (lambdaReturnObject == null) { return(null); } // If the return was a Task then wait till the task is complete. if (lambdaReturnObject is Task task) { await task; // Check to see if the Task returns back an object. if (task.GetType().IsGenericType) { var resultProperty = task.GetType().GetProperty("Result", BindingFlags.Public | BindingFlags.Instance); if (resultProperty != null) { var taskResult = resultProperty.GetMethod !.Invoke(task, null); if (taskResult is Stream stream) { lambdaReturnStream = stream; } else { lambdaReturnStream = new MemoryStream(); functionInfo.Serializer !.Serialize(taskResult, lambdaReturnStream); } } } } else { lambdaReturnStream = new MemoryStream(); functionInfo.Serializer !.Serialize(lambdaReturnObject, lambdaReturnStream); } if (lambdaReturnStream == null) { return(null); } lambdaReturnStream.Position = 0; using var reader = new StreamReader(lambdaReturnStream); return(await reader.ReadToEndAsync()); }
/// Adapted from Amazon.Lambda.TestTools private static object[] BuildParameters(LambdaFunctionInfo functionInfo, ILambdaContext context, string?payload) { var parameters = functionInfo.HandlerMethod.GetParameters(); var parameterValues = new object[parameters.Length]; if (parameterValues.Length > 2) { throw new Exception($"Method {functionInfo.HandlerMethod.Name} has too many parameters, {parameterValues.Length}. Methods called by Lambda" + $"can have at most 2 parameters. The first is the input object and the second is an ILambdaContext."); } for (var i = 0; i < parameters.Length; i++) { if (parameters[i].ParameterType == typeof(ILambdaContext)) { parameterValues[i] = context; } else if (payload != null) { var stream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); if (functionInfo.Serializer != null) { var genericMethodInfo = functionInfo.Serializer.GetType() .GetMethods(BindingFlags.Public | BindingFlags.Instance) .FirstOrDefault(x => string.Equals(x.Name, "Deserialize")); var methodInfo = genericMethodInfo?.MakeGenericMethod(parameters[i].ParameterType); try { parameterValues[i] = methodInfo !.Invoke(functionInfo.Serializer, new object[] { stream }) !; } catch (Exception e) { throw new Exception($"Error deserializing the input JSON to type {parameters[i].ParameterType.Name}", e); } } else { parameterValues[i] = stream; } } } return(parameterValues); }
public void When_limiting_account_concurrency_exceeded_then_should_not_get_an_instance() { var lambdaFunctionInfos = new Dictionary <string, LambdaFunctionInfo>(); var lambdaFunctionInfo = new LambdaFunctionInfo( "test", typeof(ReverseStringFunction), nameof(ReverseStringFunction.Reverse)); lambdaFunctionInfos.Add(lambdaFunctionInfo.Name, lambdaFunctionInfo); var lambdaAccountPool = new LambdaAccountPool(1, lambdaFunctionInfos); var lambdaInstance1 = lambdaAccountPool.Get("test"); var lambdaInstance2 = lambdaAccountPool.Get("test"); lambdaInstance1.ShouldNotBeNull(); lambdaInstance2.ShouldBeNull(); }
public void Can_return_an_instance() { var lambdaFunctionInfos = new Dictionary <string, LambdaFunctionInfo>(); var lambdaFunctionInfo = new LambdaFunctionInfo( "test", typeof(ReverseStringFunction), nameof(ReverseStringFunction.Reverse)); lambdaFunctionInfos.Add(lambdaFunctionInfo.Name, lambdaFunctionInfo); var lambdaAccountPool = new LambdaAccountPool(1, lambdaFunctionInfos); var lambdaInstance1 = lambdaAccountPool.Get("test"); lambdaAccountPool.Return(lambdaInstance1 !); var lambdaInstance2 = lambdaAccountPool.Get("test"); lambdaInstance2.ShouldBe(lambdaInstance1); }
public LambdaInstancePool(LambdaFunctionInfo lambdaFunctionInfo) { _lambdaFunctionInfo = lambdaFunctionInfo; }
public void AddFunction(LambdaFunctionInfo lambdaFunctionInfo) { _functions.Add(lambdaFunctionInfo.Name, lambdaFunctionInfo); }
public LambdaInstance(LambdaFunctionInfo lambdaFunction) { LambdaFunction = lambdaFunction; FunctionInstance = Activator.CreateInstance(lambdaFunction.Type) !; InstanceId = Guid.NewGuid(); }