public async Task CanMarkAsRegressedAsync()
    {
        var stack = await _repository.AddAsync(StackData.GenerateStack(projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, dateFixed: SystemClock.UtcNow.SubtractMonths(1)), o => o.ImmediateConsistency());

        Assert.NotNull(stack);
        Assert.False(stack.Status == Core.Models.StackStatus.Regressed);
        Assert.NotNull(stack.DateFixed);

        await _repository.MarkAsRegressedAsync(stack.Id);

        stack = await _repository.GetByIdAsync(stack.Id);

        Assert.NotNull(stack);
        Assert.True(stack.Status == Core.Models.StackStatus.Regressed);
        Assert.NotNull(stack.DateFixed);
    }
        public async Task CanMarkAsRegressedAsync()
        {
            await _repository.AddAsync(StackData.GenerateStack(id: TestConstants.StackId, projectId: TestConstants.ProjectId, organizationId: TestConstants.OrganizationId, dateFixed: SystemClock.UtcNow.SubtractMonths(1)));

            var stack = await _repository.GetByIdAsync(TestConstants.StackId);

            Assert.NotNull(stack);
            Assert.False(stack.IsRegressed);
            Assert.NotNull(stack.DateFixed);

            await RefreshDataAsync();

            await _repository.MarkAsRegressedAsync(TestConstants.StackId);

            stack = await _repository.GetByIdAsync(TestConstants.StackId);

            Assert.NotNull(stack);
            Assert.True(stack.IsRegressed);
            Assert.NotNull(stack.DateFixed);
        }
示例#3
0
        public override async Task ProcessBatchAsync(ICollection <EventContext> contexts)
        {
            var stacks = contexts.Where(c => c.Stack?.DateFixed != null && c.Stack.DateFixed.Value < c.Event.Date.UtcDateTime).GroupBy(c => c.Event.StackId);

            foreach (var stackGroup in stacks)
            {
                try {
                    var context = stackGroup.First();
                    Logger.Trace().Message("Marking stack and events as regression.").Write();
                    await _stackRepository.MarkAsRegressedAsync(context.Stack.Id).AnyContext();

                    await _workItemQueue.EnqueueAsync(new StackWorkItem { OrganizationId = context.Event.OrganizationId, StackId = context.Stack.Id, UpdateIsFixed = true, IsFixed = false }).AnyContext();

                    await _stackRepository.InvalidateCacheAsync(context.Event.ProjectId, context.Event.StackId, context.SignatureHash).AnyContext();

                    bool isFirstEvent = true;
                    foreach (var ctx in stackGroup)
                    {
                        ctx.Event.IsFixed = false;

                        // Only mark the first event context as regressed.
                        ctx.IsRegression = isFirstEvent;
                        isFirstEvent     = false;
                    }
                } catch (Exception ex) {
                    foreach (var context in stackGroup)
                    {
                        bool cont = false;
                        try {
                            cont = HandleError(ex, context);
                        } catch {}

                        if (!cont)
                        {
                            context.SetError(ex.Message, ex);
                        }
                    }
                }
            }
        }
        public override async Task ProcessBatchAsync(ICollection <EventContext> contexts)
        {
            var stacks = contexts.Where(c => !c.Stack.IsRegressed && c.Stack.DateFixed.HasValue).OrderBy(c => c.Event.Date).GroupBy(c => c.Event.StackId);

            foreach (var stackGroup in stacks)
            {
                try {
                    var stack = stackGroup.First().Stack;

                    EventContext    regressedContext = null;
                    SemanticVersion regressedVersion = null;
                    if (String.IsNullOrEmpty(stack.FixedInVersion))
                    {
                        regressedContext = stackGroup.FirstOrDefault(c => stack.DateFixed < c.Event.Date.UtcDateTime);
                    }
                    else
                    {
                        var fixedInVersion = await _semanticVersionParser.ParseAsync(stack.FixedInVersion).AnyContext();

                        var versions = stackGroup.GroupBy(c => c.Event.GetVersion());
                        foreach (var versionGroup in versions)
                        {
                            var version = await _semanticVersionParser.ParseAsync(versionGroup.Key).AnyContext() ?? _semanticVersionParser.Default;

                            if (version < fixedInVersion)
                            {
                                continue;
                            }

                            regressedVersion = version;
                            regressedContext = versionGroup.First();
                            break;
                        }
                    }

                    if (regressedContext == null)
                    {
                        return;
                    }

                    _logger.LogTrace("Marking stack and events as regressed in version: {Version}", regressedVersion);
                    stack.IsRegressed = true;
                    await _stackRepository.MarkAsRegressedAsync(stack.Id).AnyContext();

                    await _workItemQueue.EnqueueAsync(new StackWorkItem {
                        OrganizationId = stack.OrganizationId,
                        ProjectId      = stack.ProjectId,
                        StackId        = stack.Id,
                        UpdateIsFixed  = true,
                        IsFixed        = false
                    }).AnyContext();

                    foreach (var ctx in stackGroup)
                    {
                        ctx.Event.IsFixed = false;
                        ctx.IsRegression  = ctx == regressedContext;
                    }
                } catch (Exception ex) {
                    foreach (var context in stackGroup)
                    {
                        bool cont = false;
                        try {
                            cont = HandleError(ex, context);
                        } catch {}

                        if (!cont)
                        {
                            context.SetError(ex.Message, ex);
                        }
                    }
                }
            }
        }