A Python port of the Invisible Internet Project (I2P)
at main 149 lines 4.8 kB view raw
1"""Tests for peer score calculators.""" 2 3import os 4 5import pytest 6 7 8class TestCapacityCalculator: 9 def test_capacity_all_success(self): 10 from i2p_peer.calculator import CapacityCalculator 11 from i2p_peer.profile import PeerProfile 12 13 p = PeerProfile(os.urandom(32)) 14 for _ in range(20): 15 p.record_tunnel_build_success() 16 p.record_send_success() 17 p.record_db_store_success() 18 p.heard_from() 19 score = CapacityCalculator.calc(p) 20 # All success should yield high capacity 21 assert score >= 0.8 22 assert score <= 1.0 23 24 def test_capacity_all_failure(self): 25 from i2p_peer.calculator import CapacityCalculator 26 from i2p_peer.profile import PeerProfile 27 28 p = PeerProfile(os.urandom(32)) 29 for _ in range(20): 30 p.record_tunnel_build_failure() 31 p.record_send_failure() 32 p.record_db_store_failure() 33 score = CapacityCalculator.calc(p) 34 # All failure should yield low capacity 35 assert score <= 0.15 36 37 def test_capacity_mixed(self): 38 from i2p_peer.calculator import CapacityCalculator 39 from i2p_peer.profile import PeerProfile 40 41 p = PeerProfile(os.urandom(32)) 42 for _ in range(7): 43 p.record_tunnel_build_success() 44 for _ in range(3): 45 p.record_tunnel_build_failure() 46 for _ in range(8): 47 p.record_send_success() 48 for _ in range(2): 49 p.record_send_failure() 50 for _ in range(6): 51 p.record_db_store_success() 52 for _ in range(4): 53 p.record_db_store_failure() 54 p.heard_from() 55 score = CapacityCalculator.calc(p) 56 # Mixed should be moderate 57 assert 0.3 < score < 0.9 58 59 def test_capacity_no_history(self): 60 from i2p_peer.calculator import CapacityCalculator 61 from i2p_peer.profile import PeerProfile 62 63 p = PeerProfile(os.urandom(32)) 64 score = CapacityCalculator.calc(p) 65 assert score == 0.0 66 67 def test_capacity_range(self): 68 from i2p_peer.calculator import CapacityCalculator 69 from i2p_peer.profile import PeerProfile 70 71 p = PeerProfile(os.urandom(32)) 72 for _ in range(5): 73 p.record_tunnel_build_success() 74 score = CapacityCalculator.calc(p) 75 assert 0.0 <= score <= 1.0 76 77 78class TestSpeedCalculator: 79 def test_speed_low_latency(self): 80 from i2p_peer.calculator import SpeedCalculator 81 from i2p_peer.profile import PeerProfile 82 83 p = PeerProfile(os.urandom(32)) 84 for _ in range(10): 85 p.record_latency(50.0) # 50ms is fast 86 score = SpeedCalculator.calc(p) 87 assert score >= 0.7 88 assert score <= 1.0 89 90 def test_speed_high_latency(self): 91 from i2p_peer.calculator import SpeedCalculator 92 from i2p_peer.profile import PeerProfile 93 94 p = PeerProfile(os.urandom(32)) 95 for _ in range(10): 96 p.record_latency(5000.0) # 5 seconds is slow 97 score = SpeedCalculator.calc(p) 98 assert score <= 0.3 99 100 def test_speed_no_latency(self): 101 from i2p_peer.calculator import SpeedCalculator 102 from i2p_peer.profile import PeerProfile 103 104 p = PeerProfile(os.urandom(32)) 105 score = SpeedCalculator.calc(p) 106 assert score == 0.0 107 108 def test_speed_range(self): 109 from i2p_peer.calculator import SpeedCalculator 110 from i2p_peer.profile import PeerProfile 111 112 p = PeerProfile(os.urandom(32)) 113 p.record_latency(500.0) 114 score = SpeedCalculator.calc(p) 115 assert 0.0 <= score <= 1.0 116 117 118class TestIntegrationCalculator: 119 def test_integration_from_db_ops(self): 120 from i2p_peer.calculator import IntegrationCalculator 121 from i2p_peer.profile import PeerProfile 122 123 p = PeerProfile(os.urandom(32)) 124 for _ in range(10): 125 p.record_db_store_success() 126 p.record_db_lookup_success() 127 score = IntegrationCalculator.calc(p) 128 assert score >= 0.8 129 assert score <= 1.0 130 131 def test_integration_no_ops(self): 132 from i2p_peer.calculator import IntegrationCalculator 133 from i2p_peer.profile import PeerProfile 134 135 p = PeerProfile(os.urandom(32)) 136 score = IntegrationCalculator.calc(p) 137 assert score == 0.0 138 139 def test_integration_mixed(self): 140 from i2p_peer.calculator import IntegrationCalculator 141 from i2p_peer.profile import PeerProfile 142 143 p = PeerProfile(os.urandom(32)) 144 for _ in range(5): 145 p.record_db_store_success() 146 for _ in range(5): 147 p.record_db_store_failure() 148 score = IntegrationCalculator.calc(p) 149 assert 0.3 < score < 0.7