made mining test start a jsonrpc server and go through that to maximize coverage
[p2pool.git] / p2pool / test / test_node.py
1 from twisted.internet import defer, reactor
2 from twisted.trial import unittest
3 from twisted.web import resource, server
4
5 from p2pool import networks, node, work
6 from p2pool.bitcoin import worker_interface
7 from p2pool.util import deferral, jsonrpc, variable
8
9 class factory(object):
10     new_headers = variable.Event()
11     new_block = variable.Event()
12     new_tx = variable.Event()
13     conn = variable.Variable(None)
14     @classmethod
15     def getProtocol(self):
16         return defer.Deferred()
17
18 class bitcoind(object):
19     @classmethod
20     def rpc_help(self):
21         return '\ngetblock '
22     
23     @classmethod
24     def rpc_getblock(self, block_hash_hex):
25         return dict(height=42)
26     
27     @classmethod
28     def rpc_getmemorypool(self):
29         return {
30             "version" : 2,
31             "previousblockhash" : "000000000000016c169477c25421250ec5d32cf9c6d38538b5de970a2355fd89",
32             "transactions" : [
33             ],
34             "coinbaseaux" : {
35                 "flags" : "062f503253482f"
36             },
37             "coinbasevalue" : 5044450000,
38             "target" : "0000000000000513c50000000000000000000000000000000000000000000000",
39             "mintime" : 1351655621,
40             "mutable" : [
41                 "time",
42                 "transactions",
43                 "prevblock"
44             ],
45             "noncerange" : "00000000ffffffff",
46             "sigoplimit" : 20000,
47             "sizelimit" : 1000000,
48             "curtime" : 1351659940,
49             "bits" : "1a0513c5",
50             "height" : 205801
51         }
52
53 class Test(unittest.TestCase):
54     @defer.inlineCallbacks
55     def test_node(self):
56         net = networks.nets['litecoin_testnet']
57         n = node.Node(factory, bitcoind, [], [], net)
58         yield n.start()
59         
60         wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[], worker_fee=3)
61         web_root = resource.Resource()
62         worker_interface.WorkerInterface(wb).attach_to(web_root)
63         port = reactor.listenTCP(8080, server.Site(web_root))
64         
65         proxy = jsonrpc.Proxy('http://127.0.0.1:8080')
66         
67         yield deferral.sleep(3)
68         
69         for i in xrange(100):
70             blah = yield proxy.rpc_getwork()
71             yield proxy.rpc_getwork(blah['data'])
72         
73         yield deferral.sleep(3)
74         
75         assert len(n.tracker.items) == 100
76         assert n.tracker.verified.get_height(n.best_share_var.value) == 100
77         
78         n.stop()
79         
80         yield port.stopListening()
81         del net, n, wb, web_root, port, proxy
82         import gc
83         gc.collect()
84         gc.collect()
85         gc.collect()
86         
87         yield deferral.sleep(20) # waiting for work_poller to exit