added testcase for node+work that simulates mining 100 shares
authorForrest Voight <forrest@forre.st>
Wed, 31 Oct 2012 05:34:50 +0000 (01:34 -0400)
committerForrest Voight <forrest@forre.st>
Wed, 31 Oct 2012 05:46:42 +0000 (01:46 -0400)
p2pool/bitcoin/networks.py
p2pool/networks.py
p2pool/node.py
p2pool/test/test_node.py [new file with mode: 0644]
p2pool/work.py

index 6e074f3..30666cd 100644 (file)
@@ -115,7 +115,7 @@ nets = dict(
         CONF_FILE_FUNC=lambda: os.path.join(os.path.join(os.environ['APPDATA'], 'Litecoin') if platform.system() == 'Windows' else os.path.expanduser('~/Library/Application Support/Litecoin/') if platform.system() == 'Darwin' else os.path.expanduser('~/.litecoin'), 'litecoin.conf'),
         BLOCK_EXPLORER_URL_PREFIX='http://nonexistent-litecoin-testnet-explorer/block/',
         ADDRESS_EXPLORER_URL_PREFIX='http://nonexistent-litecoin-testnet-explorer/address/',
-        SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256//1000 - 1),
+        SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256 - 1),
     ),
 )
 for net_name, net in nets.iteritems():
index 2513248..30d266d 100644 (file)
@@ -70,7 +70,7 @@ nets = dict(
         IDENTIFIER='cca5e24ec6408b1e'.decode('hex'),
         PREFIX='ad9614f6466a39cf'.decode('hex'),
         P2P_PORT=19338,
-        MAX_TARGET=2**256//2000 - 1,
+        MAX_TARGET=2**256 - 1,
         PERSIST=False,
         WORKER_PORT=19327,
         BOOTSTRAP_ADDRS='72.14.191.28'.split(' '),
index c0ff82c..4a90646 100644 (file)
@@ -174,7 +174,7 @@ class Node(object):
         self.bitcoind_work = variable.Variable((yield helper.getwork(self.bitcoind)))
         @defer.inlineCallbacks
         def work_poller():
-            while True:
+            while stop_signal.times == 0:
                 flag = self.factory.new_block.get_deferred()
                 try:
                     self.bitcoind_work.set((yield helper.getwork(self.bitcoind, self.bitcoind_work.value['use_getblocktemplate'])))
@@ -204,6 +204,8 @@ class Node(object):
         self.handle_header = handle_header
         @defer.inlineCallbacks
         def poll_header():
+            if self.factory.conn.value is None:
+                return
             handle_header((yield self.factory.conn.value.get_block_header(self.bitcoind_work.value['previous_block'])))
         self.bitcoind_work.changed.watch(lambda _: poll_header())
         yield deferral.retry('Error while requesting best block header:')(poll_header)()
@@ -272,9 +274,13 @@ class Node(object):
                     if tx_hash in self.known_txs_var.value:
                         new_known_txs[tx_hash] = self.known_txs_var.value[tx_hash]
             self.known_txs_var.set(new_known_txs)
-        task.LoopingCall(forget_old_txs).start(10)
+        t = task.LoopingCall(forget_old_txs)
+        t.start(10)
+        stop_signal.watch(t.stop)
         
-        task.LoopingCall(self.clean_tracker).start(5)
+        t = task.LoopingCall(self.clean_tracker)
+        t.start(5)
+        stop_signal.watch(t.stop)
     
     def set_best_share(self):
         best, desired, decorated_heads = self.tracker.think(self.get_height_rel_highest, self.bitcoind_work.value['previous_block'], self.bitcoind_work.value['bits'], self.known_txs_var.value)
diff --git a/p2pool/test/test_node.py b/p2pool/test/test_node.py
new file mode 100644 (file)
index 0000000..d41c1b7
--- /dev/null
@@ -0,0 +1,80 @@
+from twisted.internet import defer
+from twisted.trial import unittest
+
+from p2pool import networks, node, work
+from p2pool.util import deferral, variable
+
+class factory(object):
+    new_headers = variable.Event()
+    new_block = variable.Event()
+    new_tx = variable.Event()
+    conn = variable.Variable(None)
+    @classmethod
+    def getProtocol(self):
+        return defer.Deferred()
+
+class bitcoind(object):
+    @classmethod
+    def rpc_help(self):
+        return '\ngetblock '
+    
+    @classmethod
+    def rpc_getblock(self, block_hash_hex):
+        return dict(height=42)
+    
+    @classmethod
+    def rpc_getmemorypool(self):
+        return {
+            "version" : 2,
+            "previousblockhash" : "000000000000016c169477c25421250ec5d32cf9c6d38538b5de970a2355fd89",
+            "transactions" : [
+            ],
+            "coinbaseaux" : {
+                "flags" : "062f503253482f"
+            },
+            "coinbasevalue" : 5044450000,
+            "target" : "0000000000000513c50000000000000000000000000000000000000000000000",
+            "mintime" : 1351655621,
+            "mutable" : [
+                "time",
+                "transactions",
+                "prevblock"
+            ],
+            "noncerange" : "00000000ffffffff",
+            "sigoplimit" : 20000,
+            "sizelimit" : 1000000,
+            "curtime" : 1351659940,
+            "bits" : "1a0513c5",
+            "height" : 205801
+        }
+
+class FakeRequest(object):
+    def getUser(self):
+        return 'fakeuser'
+    def getClientIP(self):
+        return 'fakeclientip'
+
+class Test(unittest.TestCase):
+    @defer.inlineCallbacks
+    def test_node(self):
+        net = networks.nets['litecoin_testnet']
+        n = node.Node(factory, bitcoind, [], [], net)
+        yield n.start()
+        
+        wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[], worker_fee=3)
+        
+        yield deferral.sleep(3)
+        
+        for i in xrange(100):
+            ba, got_resp = wb.get_work(pubkey_hash=4242, desired_share_target=2**256-1, desired_pseudoshare_target=2**256-1)
+            got_resp(dict(version=ba.version, previous_block=ba.previous_block, merkle_root=ba.merkle_root, timestamp=ba.timestamp, bits=ba.bits, nonce=42), FakeRequest())
+            yield deferral.sleep(.01)
+        
+        yield deferral.sleep(3)
+        
+        assert len(n.tracker.items) == 100
+        assert n.tracker.verified.get_height(n.best_share_var.value) == 100
+        
+        n.stop()
+        
+        yield deferral.sleep(20) # waiting for work_poller to exit
index 7c8d374..21b77ac 100644 (file)
@@ -160,7 +160,7 @@ class WorkerBridge(worker_interface.WorkerBridge):
         return pubkey_hash, desired_share_target, desired_pseudoshare_target
     
     def get_work(self, pubkey_hash, desired_share_target, desired_pseudoshare_target):
-        if len(self.node.p2p_node.peers) == 0 and self.node.net.PERSIST:
+        if (self.node.p2p_node is None or len(self.node.p2p_node.peers) == 0) and self.node.net.PERSIST:
             raise jsonrpc.Error_for_code(-12345)(u'p2pool is not connected to any peers')
         if self.node.best_share_var.value is None and self.node.net.PERSIST:
             raise jsonrpc.Error_for_code(-12345)(u'p2pool is downloading shares')