public async Task Can_borrow_many()
        {
            var peer  = new SimpleSyncPeerMock(TestItem.PublicKeyA);
            var peer2 = new SimpleSyncPeerMock(TestItem.PublicKeyB);

            _pool.Start();
            _pool.AddPeer(peer);
            _pool.AddPeer(peer2);
            await Task.Delay(200);

            var allocation1 = _pool.Borrow();
            var allocation2 = _pool.Borrow();

            Assert.AreNotSame(allocation1.Current, allocation2.Current, "first");
            Assert.NotNull(allocation1.Current, "first A");
            Assert.NotNull(allocation2.Current, "first B");

            _pool.Free(allocation1);
            _pool.Free(allocation2);
            Assert.Null(allocation1.Current, "null A");
            Assert.Null(allocation2.Current, "null B");

            allocation1 = _pool.Borrow();
            allocation2 = _pool.Borrow();
            Assert.AreNotSame(allocation1.Current, allocation2.Current);
            Assert.NotNull(allocation1.Current, "second A");
            Assert.NotNull(allocation2.Current, "second B");
        }
        public void Report_no_sync_progress_on_null_does_not_crash()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            _pool.Start();
            _pool.AddPeer(peer);

            _pool.ReportNoSyncProgress(null);
        }
        public void Can_return()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            _pool.Start();
            _pool.AddPeer(peer);
            var allocation = _pool.Borrow();

            _pool.Free(allocation);
        }
        public void Does_not_fail_when_receiving_a_new_block_and_allocation_has_no_peer()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            _pool.Start();
            _pool.AddPeer(peer);
            var allocation = _pool.Borrow();

            allocation.Cancel();

            _blockTree.NewHeadBlock += Raise.EventWith(new object(), new BlockEventArgs(Build.A.Block.WithTotalDifficulty(1).TestObject));
        }
        public async Task Can_borrow_peer()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            _pool.Start();
            _pool.AddPeer(peer);
            await Task.Delay(200);

            var allocation = _pool.Borrow();

            Assert.AreSame(peer, allocation.Current?.SyncPeer);
        }
        public async Task Will_remove_peer_if_times_out_on_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderResponseTime(int.MaxValue);
            _pool.Start();
            _pool.AddPeer(peer);

            await WaitFor(() => peer.DisconnectRequested);

            Assert.True(peer.DisconnectRequested);
        }
        public async Task Can_remove_borrowed_peer()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            _pool.Start();
            _pool.AddPeer(peer);
            await Task.Delay(200);

            var allocation = _pool.Borrow();

            _pool.RemovePeer(peer);

            Assert.Null(allocation.Current);
        }
        public async Task Will_not_allocate_same_peer_to_two_allocations()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            _pool.Start();
            _pool.AddPeer(peer);
            await Task.Delay(200);

            var allocation1 = _pool.Borrow();
            var allocation2 = _pool.Borrow();

            Assert.AreSame(peer, allocation1.Current?.SyncPeer);
            Assert.Null(allocation2.Current);
        }
        public async Task Can_remove_during_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderResponseTime(500);
            _pool.Start();
            _pool.AddPeer(peer);

            var allocation = await _pool.BorrowAsync(BySpeedSelectionStrategy.Fastest);

            _pool.RemovePeer(peer);

            Assert.AreEqual(null, allocation.Current);
            Assert.AreEqual(0, _pool.PeerCount);
        }
        public async Task Can_remove_during_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderResponseTime(500);
            _pool.Start();
            _pool.AddPeer(peer);

            var allocation = await _pool.Allocate(new BySpeedStrategy(TransferSpeedType.Headers, true));

            _pool.RemovePeer(peer);

            Assert.AreEqual(null, allocation.Current);
            Assert.AreEqual(0, _pool.PeerCount);
        }
        public void Can_find_sync_peers()
        {
            _pool.Start();
            ISyncPeer[] syncPeers = new ISyncPeer[3];
            for (int i = 0; i < 3; i++)
            {
                syncPeers[i] = new SimpleSyncPeerMock(TestItem.PublicKeys[i]);
                _pool.AddPeer(syncPeers[i]);
            }

            for (int i = 3; i > 0; i--)
            {
                Assert.True(_pool.TryFind(syncPeers[i - 1].Node.Id, out PeerInfo peerInfo));
                Assert.NotNull(peerInfo);
            }
        }
        public void Peer_count_is_valid_when_removing()
        {
            _pool.Start();
            ISyncPeer[] syncPeers = new ISyncPeer[3];
            for (int i = 0; i < 3; i++)
            {
                syncPeers[i] = new SimpleSyncPeerMock(TestItem.PublicKeys[i]);
                _pool.AddPeer(syncPeers[i]);
            }

            for (int i = 3; i > 0; i--)
            {
                Assert.AreEqual(i, _pool.PeerCount, $"Remove {i}");
                _pool.RemovePeer(syncPeers[i - 1]);
            }
        }
        public async Task Will_remove_peer_if_times_out_on_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderResponseTime(20000);

            _pool.Start();
            _pool.AddPeer(peer);
            await Task.Delay(12000);


            var allocation = _pool.Borrow();

            Assert.AreEqual(null, allocation.Current);
            Assert.True(peer.DisconnectRequested);
        }
        public async Task It_is_fine_to_fail_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderFailure(true);
            _pool.Start();
            _pool.AddPeer(peer);
            await WaitForPeersInitialization();

            var allocation = await _pool.Allocate(new BySpeedStrategy(TransferSpeedType.Headers, true));

            _pool.RemovePeer(peer);

            Assert.AreEqual(null, allocation.Current);
            Assert.AreEqual(0, _pool.PeerCount);
        }
