public async Task PreConditionsFilterCorrectly(bool preconditionResult, bool errorMessageShouldBeEmpty)
        {
            var          taskRunnerLogger = new Mock <ITaskRunnerLogger>();
            const string taskName         = "TaskName";

            var taskDefinition = new TaskDefinition <Guid>
            {
                Id   = Guid.NewGuid(),
                Name = taskName
            };

            var preconditions = ImmutableList <TaskPrecondition <Guid> > .Empty.Add(new DummyPrecondition <Guid>
            {
                PassesAsync  = async(a) => await Task.Run(() => preconditionResult),
                DisplayLabel = "Blah",
                TaskName     = taskName,
            });

            var preconditionEvaluator = new PreconditionEvaluator <Guid>(taskRunnerLogger.Object);
            var result = await preconditionEvaluator.GetFailingPrecondition(taskDefinition, preconditions);

            var errorMessageIsEmpty = string.IsNullOrEmpty(result);

            Assert.Equal(errorMessageShouldBeEmpty, errorMessageIsEmpty);
        }
        private async Task <SessionRunResult <TIdentifier> > RunDueTasks(ImmutableList <ITaskDefinition <TIdentifier> > candidateTasks, ImmutableList <ISchedule <TIdentifier> > schedules, Guid runId)
        {
            using (runner)
            {
                using (var preconditionEvaluator = new PreconditionEvaluator <TIdentifier>(taskRunnerLogger))
                {
                    var taskDefinitionStates = await taskDefinitionStateReader.GetByTaskDefinitionIds(candidateTasks.Select(a => a.Id).ToImmutableList());

                    var sessionRunResult = new SessionRunResult <TIdentifier>();
                    var preconditions    = await preconditionReader.GetByTaskNameAsync(candidateTasks.Select(a => a.Name).ToImmutableList());

                    var inBuiltPreconditions = inbuiltTaskPreconditionsProvider.GetInBuiltPreconditions(candidateTasks, taskDefinitionStates);
                    preconditions = preconditions.AddRange(inBuiltPreconditions);
                    preconditions = preconditions.GroupBy(a => new { t = a.GetType(), n = a.TaskName })
                                    .Select(a => a.First())
                                    .ToImmutableList();
                    foreach (var singleTaskDefinition in candidateTasks)
                    {
                        var startTime = DateTime.Now;
                        await RunSingleTask(singleTaskDefinition, preconditionEvaluator, schedules, preconditions, sessionRunResult, startTime, runId);
                    }

                    await historyWriter.WriteAsync(sessionRunResult.Histories);

                    await scheduleWriter.WriteAsync(sessionRunResult.Schedules);

                    return(sessionRunResult);
                }
            }
        }
Exemple #3
0
 internal BodyModuleBase Precondition(PreconditionEvaluator evaluator)
 {
     _currentPrecondition = evaluator;
     return(this);
 }
        private async Task RunSingleTask(ITaskDefinition <TIdentifier> singleTaskDefinition, PreconditionEvaluator <TIdentifier> preconditionEvaluator, ImmutableList <ISchedule <TIdentifier> > schedules, ImmutableList <TaskPrecondition <TIdentifier> > preconditions, SessionRunResult <TIdentifier> sessionRunResult, DateTime startTime, Guid runId)
        {
            var taskSchedule = schedules.Single(candidateSchedule => EqualityComparer <TIdentifier> .Default.Equals(candidateSchedule.TaskDefinitionId, singleTaskDefinition.Id));
            var history      = historyReader.GetNew();

            history.StartTime        = startTime;
            history.TaskDefinitionId = singleTaskDefinition.Id;
            history.RunId            = runId;
            var runResult = default(SingleTaskRunResult);

            var failingPrecondition = await preconditionEvaluator.GetFailingPrecondition(singleTaskDefinition, preconditions);

            var allPreconditionsPassed = string.IsNullOrEmpty(failingPrecondition);

            if (allPreconditionsPassed)
            {
                try
                {
                    runResult = await runner.RunAsync(singleTaskDefinition);
                }
                catch (Exception e)
                {
                    await faultHandler.HandleAsync(singleTaskDefinition, e);

                    runResult = new SingleTaskRunResult
                    {
                        Succeeded = false,
                        Remarks   = e.Message,
                    };
                }
                finally
                {
                    if (taskSchedule.IsOnDemand)
                    {
                        onDemandQueueManager.DeQueue(taskSchedule.TaskDefinitionId);
                    }
                }
                history.Remarks = runResult.Remarks;
                history.Status  = runResult.Succeeded ? RunHistoryStatuses.CompletedSuccessfully : RunHistoryStatuses.Failed;
            }
            else
            {
                history.Remarks = $"Precondition '{failingPrecondition}' failed";
                history.Status  = RunHistoryStatuses.PreconditionPreventedRun;
            }
            history.EndTime = taskSchedule.LastRun = DateTime.Now;

            sessionRunResult.Histories = sessionRunResult.Histories.Add(history);
            sessionRunResult.Schedules = sessionRunResult.Schedules.Add(taskSchedule);
        }