change SHARE_PERIOD and SPREAD to new values on switch to new share implementation
[p2pool.git] / p2pool / test / test_node.py
index 658b5af..583c812 100644 (file)
@@ -1,9 +1,11 @@
 from __future__ import division
 
+import base64
 import random
 import tempfile
 
 from twisted.internet import defer, reactor
+from twisted.python import failure
 from twisted.trial import unittest
 from twisted.web import client, resource, server
 
@@ -53,9 +55,18 @@ class bitcoind(object): # can be used as p2p factory, p2p protocol, or rpc jsonr
         block_hash = int(block_hash_hex, 16)
         return dict(height=self.blocks.index(block_hash))
     
-    def rpc_getmemorypool(self, result=None):
-        if result is not None:
+    def __getattr__(self, name):
+        if name.startswith('rpc_'):
+            return lambda *args, **kwargs: failure.Failure(jsonrpc.Error_for_code(-32601)('Method not found'))
+    
+    def rpc_getblocktemplate(self, param):
+        if param['mode'] == 'template':
+            pass
+        elif param['mode'] == 'submit':
+            result = param['data']
             block = bitcoin_data.block_type.unpack(result.decode('hex'))
+            if sum(tx_out['value'] for tx_out in block['txs'][0]['tx_outs']) != sum(tx['tx_outs'][0]['value'] for tx in block['txs'][1:]) + 5000000000:
+                print 'invalid fee'
             if block['header']['previous_block'] != self.blocks[-1]:
                 return False
             if bitcoin_data.hash256(result.decode('hex')) > block['header']['bits'].target:
@@ -65,40 +76,24 @@ class bitcoind(object): # can be used as p2p factory, p2p protocol, or rpc jsonr
             self.headers[header_hash] = block['header']
             reactor.callLater(0, self.new_block.happened)
             return True
+        else:
+            raise jsonrpc.Error_for_code(-1)('invalid request')
         