Beispiel #15
0
        public async Task Peer_count_is_valid_when_removing()
        {
            await using Context ctx = new Context();
            ctx.Pool.Start();
            ISyncPeer[] syncPeers = new ISyncPeer[3];
            for (int i = 0; i < 3; i++)
            {
                syncPeers[i] = new SimpleSyncPeerMock(TestItem.PublicKeys[i]);
                ctx.Pool.AddPeer(syncPeers[i]);
            }

            for (int i = 3; i > 0; i--)
            {
                Assert.AreEqual(i, ctx.Pool.PeerCount, $"Remove {i}");
                ctx.Pool.RemovePeer(syncPeers[i - 1]);
            }
        }
        public async Task Can_remove_during_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderResponseTime(1000);

            _pool.Start();
            _pool.AddPeer(peer);
            await Task.Delay(200);

            var allocation = _pool.Borrow();

            _pool.RemovePeer(peer);
            await Task.Delay(1000);

            Assert.AreEqual(null, allocation.Current);
            Assert.AreEqual(0, _pool.PeerCount);
        }
        public async Task Cannot_remove_when_stopped()
        {
            _pool.Start();
            ISyncPeer[] syncPeers = new ISyncPeer[3];
            for (int i = 0; i < 3; i++)
            {
                syncPeers[i] = new SimpleSyncPeerMock(TestItem.PublicKeys[i]);
                _pool.AddPeer(syncPeers[i]);
            }

            await _pool.StopAsync();

            for (int i = 3; i > 0; i--)
            {
                Assert.AreEqual(3, _pool.PeerCount, $"Remove {i}");
                _pool.RemovePeer(syncPeers[i - 1]);
            }
        }
        public async Task It_is_fine_to_fail_init()
        {
            var peer = new SimpleSyncPeerMock(TestItem.PublicKeyA);

            peer.SetHeaderFailure(true);

            _pool.Start();
            _pool.AddPeer(peer);
            await Task.Delay(200);

            var allocation = _pool.Borrow();

            _pool.RemovePeer(peer);
            await Task.Delay(1000);

            Assert.AreEqual(null, allocation.Current);
            Assert.AreEqual(0, _pool.PeerCount);
        }
        private async Task <SimpleSyncPeerMock[]> SetupPeers(int count)
        {
            var peers = new SimpleSyncPeerMock[count];

            for (int i = 0; i < count; i++)
            {
                peers[i] = new SimpleSyncPeerMock(TestItem.PublicKeys[i]);
            }

            _pool.Start();

            for (int i = 0; i < count; i++)
            {
                _pool.AddPeer(peers[i]);
            }

            await WaitForPeersInitialization();

            return(peers);
        }