public void AHandShakeErrorAfterADelayWillAttemptHandShakeAgainThreeTimes()
        {
            StubHelpers(HelperFlags.Address);
            IServiceHostHelper serviceHostHelper = StubServiceHostHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            IPAddress ipAddress = IPAddress.Parse("55.55.55.55");

            var args = new NodeAnnoucementEventArgs
                           {
                               Address = ipAddress
                           };

            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.AddNodeToConnections(ipAddress)).Return(NodeConnectionStatus.ErrorInHandShake).Repeat.Times(4);
            nodeConnections.Expect(v => v.FindNodeIdByAddress(ipAddress)).IgnoreArguments().Repeat.Never();

            var messageWriter = Mocks.DynamicMock<IMessageWriter>();

            messageWriter.Expect(v => v.Message("An error in handshake with node at {0}.", ipAddress)).Repeat.Times(4);

            var timeHelper = Mocks.DynamicMock<ITimeHelper>();

            timeHelper.Expect(v => v.Sleep(250)).Repeat.Times(3);

            TimeHelper.Helper = timeHelper;

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
            MessageWriter.Writer = messageWriter;

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            AnnouncementService = announcementService,
                                            ServiceHostHelper = serviceHostHelper
                                        };

            connectionHandler.Start();

            announcementService.Raise(v => v.OnOnlineEvent += null, this, args);

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
        }
        public void OnCreationNodeWillInformTheAddressHelperOfTheNodeId()
        {
            var addressHelper = Mocks.DynamicMock<IAddressHelper>();

            addressHelper.Expect(v => v.SetNodeId(NodeId));

            Mocks.ReplayAll();

            AddressHelper.Helper = addressHelper;

            var connectionHandler = new ConnectionsHandler(NodeId);

            Assert.That(connectionHandler.Id, Is.EqualTo(NodeId));
        }
        public void OnSuccessfullyConnectionAMessageWillBeSentToMessageWriter()
        {
            StubHelpers(HelperFlags.Address);
            IServiceHostHelper serviceHostHelper = StubServiceHostHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            IPAddress ipAddress = IPAddress.Parse("55.55.55.55");

            var args = new NodeAnnoucementEventArgs
                           {
                               Address = ipAddress
                           };

            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.AddNodeToConnections(ipAddress)).Return(NodeConnectionStatus.Connected);
            nodeConnections.Expect(v => v.FindNodeIdByAddress(ipAddress)).Return("Node2");

            var messageWriter = Mocks.DynamicMock<IMessageWriter>();

            messageWriter.Expect(v => v.Message("A node with Id '{0}' connected from address {1}", "Node2", ipAddress));

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
            MessageWriter.Writer = messageWriter;

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            AnnouncementService = announcementService,
                                            ServiceHostHelper = serviceHostHelper
                                        };

            connectionHandler.Start();

            announcementService.Raise(v => v.OnOnlineEvent += null, this, args);

            Mocks.ReplayAll();
        }
        public void OnConnectionEventTheNodeWillBeAddedToConnections()
        {
            StubHelpers(HelperFlags.Address);
            IServiceHostHelper serviceHostHelper = StubServiceHostHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            IPAddress ipAddress = IPAddress.Parse("55.55.55.55");

            var args = new NodeAnnoucementEventArgs
                           {
                               Address = ipAddress
                           };

            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.AddNodeToConnections(ipAddress)).Return(NodeConnectionStatus.Connected);

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            AnnouncementService = announcementService,
                                            ServiceHostHelper = serviceHostHelper
                                        };

            connectionHandler.Start();

            announcementService.Raise(v => v.OnOnlineEvent += null, this, args);

            Mocks.ReplayAll();
        }
        public void OnCreationNodeWillInformNodeConnectionsOfTheNodeId()
        {
            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.SetNodeId(NodeId));

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;

            var connectionHandler = new ConnectionsHandler(NodeId);

            Assert.That(connectionHandler.Id, Is.EqualTo(NodeId));
        }
        public void OnANodeDisconnectNodeWillBeWrittenToStatusWriter()
        {
            StubAddressHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            announcementService.OnOfflineEvent += null;
            LastCall.IgnoreArguments();

            announcementService.OnOnlineEvent += null;
            LastCall.IgnoreArguments();

            IPAddress ipAddress = IPAddress.Parse("55.55.55.55");

            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.FindNodeIdByAddress(ipAddress)).Return("Node2");
            nodeConnections.Expect(v => v.RemoveNodeFromConnections(ipAddress));

            var messageWriter = Mocks.DynamicMock<IMessageWriter>();

            messageWriter.Expect(v => v.Message("Node Id {0} at address {1} has disconnected.", "Node2", ipAddress));

            var args = new NodeAnnoucementEventArgs
                           {
                               Address = ipAddress
                           };

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
            MessageWriter.Writer = messageWriter;

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            AnnouncementService = announcementService
                                        };

            connectionHandler.Start();

            announcementService.Raise(v => v.OnOfflineEvent += null, this, args);

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
        }
        public void NodeStartWillAnnouceTheService()
        {
            StubHelpers(HelperFlags.Address);
            IServiceHostHelper serviceHostHelper = StubServiceHostHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            announcementService.OnOnlineEvent += null;
            LastCall.IgnoreArguments();

            announcementService.OnOfflineEvent += null;
            LastCall.IgnoreArguments();

            announcementService.Expect(v => v.Start());

            Mocks.ReplayAll();

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            ServiceHostHelper = serviceHostHelper,
                                            AnnouncementService = announcementService
                                        };

            connectionHandler.Start();
        }
        public void IfANodeIsAlreadyConnectedAMessageIsWritten()
        {
            StubHelpers(HelperFlags.Address);
            IServiceHostHelper serviceHostHelper = StubServiceHostHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            IPAddress ipAddress = IPAddress.Parse("55.55.55.55");

            var args = new NodeAnnoucementEventArgs
                           {
                               Address = ipAddress
                           };

            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.AddNodeToConnections(ipAddress)).Return(NodeConnectionStatus.AlreadyConnected);
            nodeConnections.Expect(v => v.FindNodeIdByAddress(ipAddress)).Return("Node2");

            var messageWriter = Mocks.DynamicMock<IMessageWriter>();

            messageWriter.Expect(v => v.Message("A node from address {0} is already connected with an Id of {1}.", ipAddress, "Node2"));

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
            MessageWriter.Writer = messageWriter;

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            AnnouncementService = announcementService,
                                            ServiceHostHelper = serviceHostHelper
                                        };

            connectionHandler.Start();

            announcementService.Raise(v => v.OnOnlineEvent += null, this, args);

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
        }
        public void IfANodeCannotBeConnectedToAMessageWritten()
        {
            StubHelpers(HelperFlags.Address);
            IServiceHostHelper serviceHostHelper = StubServiceHostHelper();

            var announcementService = Mocks.DynamicMock<IAnnouncementService>();

            IPAddress ipAddress = IPAddress.Parse("55.55.55.55");

            var args = new NodeAnnoucementEventArgs
                           {
                               Address = ipAddress
                           };

            var nodeConnections = Mocks.DynamicMock<INodeConnections>();

            nodeConnections.Expect(v => v.AddNodeToConnections(ipAddress)).Return(NodeConnectionStatus.CouldNotConnect);
            nodeConnections.Expect(v => v.FindNodeIdByAddress(ipAddress)).IgnoreArguments().Repeat.Never();

            var messageWriter = Mocks.DynamicMock<IMessageWriter>();

            messageWriter.Expect(v => v.Message("A node from address {0} could not be connected.", ipAddress));

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
            MessageWriter.Writer = messageWriter;

            var connectionHandler = new ConnectionsHandler(NodeId)
                                        {
                                            AnnouncementService = announcementService,
                                            ServiceHostHelper = serviceHostHelper
                                        };

            connectionHandler.Start();

            announcementService.Raise(v => v.OnOnlineEvent += null, this, args);

            Mocks.ReplayAll();

            NodeConnections.Connections = nodeConnections;
        }
        public void BaseAddressWillBeCalculatedFromTheAddressHelper()
        {
            var addressHelper = Mocks.DynamicMock<IAddressHelper>();

            addressHelper.Expect(v => v.SetNodeId(NodeId));

            Uri desiredBaseAddress = BaseAddress;

            addressHelper.Expect(v => v.FindBaseAddress()).Return(desiredBaseAddress);

            Mocks.ReplayAll();

            AddressHelper.Helper = addressHelper;

            var connectionHandler = new ConnectionsHandler(NodeId);

            Assert.That(connectionHandler.BaseAddress, Is.EqualTo(desiredBaseAddress));
        }