added test_nodes, which simulates 3 p2pool nodes mining and exchanging shares
authorForrest Voight <forrest@forre.st>
Wed, 31 Oct 2012 21:31:27 +0000 (17:31 -0400)
committerForrest Voight <forrest@forre.st>
Wed, 31 Oct 2012 23:29:44 +0000 (19:29 -0400)
p2pool/p2p.py
p2pool/test/test_node.py

index 569bfbb..697fd06 100644 (file)
@@ -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:
index 0fa594f..acf2868 100644 (file)
@@ -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