public async Task Test_StatsAreUpdatedCorrectly_AfterEnqueue_RepostExistingTask()
        {
            Faker faker =
                new Faker();

            DateTimeOffset postedAt = mDataSource.LastPostedAt
                                      .AddTicks(1);

            PostgreSqlTaskQueueProducer taskQueueProducer =
                CreateTaskQueueProducer(() => postedAt);

            PostgreSqlTaskQueueInfo taskQueueInfo =
                CreateTaskQueueInfo(() => postedAt);

            foreach (IQueuedTaskToken token in mDataSource.CanBeRepostedSeededTaskTokens)
            {
                using (TaskQueueMetricsDiffChecker diff = new TaskQueueMetricsDiffChecker(async()
                                                                                          => await taskQueueInfo.ComputeMetricsAsync()))
                {
                    QueuedTaskStatus prevStatus = token
                                                  .LastQueuedTaskResult
                                                  .Status;

                    await diff.CaptureInitialMetricsAsync();

                    QueuedTaskInfo repostTaskInfo = new QueuedTaskInfo()
                    {
                        Id            = token.DequeuedTask.Id,
                        Priority      = faker.Random.Int(1, 100),
                        Payload       = token.DequeuedTask.Payload,
                        Source        = nameof(Test_StatsAreUpdatedCorrectly_AfterEnqueue_RepostExistingTask),
                        Type          = token.DequeuedTask.Type,
                        LockedUntilTs = postedAt.AddMinutes(faker.Random.Long(1000, 10000))
                    };

                    //Remove task record from DB - only dequeued tasks get reposted
                    await mDataSource.RemoveQueuedTaskFromDbByIdAsync(token
                                                                      .DequeuedTask
                                                                      .Id);

                    await taskQueueProducer.EnqueueAsync(repostTaskInfo);

                    await diff.CaptureNewMetricsAndAssertCorrectDiff(delta : new TaskQueueMetrics(
                                                                         totalUnprocessed: prevStatus != QueuedTaskStatus.Unprocessed ? 1 : 0,
                                                                         totalProcessing: prevStatus == QueuedTaskStatus.Processing ? -1 : 0,
                                                                         totalErrored: prevStatus == QueuedTaskStatus.Error ? -1 : 0,
                                                                         totalFaulted: prevStatus == QueuedTaskStatus.Faulted ? -1 : 0,
                                                                         totalFataled: prevStatus == QueuedTaskStatus.Fatal ? -1 : 0,
                                                                         totalProcessed: prevStatus == QueuedTaskStatus.Processed ? -1 : 0));
                }
            }
        }
Пример #2
0
        public async Task Test_CanEnqueue_RepostExistingTask_Serial()
        {
            Faker faker =
                new Faker();

            DateTimeOffset postedAt = mDataSource.LastPostedAt
                                      .AddSeconds(1);

            PostgreSqlTaskQueueProducer taskQueueProducer =
                CreateTaskQueueProducer(() => postedAt);

            foreach (IQueuedTaskToken token in mDataSource.CanBeRepostedSeededTaskTokens)
            {
                QueuedTaskInfo repostTaskInfo = new QueuedTaskInfo()
                {
                    Id            = token.DequeuedTask.Id,
                    Priority      = faker.Random.Int(1, 100),
                    Payload       = token.DequeuedTask.Payload,
                    Source        = nameof(Test_CanEnqueue_RepostExistingTask_Serial),
                    Type          = token.DequeuedTask.Type,
                    LockedUntilTs = postedAt.AddMilliseconds(faker.Random.Long(1000, 10000))
                };

                //Remove task record from DB - only dequeued tasks get reposted
                await mDataSource.RemoveQueuedTaskFromDbByIdAsync(token
                                                                  .DequeuedTask
                                                                  .Id);

                //Enqueue task and check result
                IQueuedTask requeuedTask = await taskQueueProducer
                                           .EnqueueAsync(repostTaskInfo);

                Assert.NotNull(requeuedTask);
                await Assert_ResultAddedOrUpdatedCorrectly(requeuedTask);
            }
        }