feat: multi-Tor round-robin via tor_nodes config
New top-level tor_nodes list distributes traffic across multiple Tor SOCKS proxies. First hop is replaced at connection time by round-robin selection; health tests also rotate across all nodes. FirstHopPools are created for each node when pool_size > 0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,38 @@ class TestProxyEntry:
|
||||
assert entry.tests == 0
|
||||
|
||||
|
||||
class TestEffectiveChain:
|
||||
"""Test chain_nodes round-robin in pool health tests."""
|
||||
|
||||
def test_no_nodes_returns_original(self):
|
||||
cfg = ProxyPoolConfig(sources=[])
|
||||
chain = [ChainHop(proto="socks5", host="10.0.0.1", port=9050)]
|
||||
pool = ProxyPool(cfg, chain, timeout=10.0)
|
||||
assert pool._effective_chain() == chain
|
||||
|
||||
def test_round_robin_across_nodes(self):
|
||||
cfg = ProxyPoolConfig(sources=[])
|
||||
chain = [ChainHop(proto="socks5", host="original", port=9050)]
|
||||
nodes = [
|
||||
ChainHop(proto="socks5", host="node-a", port=9050),
|
||||
ChainHop(proto="socks5", host="node-b", port=9050),
|
||||
ChainHop(proto="socks5", host="node-c", port=9050),
|
||||
]
|
||||
pool = ProxyPool(cfg, chain, timeout=10.0, chain_nodes=nodes)
|
||||
|
||||
hosts = [pool._effective_chain()[0].host for _ in range(6)]
|
||||
assert hosts == [
|
||||
"node-a", "node-b", "node-c",
|
||||
"node-a", "node-b", "node-c",
|
||||
]
|
||||
|
||||
def test_empty_chain_no_replacement(self):
|
||||
cfg = ProxyPoolConfig(sources=[])
|
||||
nodes = [ChainHop(proto="socks5", host="node-a", port=9050)]
|
||||
pool = ProxyPool(cfg, [], timeout=10.0, chain_nodes=nodes)
|
||||
assert pool._effective_chain() == []
|
||||
|
||||
|
||||
class TestProxyPoolMerge:
|
||||
"""Test proxy deduplication and merge."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user