public void PeerSelector_CanResetAttempts()
        {
            var peerAddress = new PeerAddress()
            {
                Endpoint = new IPEndPoint(new IPAddress(2), 345)
            };

            var bannedPeerAddress = new PeerAddress()
            {
                Endpoint = new IPEndPoint(new IPAddress(3), 346)
            };

            bannedPeerAddress.BanUntil = DateTime.UtcNow.AddHours(1);

            var peerAddresses = new ConcurrentDictionary <IPEndPoint, PeerAddress>();

            peerAddresses.AddOrUpdate(peerAddress.Endpoint, peerAddress, (x, y) => peerAddress);
            peerAddresses.AddOrUpdate(bannedPeerAddress.Endpoint, bannedPeerAddress, (x, y) => bannedPeerAddress);

            var peerSelector = new PeerSelector(new DateTimeProvider(), this.LoggerFactory.Object, peerAddresses, new SelfEndpointTracker());

            for (int i = 0; i < 5; i++)
            {
                peerAddress.SetAttempted(DateTime.UtcNow);
            }

            Assert.Equal(5, peerAddress.ConnectionAttempts);
            Assert.True(peerSelector.HasAllPeersReachedConnectionThreshold());

            peerSelector.ResetConnectionAttemptsOnNotBannedPeers();

            Assert.Equal(0, peerAddress.ConnectionAttempts);
        }
示例#2
0
        public void SelectPeersForDiscovery_WhenPeerAddressesContainsOwnIPEndoint_DoesNotReturnOwnEndpoint()
        {
            var selfIpEndPoint = new IPEndPoint(new IPAddress(1), 123);
            var selfPeerAddress = new PeerAddress() {Endpoint = selfIpEndPoint};
            selfPeerAddress.SetDiscoveredFrom(DateTime.MinValue);

            var otherIpEndPoint = new IPEndPoint(new IPAddress(2), 345);
            var otherPeerAddress = new PeerAddress() {Endpoint = otherIpEndPoint};
            otherPeerAddress.SetDiscoveredFrom(DateTime.MinValue);

            var peerAddresses = new ConcurrentDictionary<IPEndPoint, PeerAddress>();
            peerAddresses.AddOrUpdate(selfIpEndPoint, selfPeerAddress, (x, y) => selfPeerAddress);
            peerAddresses.AddOrUpdate(otherIpEndPoint, otherPeerAddress, (x, y) => otherPeerAddress);

            var selfEndpointTracker = new SelfEndpointTracker();
            selfEndpointTracker.Add(selfIpEndPoint);

            var peerSelector = new PeerSelector(new DateTimeProvider(), this.loggerFactory, peerAddresses, selfEndpointTracker);

            IEnumerable<PeerAddress> peers = peerSelector.SelectPeersForDiscovery(2);

            Assert.Equal(otherPeerAddress, peers.Single());

            // Note: This for loop is because Random is currently a hard dependency rather than using dependency inversion.
            // It is not 100% safe without mocking random, so a workaround of 20 attempts used for now.
            for (int i = 0; i < 20; i++)
            {
                Assert.Equal(otherPeerAddress, peerSelector.SelectPeer());
            }
        }
        public void PeerSelector_HasAllPeersReachedConnectionThreshold()
        {
            var peerAddress = new PeerAddress()
            {
                Endpoint = new IPEndPoint(new IPAddress(2), 345)
            };

            var peerAddresses = new ConcurrentDictionary <IPEndPoint, PeerAddress>();

            peerAddresses.AddOrUpdate(peerAddress.Endpoint, peerAddress, (x, y) => peerAddress);

            var peerSelector = new PeerSelector(new DateTimeProvider(), this.LoggerFactory.Object, peerAddresses, new SelfEndpointTracker());

            Assert.False(peerSelector.HasAllPeersReachedConnectionThreshold());

            for (int i = 0; i < 5; i++)
            {
                peerAddress.SetAttempted(DateTime.UtcNow);
            }

            Assert.True(peerSelector.HasAllPeersReachedConnectionThreshold());
        }