@@ -686,6 +686,104 @@ suite "PeerPool testing suite":
686
686
687
687
check waitFor (testDeleteOnRelease ()) == true
688
688
689
+ test " Notify when peer leaves pool test" :
690
+ proc testNotifyOnLeave (): Future [bool ] {.async .} =
691
+ var pool = newPeerPool [PeerTest , PeerTestID ]()
692
+ var peer0 = PeerTest .init (" idInc0" , 100 )
693
+ var peer1 = PeerTest .init (" idOut0" , 100 )
694
+ var peer2 = PeerTest .init (" idInc1" , 100 )
695
+ var peer3 = PeerTest .init (" idOut1" , 100 )
696
+
697
+ # Case 1. Deleting peer which is not part of PeerPool.
698
+ block :
699
+ var fut0 = pool.joinPeer (peer0)
700
+ doAssert (fut0.finished == false )
701
+ await sleepAsync (20 .milliseconds)
702
+ doAssert (fut0.finished == true and fut0.failed == false )
703
+
704
+ # Case 2. Deleting peer which is not acquired.
705
+ discard pool.addPeerNoWait (peer0, PeerType .Incoming )
706
+ block :
707
+ var fut0 = pool.joinPeer (peer0)
708
+ discard pool.deletePeer (peer0)
709
+ var fut1 = pool.joinPeer (peer0)
710
+ await sleepAsync (20 .milliseconds)
711
+ var fut2 = pool.joinPeer (peer0)
712
+ doAssert (fut0.finished == true and fut0.failed == false )
713
+ doAssert (fut1.finished == true and fut1.failed == false )
714
+ doAssert (fut2.finished == false )
715
+ await sleepAsync (20 .milliseconds)
716
+ doAssert (fut2.finished == true and fut2.failed == false )
717
+
718
+ # Case 3. Peer disconnected while it wasn't acquired.
719
+ discard pool.addPeerNoWait (peer1, PeerType .Outgoing )
720
+ block :
721
+ var fut0 = pool.joinPeer (peer1)
722
+ # Peer disconnecting
723
+ peer1.future.complete ()
724
+ var fut1 = pool.joinPeer (peer1)
725
+ await sleepAsync (20 .milliseconds)
726
+ var fut2 = pool.joinPeer (peer1)
727
+ doAssert (fut0.finished == true and fut0.failed == false )
728
+ doAssert (fut1.finished == true and fut1.failed == false )
729
+ doAssert (fut2.finished == false )
730
+ await sleepAsync (20 .milliseconds)
731
+ doAssert (fut2.finished == true and fut2.failed == false )
732
+
733
+ # Case 4. Peer deleted when it was acquired.
734
+ discard pool.addPeerNoWait (peer2, PeerType .Incoming )
735
+ block :
736
+ var fut0 = pool.joinPeer (peer2)
737
+ var p = await pool.acquire ()
738
+ doAssert (p.id == " idInc1" )
739
+ var fut1 = pool.joinPeer (peer2)
740
+ discard pool.deletePeer (peer2)
741
+ await sleepAsync (20 .milliseconds)
742
+ var fut2 = pool.joinPeer (peer2)
743
+ doAssert (fut0.finished == false )
744
+ doAssert (fut1.finished == false )
745
+ doAssert (fut2.finished == false )
746
+ pool.release (peer2)
747
+ var fut3 = pool.joinPeer (peer2)
748
+ await sleepAsync (20 .milliseconds)
749
+ var fut4 = pool.joinPeer (peer2)
750
+ doAssert (fut0.finished == true and fut0.failed == false )
751
+ doAssert (fut1.finished == true and fut1.failed == false )
752
+ doAssert (fut2.finished == true and fut2.failed == false )
753
+ doAssert (fut3.finished == true and fut3.failed == false )
754
+ doAssert (fut4.finished == false )
755
+ await sleepAsync (20 .milliseconds)
756
+ doAssert (fut4.finished == true and fut4.failed == false )
757
+
758
+ # Case 5. Peer disconnected while it was acquired.
759
+ discard pool.addPeerNoWait (peer3, PeerType .Outgoing )
760
+ block :
761
+ var fut0 = pool.joinPeer (peer3)
762
+ var p = await pool.acquire ()
763
+ doAssert (p.id == " idOut1" )
764
+ var fut1 = pool.joinPeer (peer3)
765
+ # Peer disconnecting
766
+ peer3.future.complete ()
767
+ await sleepAsync (20 .milliseconds)
768
+ var fut2 = pool.joinPeer (peer3)
769
+ doAssert (fut0.finished == false )
770
+ doAssert (fut1.finished == false )
771
+ doAssert (fut2.finished == false )
772
+ pool.release (peer3)
773
+ var fut3 = pool.joinPeer (peer3)
774
+ await sleepAsync (20 .milliseconds)
775
+ var fut4 = pool.joinPeer (peer3)
776
+ doAssert (fut0.finished == true and fut0.failed == false )
777
+ doAssert (fut1.finished == true and fut1.failed == false )
778
+ doAssert (fut2.finished == true and fut2.failed == false )
779
+ doAssert (fut3.finished == true and fut3.failed == false )
780
+ doAssert (fut4.finished == false )
781
+ await sleepAsync (20 .milliseconds)
782
+ doAssert (fut4.finished == true and fut4.failed == false )
783
+ return true
784
+
785
+ check waitFor (testNotifyOnLeave ()) == true
786
+
689
787
test " Space tests" :
690
788
var pool1 = newPeerPool [PeerTest , PeerTestID ](maxPeers = 79 )
691
789
var pool2 = newPeerPool [PeerTest , PeerTestID ](maxPeers = 79 ,
0 commit comments