private void CreateTestContext(string folder)
        {
            this.parameters = new NetworkPeerConnectionParameters();

            var testFolder = TestDirectory.Create(folder);

            this.nodeSettings = new NodeSettings
            {
                DataDir = testFolder.FolderName
            };

            this.nodeSettings.DataFolder = new DataFolder(this.nodeSettings);

            this.peerAddressManager = new PeerAddressManager(this.nodeSettings.DataFolder);
            var peerAddressManagerBehaviour = new PeerAddressManagerBehaviour(new DateTimeProvider(), this.peerAddressManager)
            {
                PeersToDiscover = 10
            };

            this.parameters.TemplateBehaviors.Add(peerAddressManagerBehaviour);

            this.loggerFactory = new ExtendedLoggerFactory();
            this.loggerFactory.AddConsoleWithFilters();

            this.networkPeerFactory = new NetworkPeerFactory(new DateTimeProvider(), this.loggerFactory);
            this.nodeLifetime       = new NodeLifetime();
        }
        private void CreateTestContext(string folder)
        {
            this.loggerFactory = new ExtendedLoggerFactory();
            this.loggerFactory.AddConsoleWithFilters();

            this.parameters = new NetworkPeerConnectionParameters();

            var testFolder = TestDirectory.Create(folder);

            this.nodeSettings = new NodeSettings();
            this.nodeSettings.LoadArguments(new string[] { });
            this.nodeSettings.DataFolder = new DataFolder(this.nodeSettings);

            this.connectionSetting = new ConnectionManagerSettings();
            this.connectionSetting.Load(this.nodeSettings);

            this.peerAddressManager = new PeerAddressManager(this.nodeSettings.DataFolder, this.loggerFactory);
            var peerAddressManagerBehaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, this.peerAddressManager)
            {
                PeersToDiscover = 10
            };

            this.parameters.TemplateBehaviors.Add(peerAddressManagerBehaviour);

            this.networkPeerFactory = new NetworkPeerFactory(this.network, DateTimeProvider.Default, this.loggerFactory);
            this.nodeLifetime       = new NodeLifetime();
        }
        public void PeerAddressManagerBehaviour_ReceivedPong_UpdateLastSeen()
        {
            var ipAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var endpoint  = new IPEndPoint(ipAddress, 80);

            var peerFolder     = AssureEmptyDirAsDataFolder(Path.Combine(AppContext.BaseDirectory, "PeerAddressManagerBehaviourTests"));
            var addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.loggerFactory);

            addressManager.AddPeer(endpoint, IPAddress.Loopback);

            var networkPeer = new NetworkPeer(endpoint, this.network, new NetworkPeerConnectionParameters(), this.networkPeerFactory, DateTimeProvider.Default, this.extendedLoggerFactory);

            networkPeer.SetStateAsync(NetworkPeerState.HandShaked).GetAwaiter().GetResult();

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer);

            var message = new IncomingMessage(new PongPayload(), this.network);

            //Trigger the event handler
            networkPeer.MessageReceived.ExecuteCallbacksAsync(networkPeer, message).GetAwaiter().GetResult();

            var peer = addressManager.FindPeer(endpoint);

            Assert.Equal(DateTimeProvider.Default.GetUtcNow().Date, peer.LastSeen.Value.Date);
        }
        public void CanDiscoverAndConnectToPeersOnTheNetwork()
        {
            var parameters = new NetworkPeerConnectionParameters();

            var testFolder = TestDirectory.Create("CanDiscoverAndConnectToPeersOnTheNetwork");

            var nodeSettings = new NodeSettings
            {
                DataDir = testFolder.FolderName
            };

            nodeSettings.DataFolder = new DataFolder(nodeSettings);

            var addressManager          = new PeerAddressManager(nodeSettings.DataFolder);
            var addressManagerBehaviour = new PeerAddressManagerBehaviour(new DateTimeProvider(), addressManager)
            {
                PeersToDiscover = 3
            };

            parameters.TemplateBehaviors.Add(addressManagerBehaviour);

            var loggerFactory = new ExtendedLoggerFactory();

            loggerFactory.AddConsoleWithFilters();

            INetworkPeerFactory networkPeerFactory = new NetworkPeerFactory(DateTimeProvider.Default, loggerFactory);
            var peerDiscoveryLoop = new PeerDiscoveryLoop(
                new AsyncLoopFactory(loggerFactory),
                Network.Main,
                parameters,
                new NodeLifetime(),
                addressManager,
                networkPeerFactory);

            peerDiscoveryLoop.DiscoverPeers();

            // Wait until we have discovered 3 peers.
            TestHelper.WaitLoop(() => addressManager.Peers.Count > 3);

            // Wait until at least one successful connection
            // has been made.
            while (true)
            {
                try
                {
                    var         peerOne = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover);
                    NetworkPeer node    = networkPeerFactory.CreateConnectedNetworkPeer(Network.Main, peerOne, parameters);
                    node.VersionHandshake();
                    node.Disconnect();

                    break;
                }
                catch
                {
                }
            }
            ;
        }
        public void PeerAddressManagerBehaviour_DoesntSendAddress_Twice()
        {
            IPAddress ipAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var       endpoint  = new IPEndPoint(ipAddress, 80);

            DataFolder peerFolder     = CreateDataFolder(this);
            var        addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.LoggerFactory.Object,
                                                               new SelfEndpointTracker(this.extendedLoggerFactory, this.connectionManagerSettings));

            addressManager.AddPeer(endpoint, IPAddress.Loopback);

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(endpoint);
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);
            networkPeer.SetupGet(n => n.Inbound).Returns(true);

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager, new Mock <IPeerBanning>().Object, this.extendedLoggerFactory)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            var incomingMessage = new IncomingMessage();

            incomingMessage.Message = new Message(new PayloadProvider().DiscoverPayloads())
            {
                Magic   = this.Network.Magic,
                Payload = new GetAddrPayload(),
            };

            // Event handler triggered several times
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, incomingMessage).GetAwaiter().GetResult();
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, incomingMessage).GetAwaiter().GetResult();
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, incomingMessage).GetAwaiter().GetResult();

            // SendMessage should only be called once.
            networkPeer.Verify(x => x.SendMessageAsync(It.IsAny <Payload>(), It.IsAny <CancellationToken>()), Times.Once);
        }
        public void CanDiscoverAndConnectToPeersOnTheNetwork()
        {
            var parameters = new NodeConnectionParameters();

            var testFolder = TestDirectory.Create("CanDiscoverAndConnectToPeersOnTheNetwork");

            var nodeSettings = new NodeSettings
            {
                DataDir = testFolder.FolderName
            };

            nodeSettings.DataFolder = new DataFolder(nodeSettings);

            var addressManager          = new PeerAddressManager(nodeSettings.DataFolder);
            var addressManagerBehaviour = new PeerAddressManagerBehaviour(new DateTimeProvider(), addressManager)
            {
                PeersToDiscover = 3
            };

            parameters.TemplateBehaviors.Add(addressManagerBehaviour);

            var peerDiscoveryLoop = new PeerDiscoveryLoop(
                new AsyncLoopFactory(new LoggerFactory()),
                Network.Main,
                parameters,
                new NodeLifetime(),
                addressManager);

            peerDiscoveryLoop.DiscoverPeers();

            //Wait until we have discovered 3 peers
            while (addressManager.Peers.Count < 3)
            {
                Task.Delay(TimeSpans.Second).GetAwaiter().GetResult();
            }

            var  peerOne = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover);
            Node node    = Node.Connect(Network.Main, peerOne, parameters);

            node.VersionHandshake();
            node.Disconnect();

            var  peerTwo = addressManager.SelectPeerToConnectTo(PeerIntroductionType.Discover);
            Node node2   = Node.Connect(Network.Main, peerTwo, parameters);

            node.Disconnect();
        }
        public void PeerAddressManagerBehaviour_ReceivedPong_UpdateLastSeen()
        {
            IPAddress ipAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var       endpoint  = new IPEndPoint(ipAddress, 80);

            DataFolder peerFolder     = CreateDataFolder(this);
            var        addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.LoggerFactory.Object,
                                                               new SelfEndpointTracker(this.extendedLoggerFactory, this.connectionManagerSettings));

            addressManager.AddPeer(endpoint, IPAddress.Loopback);

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(endpoint);
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager, new Mock <IPeerBanning>().Object, this.extendedLoggerFactory)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            var incomingMessage = new IncomingMessage();

            incomingMessage.Message = new Message(new PayloadProvider().DiscoverPayloads())
            {
                Magic   = this.Network.Magic,
                Payload = new PingPayload(),
            };

            //Trigger the event handler
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, incomingMessage).GetAwaiter().GetResult();

            PeerAddress peer = addressManager.FindPeer(endpoint);

            Assert.Equal(DateTimeProvider.Default.GetUtcNow().Date, peer.LastSeen.Value.Date);
        }
        public void PeerAddressManagerBehaviour_InboundConnectionIsNotLoopBack_Add_AddressFrom_ToAddressBook()
        {
            IPAddress addressFromIPAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var       addressFromEndpoint  = new IPEndPoint(addressFromIPAddress, this.Network.DefaultPort);

            IPAddress peerEndPointAddress = IPAddress.Parse("::ffff:192.168.0.2");
            var       peerEndPoint        = new IPEndPoint(peerEndPointAddress, 80);

            DataFolder peerFolder     = CreateDataFolder(this);
            var        addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.LoggerFactory.Object,
                                                               new SelfEndpointTracker(this.extendedLoggerFactory, this.connectionManagerSettings));

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.Inbound).Returns(true);
            networkPeer.SetupGet(n => n.Network).Returns(this.Network);
            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(peerEndPoint);
            networkPeer.SetupGet(n => n.PeerVersion).Returns(new VersionPayload()
            {
                AddressFrom = addressFromEndpoint
            });
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager, new Mock <IPeerBanning>().Object, this.extendedLoggerFactory)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            // Trigger the event handler that signals that the peer has handshaked.
            networkPeer.Object.StateChanged.ExecuteCallbacksAsync(networkPeer.Object, NetworkPeerState.HandShaked).GetAwaiter().GetResult();

            // The address manager should contain the inbound peer's address.
            var endpointToFind = new IPEndPoint(addressFromEndpoint.Address, this.Network.DefaultPort);

            Assert.NotNull(addressManager.FindPeer(endpointToFind));
        }
