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); }
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()); }