コード例 #1
0
            public async Task CreatesEndMessageWithContext(ComponentStatus changeStatus, ComponentStatus existingStatus)
            {
                var child = new TestComponent("child");

                child.Status = changeStatus;
                var root = new PrimarySecondaryComponent("hi", "", new[] { child });

                var affectedComponent = root.GetByNames <IComponent>(root.Name, child.Name);
                var change            = new MessageChangeEvent(
                    DefaultTimestamp + TimeSpan.FromDays(1),
                    affectedComponent.Path,
                    changeStatus,
                    MessageType.End);

                var context = new ExistingStartMessageContext(
                    DefaultTimestamp,
                    root,
                    existingStatus);

                var result = await Processor.ProcessAsync(change, EventEntity, root, context);

                Assert.Null(result);

                Factory
                .Verify(
                    x => x.CreateMessageAsync(
                        EventEntity,
                        change.Timestamp,
                        MessageType.End,
                        context.AffectedComponent,
                        context.AffectedComponentStatus),
                    Times.Once());
            }
コード例 #2
0
            public async Task IgnoresStartMessageWhereComponentDoesntAffectStatus()
            {
                var hiddenChild = new TestComponent("child");
                var root        = new TestComponent("hi", new[] { hiddenChild }, false);

                var change = new MessageChangeEvent(
                    DefaultTimestamp,
                    root.GetByNames <IComponent>(root.Name, hiddenChild.Name).Path,
                    ComponentStatus.Degraded,
                    MessageType.Start);

                var context = new ExistingStartMessageContext(
                    DefaultTimestamp,
                    new TestComponent("name"),
                    ComponentStatus.Down);

                var result = await Processor.ProcessAsync(change, EventEntity, root, context);

                Assert.Equal(context, result);

                Factory
                .Verify(
                    x => x.CreateMessageAsync(
                        It.IsAny <EventEntity>(),
                        It.IsAny <DateTime>(),
                        It.IsAny <MessageType>(),
                        It.IsAny <IComponent>()),
                    Times.Never());
            }
コード例 #3
0
            public async Task UpdatesExistingStartMessageFromContext(ComponentStatus changeStatus, ComponentStatus existingStatus)
            {
                var changedChild  = new TestComponent("child");
                var existingChild = new TestComponent("existing");
                var root          = new TreeComponent("hi", "", new[] { changedChild, existingChild });

                var affectedComponent = root.GetByNames <IComponent>(root.Name, changedChild.Name);
                var change            = new MessageChangeEvent(
                    DefaultTimestamp,
                    affectedComponent.Path,
                    changeStatus,
                    MessageType.Start);

                var existingAffectedComponent = root.GetByNames <IComponent>(root.Name, existingChild.Name);
                var context = new ExistingStartMessageContext(
                    new DateTime(2018, 10, 9),
                    existingAffectedComponent,
                    existingStatus);

                var result = await Processor.ProcessAsync(change, EventEntity, root, context);

                Assert.Equal(context.Timestamp, result.Timestamp);
                Assert.Equal(root, result.AffectedComponent);
                Assert.Equal(root.Status, result.AffectedComponentStatus);

                Factory
                .Verify(
                    x => x.UpdateMessageAsync(
                        EventEntity,
                        context.Timestamp,
                        MessageType.Start,
                        root),
                    Times.Once());
            }
コード例 #4
0
            public async Task ThrowsWhenUpdatingStartMessageFromContextIfLeastCommonAncestorUnaffected(ComponentStatus changeStatus, ComponentStatus existingStatus)
            {
                var changedChild  = new TestComponent("child");
                var existingChild = new TestComponent("existing");
                var root          = new AlwaysSameValueTestComponent(
                    ComponentStatus.Up,
                    "hi",
                    "",
                    new[] { changedChild, existingChild });

                var affectedComponent = root.GetByNames <IComponent>(root.Name, changedChild.Name);
                var change            = new MessageChangeEvent(
                    DefaultTimestamp,
                    affectedComponent.Path,
                    changeStatus,
                    MessageType.Start);

                var existingAffectedComponent = root.GetByNames <IComponent>(root.Name, existingChild.Name);
                var context = new ExistingStartMessageContext(
                    new DateTime(2018, 10, 9),
                    existingAffectedComponent,
                    existingStatus);

                await Assert.ThrowsAsync <ArgumentException>(() => Processor.ProcessAsync(change, EventEntity, root, context));

                Factory
                .Verify(
                    x => x.UpdateMessageAsync(
                        It.IsAny <EventEntity>(),
                        It.IsAny <DateTime>(),
                        It.IsAny <MessageType>(),
                        It.IsAny <IComponent>()),
                    Times.Never());
            }