+        txs = []
+        for i in xrange(100):
+            fee = i
+            txs.append(dict(
+                data=bitcoin_data.tx_type.pack(dict(version=1, tx_ins=[], tx_outs=[dict(value=fee, script='hello!'*100)], lock_time=0)).encode('hex'),
+                fee=fee,
+            ))
         return {
             "version" : 2,
             "previousblockhash" : '%064x' % (self.blocks[-1],),
-            "transactions" : ([
-                {
-                    "data" : "01000000014c6ade5af7e7803fdf2ecae88d939ec044fdb3de84bc70168723969666b30e38010000008b483045022100e1fce6361811e24d57b494c3d71a9e653e54b9489dd5a1889affdef8a1e912b002204079a4720f25b55a0f092bcd70a5824e38a85072bb8e58477df8eb6a66b967ae01410426952de5ee7e5fea3c2065ffceada913d7d643f5631f0d714d667a0b81b599aada24f6e0b46d4bd4051b8111be95cf460fbd1977eadb3f2adc68b4018f8b5ba6ffffffff020065cd1d000000001976a9144799fc9c1b2cfb2c0187551be50f6ea41ed37ed888ac80969800000000001976a914ac2092a73378e8b80a127748a10274c962579f5188ac00000000",
-                    "hash" : "9665fece00aceffd175a28912707889c9b2039be004c77e1497b59d8f5132966",
-                    "depends" : [
-                    ],
-                    "fee" : 0,
-                    "sigops" : 2
-                },
-                {
-                    "data" : "0100000003bbb3bda750ea9bc057906a7fb12b7a0bf81e4a2c5ffbf3117d0aff9f6e4a7d8c000000006b483045022100fbadaa914af56955dca66c1cca59f7ec9fadbfe01fdec7d72e6cde85abd67be302202713f52dacf7da9c678c33440caef5e2de65dc02994197b5b59d284214088fb1012102ace616bb7d1e5a58118c83466f410fd2c5423450da0dbeb5b1fca158873a92cbffffffffd5c3ec30d816ecc203c581cb7365c1c51c1917b59660ca16683c2f4e1e394337010000006a47304402207dc3644c8a14175e1cec939fcec4d60702f556ee153f602b764adcf32c5a1e6b02207aee1c6ed4d0e8004f1a4fe0a82401bf7e8f285ae1a506fe1be25670ebdb092d0121034d77fd7088a2ee52bc1a3f850772aa61a47d230b3093065a23fd909d95c38ffbfffffffffbf4692b046b684fc51bc7112da5bbd6094fb92eb87f25c6a0893fea15fac13b000000006c493046022100b8d79f514b2bd20f9f2aa5bb5031cf038a5b97fd2fe9ea182187bbeea454d5d202210085f55c96c1e2be5faf26f6122e2d105f9ffaa49b61890a1def9b30ff48be3362012102716ee02e7f5a9f2e5619b5ac7c092e5e5aab6fc45708504bb1f8aac4ea31a84cffffffff0262cc990a000000001976a9141f7dcec4f61c2a1488c7ccf03673120f230d1fd988ac005ed0b2000000001976a914f2b29da6ac6a2aac1f088ead181b553d60d35e9c88ac00000000",
-                    "hash" : "27ac960a159b7f8a7d3cc3095d0248375ca65be2c98b16a5818814262eabe01c",
-                    "depends" : [
-                    ],
-                    "fee" : 0,
-                    "sigops" : 2
-                },
-                {
-                    "data" : "01000000012d0b6b9d9f57de5c567ea43f26e488321bfcfd0226f3043f7151d504702cfacd010000008b483045022025830bac86c09f77fb132507952210fd0b2452d8d583c12be80e274d943c7127022100f1674c75ae0b38fcee9489daa4164d6f84a386534be0eb1cc063e853bc1d3258014104f993167e332d7fe550b5049d35a972463944beb9ae8e9abe888f832ba6847883a2fd3464765b6350b89a84c8fe7ecee0cca4352494413b4c15791c1cd0694022ffffffff02007ddaac000000001976a9140e0c40f1b244e2dd07c95f52978f50a6fe5ec85188ac66208687080000001976a9143e64cf12ce0369ce9fe78b37708ae6f8a565b2d288ac00000000",
-                    "hash" : "00d1647f78e05715b171c9169d555141c9a6ec54d1ec177534aae4555d7bbc7a",
-                    "depends" : [
-                    ],
-                    "fee" : 0,
-                    "sigops" : 2
-                }
-            ] if random.randrange(2) else []),
+            "transactions" : txs,
             "coinbaseaux" : {
                 "flags" : "062f503253482f"
             },
-            "coinbasevalue" : 5044450000,
+            "coinbasevalue" : 5000000000 + sum(tx['fee'] for tx in txs),
             "target" : "0000000000000513c50000000000000000000000000000000000000000000000",
             "mintime" : 1351655621,
             "mutable" : [
@@ -131,10 +126,12 @@ class mm_provider(object):
 mynet = math.Object(
     PARENT=networks.nets['litecoin_testnet'],
     SHARE_PERIOD=3, # seconds
+    NEW_SHARE_PERIOD=5, # seconds
     CHAIN_LENGTH=20*60//3, # shares
     REAL_CHAIN_LENGTH=20*60//3, # shares
     TARGET_LOOKBEHIND=200, # shares
     SPREAD=12, # blocks
+    NEW_SPREAD=3, # blocks
     IDENTIFIER='cca5e24ec6408b1e'.decode('hex'),
     PREFIX='ad9614f6466a39cf'.decode('hex'),
     P2P_PORT=19338,
@@ -191,7 +188,8 @@ class Test(unittest.TestCase):
         worker_interface.WorkerInterface(wb).attach_to(web_root)
         port = reactor.listenTCP(0, server.Site(web_root))
         
-        proxy = jsonrpc.HTTPProxy('http://127.0.0.1:' + str(port.getHost().port))
+        proxy = jsonrpc.HTTPProxy('http://127.0.0.1:' + str(port.getHost().port),
+            headers=dict(Authorization='Basic ' + base64.b64encode('user/0:password')))
         
         yield deferral.sleep(3)
         
@@ -233,7 +231,8 @@ class Test(unittest.TestCase):
         yield deferral.sleep(3)
         
         for i in xrange(SHARES):
-            proxy = jsonrpc.HTTPProxy('http://127.0.0.1:' + str(random.choice(nodes).web_port.getHost().port))
+            proxy = jsonrpc.HTTPProxy('http://127.0.0.1:' + str(random.choice(nodes).web_port.getHost().port),
+                headers=dict(Authorization='Basic ' + base64.b64encode('user/0:password')))
             blah = yield proxy.rpc_getwork()
             yield proxy.rpc_getwork(blah['data'])
             yield deferral.sleep(.05)
@@ -266,7 +265,7 @@ class Test(unittest.TestCase):
         for i, n in enumerate(nodes):
             assert len(n.n.tracker.items) == SHARES, (i, len(n.n.tracker.items))
             assert n.n.tracker.verified.get_height(n.n.best_share_var.value) == SHARES, (i, n.n.tracker.verified.get_height(n.n.best_share_var.value))
-            assert type(n.n.tracker.items[nodes[0].n.best_share_var.value]) is data.Share
+            assert type(n.n.tracker.items[nodes[0].n.best_share_var.value]) is (data.Share.SUCCESSOR if data.Share.SUCCESSOR is not None else data.Share)
             assert type(n.n.tracker.items[n.n.tracker.get_nth_parent_hash(nodes[0].n.best_share_var.value, SHARES - 5)]) is data.Share
         
         for n in nodes: