public void Initialize()
        {
            mockMessageHandler = new Mock <IMessageHandler <TestMessage> >();
            mockMessageHandler.Setup(p => p.HandleAsync(It.IsAny <TestMessage>(), It.IsAny <ILambdaContext>())).Returns(Task.CompletedTask);

            mockServiceScope = new Mock <IServiceScope>();

            mockServiceScopeFactory = new Mock <IServiceScopeFactory>();

            mockServiceScopeFactory.Setup(p => p.CreateScope()).Returns(mockServiceScope.Object);

            mockServiceProvider = new Mock <IServiceProvider>();
            mockServiceProvider.Setup(p => p.GetService(typeof(IMessageHandler <TestMessage>)))
            .Returns(mockMessageHandler.Object);
            mockServiceProvider.Setup(p => p.GetService(typeof(IServiceScopeFactory)))
            .Returns(mockServiceScopeFactory.Object);

            mockServiceScope.Setup(p => p.ServiceProvider).Returns(mockServiceProvider.Object);

            mockLoggerFactory = new Mock <ILoggerFactory>();
            mockLoggerFactory.Setup(p => p.CreateLogger(It.IsAny <string>()))
            .Returns(Mock.Of <ILogger>());

            parallelExecutionOptions = new ParallelSqsExecutionOptions {
                MaxDegreeOfParallelism = 4
            };
        }
        public void MaxDegreeOfParallelism_Should_ProperlyPropagated_And_Limited_To_Set_Max()
        {
            var sqsEvent = new SQSEvent
            {
                Records = new List <SQSEvent.SQSMessage>
                {
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                }
            };

            var cq = new ConcurrentQueue <Task>();

            //We are checking if parallelism actually does what it's supposed to do. So we should have more then 2 concurrent processes running
            parallelExecutionOptions = new ParallelSqsExecutionOptions {
                MaxDegreeOfParallelism = 4
            };
            mockMessageHandler.Setup(p => p.HandleAsync(It.IsAny <TestMessage>(), It.IsAny <ILambdaContext>()))
            .Returns(async() =>
            {
                var t = Task.Delay(1);
                cq.Enqueue(t);
                Console.WriteLine(cq.Count);
                if (cq.Count > 2)
                {
                    throw new Exception("Concurrent Tasks exceeded 2");
                }
                await t;
                cq.TryDequeue(out t);
            });

            var sut = CreateSystemUnderTest();

            Assert.ThrowsAsync <Exception>(() => sut.HandleAsync(sqsEvent, new TestLambdaContext()));
        }
        public async Task MaxDegreeOfParallelism_Should_ProperlyPropagated()
        {
            var sqsEvent = new SQSEvent
            {
                Records = new List <SQSEvent.SQSMessage>
                {
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                    new SQSEvent.SQSMessage
                    {
                        Body = "{}"
                    },
                }
            };

            var cq = new ConcurrentQueue <Task>();

            parallelExecutionOptions = new ParallelSqsExecutionOptions {
                MaxDegreeOfParallelism = 2
            };
            mockMessageHandler.Setup(p => p.HandleAsync(It.IsAny <TestMessage>(), It.IsAny <ILambdaContext>()))
            .Returns(async() =>
            {
                var t = Task.Delay(1);
                cq.Enqueue(t);
                if (cq.Count > 2)
                {
                    throw new Exception("not good");
                }
                await t;
                cq.TryDequeue(out t);
            });

            var sut = CreateSystemUnderTest();

            await sut.HandleAsync(sqsEvent, new TestLambdaContext());

            mockMessageHandler.VerifyAll();
            mockMessageHandler.Verify(
                handler => handler.HandleAsync(It.IsAny <TestMessage>(), It.IsAny <ILambdaContext>()),
                Times.Exactly(sqsEvent.Records.Count));
        }