Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
added test_nodes, which simulates 3 p2pool nodes mining and exchangin…
…g shares
  • Loading branch information
forrestv committed Oct 31, 2012
1 parent 6c49052 commit c0387d5
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 1 deletion.
2 changes: 1 addition & 1 deletion p2pool/p2p.py
Expand Up @@ -153,7 +153,7 @@ def new_dataReceived(data):
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:
Expand Down
64 changes: 64 additions & 0 deletions 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
Expand Down Expand Up @@ -50,6 +54,32 @@ def rpc_getmemorypool(self):
"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):
Expand Down Expand Up @@ -85,3 +115,37 @@ def test_node(self):
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

0 comments on commit c0387d5

Please sign in to comment.