Exemple #1
0
        public async Task ShouldSendTaskSuccessWithSupersededTrueIfNewerCommitExists(
            string token,
            Request request,
            [Substitute] SQSEvent sqsEvent,
            [Frozen, Substitute] IAmazonStepFunctions stepFunctionsClient,
            [Frozen, Options] IOptions <Config> options,
            [Frozen, Substitute] RequestFactory requestFactory,
            [Frozen, Substitute] S3GetObjectFacade s3GetObjectFacade,
            [Target] Handler handler
            )
        {
            request.Token           = token;
            request.CommitTimestamp = DateTime.Now - TimeSpan.FromHours(1);
            requestFactory.CreateFromSqsEvent(Any <SQSEvent>()).Returns(request);
            s3GetObjectFacade.TryGetObject <StateInfo>(null, null).ReturnsForAnyArgs(new StateInfo
            {
                LastCommitTimestamp = DateTime.Now
            });

            await handler.Handle(sqsEvent);

            var expectedOutput = Serialize(new
            {
                Superseded = true
            });

            await stepFunctionsClient.Received().SendTaskSuccessAsync(Is <SendTaskSuccessRequest>(req =>
                                                                                                  req.TaskToken == token &&
                                                                                                  req.Output == expectedOutput
                                                                                                  ));
        }
Exemple #2
0
        public async Task <Response> Handle(SQSEvent sqsEvent, CancellationToken cancellationToken = default)
        {
            var request        = requestFactory.CreateFromSqsEvent(sqsEvent);
            var bucket         = config.StateStore;
            var getObjResponse = await s3GetObjectFacade.TryGetObject <StateInfo>(bucket, $"{request.Pipeline}/state.json");

            var stateInfo = getObjResponse ?? new StateInfo
            {
                LastCommitTimestamp = DateTime.MinValue
            };

            var superseded      = request.CommitTimestamp < stateInfo.LastCommitTimestamp;
            var sendTaskRequest = new SendTaskSuccessRequest
            {
                TaskToken = request.Token,
                Output    = Serialize(new
                {
                    Superseded = superseded
                })
            };

            var sendTaskResponse = await stepFunctionsClient.SendTaskSuccessAsync(sendTaskRequest, cancellationToken);

            logger.LogInformation($"Got send task response: {Serialize(sendTaskResponse)}");

            if (!superseded)
            {
                var putObjectRequest = new PutObjectRequest
                {
                    BucketName  = bucket,
                    Key         = $"{request.Pipeline}/state.json",
                    ContentBody = Serialize(new StateInfo
                    {
                        LastCommitTimestamp = request.CommitTimestamp
                    })
                };

                var putObjectResponse = await s3Client.PutObjectAsync(putObjectRequest, cancellationToken);

                logger.LogInformation($"Got put object response: {Serialize(putObjectResponse)}");
            }

            return(new Response
            {
                Success = true
            });
        }
Exemple #3
0
        public async Task ShouldPutUpdatedStateInfoIfNewerCommitDoesntExist(
            string bucket,
            string pipeline,
            string token,
            Request request,
            [Substitute] SQSEvent sqsEvent,
            [Frozen, Substitute] IAmazonS3 s3Client,
            [Frozen, Options] IOptions <Config> options,
            [Frozen, Substitute] RequestFactory requestFactory,
            [Frozen, Substitute] S3GetObjectFacade s3GetObjectFacade,
            [Target] Handler handler
            )
        {
            options.Value.StateStore = bucket;
            request.Pipeline         = pipeline;
            request.Token            = token;
            request.CommitTimestamp  = DateTime.Now - TimeSpan.FromHours(1);

            requestFactory.CreateFromSqsEvent(Any <SQSEvent>()).Returns(request);
            s3GetObjectFacade.TryGetObject <StateInfo>(Arg.Any <string>(), Arg.Any <string>()).Returns(new StateInfo
            {
                LastCommitTimestamp = DateTime.Now - TimeSpan.FromHours(2)
            });

            await handler.Handle(sqsEvent);

            var expectedBody = Serialize(new StateInfo
            {
                LastCommitTimestamp = request.CommitTimestamp
            });

            await s3Client.Received().PutObjectAsync(Arg.Is <PutObjectRequest>(req =>
                                                                               req.BucketName == bucket &&
                                                                               req.Key == $"{pipeline}/state.json" &&
                                                                               req.ContentBody == expectedBody
                                                                               ));
        }