Beispiel #1
0
        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();
        }
Beispiel #2
0
            /// 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());
            }
Beispiel #3
0
            /// 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);
            }
Beispiel #4
0
        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();
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 public LambdaInstancePool(LambdaFunctionInfo lambdaFunctionInfo)
 {
     _lambdaFunctionInfo = lambdaFunctionInfo;
 }
Beispiel #7
0
 public void AddFunction(LambdaFunctionInfo lambdaFunctionInfo)
 {
     _functions.Add(lambdaFunctionInfo.Name, lambdaFunctionInfo);
 }
Beispiel #8
0
 public LambdaInstance(LambdaFunctionInfo lambdaFunction)
 {
     LambdaFunction   = lambdaFunction;
     FunctionInstance = Activator.CreateInstance(lambdaFunction.Type) !;
     InstanceId       = Guid.NewGuid();
 }