Пример #9
0
        public void PeerAddressManagerBehaviour_ReceivedPong_UpdateLastSeen()
        {
            var ipAddress = IPAddress.Parse("::ffff:192.168.0.1");
            var endpoint  = new IPEndPoint(ipAddress, 80);

            var peerFolder     = AssureEmptyDirAsDataFolder(Path.Combine(AppContext.BaseDirectory, "PeerAddressManagerBehaviourTests"));
            var addressManager = new PeerAddressManager(DateTimeProvider.Default, peerFolder, this.loggerFactory);

            addressManager.AddPeer(endpoint, IPAddress.Loopback);

            var networkPeer = new Mock <INetworkPeer>();

            networkPeer.SetupGet(n => n.PeerEndPoint).Returns(endpoint);
            networkPeer.SetupGet(n => n.State).Returns(NetworkPeerState.HandShaked);

            var messageReceived = new AsyncExecutionEvent <INetworkPeer, IncomingMessage>();

            networkPeer.SetupGet(n => n.MessageReceived).Returns(messageReceived);

            var stateChanged = new AsyncExecutionEvent <INetworkPeer, NetworkPeerState>();

            networkPeer.SetupGet(n => n.StateChanged).Returns(stateChanged);

            var behaviour = new PeerAddressManagerBehaviour(DateTimeProvider.Default, addressManager)
            {
                Mode = PeerAddressManagerBehaviourMode.AdvertiseDiscover
            };

            behaviour.Attach(networkPeer.Object);

            var incomingMessage = new IncomingMessage();

            incomingMessage.Message = new Message(new PayloadProvider().DiscoverPayloads())
            {
                Magic   = this.network.Magic,
                Payload = new PingPayload(),
            };

            //Trigger the event handler
            networkPeer.Object.MessageReceived.ExecuteCallbacksAsync(networkPeer.Object, incomingMessage).GetAwaiter().GetResult();

            var peer = addressManager.FindPeer(endpoint);

            Assert.Equal(DateTimeProvider.Default.GetUtcNow().Date, peer.LastSeen.Value.Date);
        }
Пример #10
0
        /// <summary>
        /// Initializes node's address manager. Loads previously known peers from the file
        /// or creates new peer file if it does not exist. Creates periodic task to persist changes
        /// in peers to disk.
        /// </summary>
        private void StartAddressManager(NetworkPeerConnectionParameters connectionParameters)
        {
            var addressManagerBehaviour = new PeerAddressManagerBehaviour(this.dateTimeProvider, this.peerAddressManager, this.loggerFactory);

            connectionParameters.TemplateBehaviors.Add(addressManagerBehaviour);

            if (File.Exists(Path.Combine(this.dataFolder.AddressManagerFilePath, PeerAddressManager.PeerFileName)))
            {
                this.logger.LogInformation($"Loading peers from : {this.dataFolder.AddressManagerFilePath}.");
                this.peerAddressManager.LoadPeers();
            }

            this.flushAddressManagerLoop = this.asyncLoopFactory.Run("Periodic peer flush", token =>
            {
                this.peerAddressManager.SavePeers();
                return(Task.CompletedTask);
            },
                                                                     this.nodeLifetime.ApplicationStopping,
                                                                     repeatEvery: TimeSpan.FromMinutes(5.0),
                                                                     startAfter: TimeSpan.FromMinutes(5.0));
        }