コード例 #5
0
            public async Task IteratesChangesInOrder()
            {
                var eventEntity = new EventEntity();

                var root = new TestComponent("hi");

                Factory
                .Setup(x => x.Create())
                .Returns(root);

                var firstChange  = CreateChangeEvent(TimeSpan.Zero);
                var secondChange = CreateChangeEvent(TimeSpan.FromDays(1));
                var thirdChange  = CreateChangeEvent(TimeSpan.FromDays(2));
                var changes      = new[] { thirdChange, firstChange, secondChange };

                var firstComponent = new TestComponent("first");
                var firstContext   = new ExistingStartMessageContext(firstChange.Timestamp, firstComponent, ComponentStatus.Degraded);

                Processor
                .Setup(x => x.ProcessAsync(firstChange, eventEntity, root, null))
                .ReturnsAsync(firstContext)
                .Verifiable();

                var secondComponent = new TestComponent("second");
                var secondContext   = new ExistingStartMessageContext(secondChange.Timestamp, secondComponent, ComponentStatus.Degraded);

                Processor
                .Setup(x => x.ProcessAsync(secondChange, eventEntity, root, firstContext))
                .ReturnsAsync(secondContext)
                .Verifiable();

                var thirdComponent = new TestComponent("third");
                var thirdContext   = new ExistingStartMessageContext(thirdChange.Timestamp, thirdComponent, ComponentStatus.Degraded);

                Processor
                .Setup(x => x.ProcessAsync(thirdChange, eventEntity, root, secondContext))
                .ReturnsAsync(thirdContext)
                .Verifiable();

                await Iterator.IterateAsync(changes, eventEntity);

                Processor.Verify();

                Processor
                .Verify(
                    x => x.ProcessAsync(
                        It.IsAny <MessageChangeEvent>(),
                        It.IsAny <EventEntity>(),
                        It.IsAny <IComponent>(),
                        It.IsAny <ExistingStartMessageContext>()),
                    Times.Exactly(3));
            }
コード例 #6
0
            public async Task ThrowsWithUnexpectedType()
            {
                var root = new TestComponent("root");

                var change = new MessageChangeEvent(
                    DefaultTimestamp,
                    root.Path,
                    ComponentStatus.Degraded,
                    MessageType.Manual);

                var context = new ExistingStartMessageContext(
                    DefaultTimestamp,
                    new TestComponent("name"),
                    ComponentStatus.Down);

                await Assert.ThrowsAsync <ArgumentException>(() => Processor.ProcessAsync(change, EventEntity, root, context));
            }
コード例 #7
0
            public async Task ThrowsIfUnexpectedPath(MessageType type)
            {
                var change = new MessageChangeEvent(
                    DefaultTimestamp,
                    "missingPath",
                    ComponentStatus.Degraded,
                    type);

                var root = new TestComponent("hi");

                var context = new ExistingStartMessageContext(
                    DefaultTimestamp,
                    new TestComponent("name"),
                    ComponentStatus.Down);

                await Assert.ThrowsAsync <ArgumentException>(() => Processor.ProcessAsync(change, EventEntity, root, context));
            }
コード例 #8
0
            public async Task ReturnsExistingIfUnexpectedPath(MessageType type)
            {
                // Arrange
                var change = new MessageChangeEvent(
                    DefaultTimestamp,
                    "missingPath",
                    ComponentStatus.Degraded,
                    type);

                var root = new TestComponent("hi");

                var context = new ExistingStartMessageContext(
                    DefaultTimestamp,
                    new TestComponent("name"),
                    ComponentStatus.Down);

                // Act
                var result = await Processor.ProcessAsync(change, EventEntity, root, context);

                // Assert
                Assert.Equal(context, result);
            }
コード例 #9
0
            public async Task IgnoresEndMessageWithContextIfStillAffected(ComponentStatus changeStatus, ComponentStatus existingStatus)
            {
                var child = new TestComponent("child");

                child.Status = changeStatus;
                var root = new AlwaysSameValueTestComponent(
                    ComponentStatus.Degraded,
                    "hi",
                    "",
                    new[] { child },
                    false);

                var affectedComponent = root.GetByNames <IComponent>(root.Name, child.Name);
                var change            = new MessageChangeEvent(
                    DefaultTimestamp + TimeSpan.FromDays(1),
                    affectedComponent.Path,
                    changeStatus,
                    MessageType.End);

                var context = new ExistingStartMessageContext(
                    DefaultTimestamp,
                    root,
                    existingStatus);

                var result = await Processor.ProcessAsync(change, EventEntity, root, context);

                Assert.Equal(context, result);

                Factory
                .Verify(
                    x => x.CreateMessageAsync(
                        It.IsAny <EventEntity>(),
                        It.IsAny <DateTime>(),
                        It.IsAny <MessageType>(),
                        It.IsAny <IComponent>()),
                    Times.Never());
            }