From: Forrest Voight Date: Wed, 31 Oct 2012 21:31:27 +0000 (-0400) Subject: added test_nodes, which simulates 3 p2pool nodes mining and exchanging shares X-Git-Tag: 9.0~14 X-Git-Url: https://git.novaco.in/?p=p2pool.git;a=commitdiff_plain;h=c0387d5f5ad4d9fe70700f98b0475c6d3d04f785 added test_nodes, which simulates 3 p2pool nodes mining and exchanging shares --- diff --git a/p2pool/p2p.py b/p2pool/p2p.py index 569bfbb..697fd06 100644 --- a/p2pool/p2p.py +++ b/p2pool/p2p.py @@ -153,7 +153,7 @@ class Protocol(p2protocol.Protocol): random.expovariate(1/100)][-1]) self._stop_thread2 = deferral.run_repeatedly(lambda: [ - self.send_addrme(port=self.node.port), + self.send_addrme(port=self.node.serverfactory.listen_port.getHost().port), random.expovariate(1/(100*len(self.node.peers) + 1))][-1]) if best_share_hash is not None: diff --git a/p2pool/test/test_node.py b/p2pool/test/test_node.py index 0fa594f..acf2868 100644 --- a/p2pool/test/test_node.py +++ b/p2pool/test/test_node.py @@ -1,3 +1,7 @@ +from __future__ import division + +import random + from twisted.internet import defer, reactor from twisted.trial import unittest from twisted.web import resource, server @@ -50,6 +54,32 @@ class bitcoind(object): "height" : 205801 } +class MiniNode(object): + @classmethod + @defer.inlineCallbacks + def start(cls, net, factory, bitcoind, peer_ports): + self = cls() + + self.n = node.Node(factory, bitcoind, [], [], net) + yield self.n.start() + + self.n.p2p_node = node.P2PNode(self.n, 0, 1000000, {}, [('127.0.0.1', peer_port) for peer_port in peer_ports]) + self.n.p2p_node.start() + + wb = work.WorkerBridge(node=self.n, my_pubkey_hash=random.randrange(2**160), donation_percentage=random.uniform(0, 10), merged_urls=[], worker_fee=3) + web_root = resource.Resource() + worker_interface.WorkerInterface(wb).attach_to(web_root) + self.web_port = reactor.listenTCP(0, server.Site(web_root)) + + defer.returnValue(self) + + @defer.inlineCallbacks + def stop(self): + yield self.web_port.stopListening() + yield self.n.p2p_node.stop() + yield self.n.stop() + del self.web_port, self.n + class Test(unittest.TestCase): @defer.inlineCallbacks def test_node(self): @@ -85,3 +115,37 @@ class Test(unittest.TestCase): gc.collect() yield deferral.sleep(20) # waiting for work_poller to exit + + @defer.inlineCallbacks + def test_nodes(self): + net = networks.nets['litecoin_testnet'] + N = 3 + + nodes = [] + for i in xrange(N): + nodes.append((yield MiniNode.start(net, factory, bitcoind, [mn.n.p2p_node.serverfactory.listen_port.getHost().port for mn in nodes]))) + + yield deferral.sleep(3) + + for i in xrange(100): + proxy = jsonrpc.Proxy('http://127.0.0.1:' + str(random.choice(nodes).web_port.getHost().port)) + blah = yield proxy.rpc_getwork() + yield proxy.rpc_getwork(blah['data']) + yield deferral.sleep(random.expovariate(1/.1)) + + yield deferral.sleep(3) + + for i, n in enumerate(nodes): + assert len(n.n.tracker.items) == 100, (i, len(n.n.tracker.items)) + assert n.n.tracker.verified.get_height(n.n.best_share_var.value) == 100, (i, n.n.tracker.verified.get_height(n.n.best_share_var.value)) + + for n in nodes: + yield n.stop() + + del nodes, n + import gc + gc.collect() + gc.collect() + gc.collect() + + yield deferral.sleep(20) # waiting for work_poller to exit