added testcase for node+work that simulates mining 100 shares
[p2pool.git] / p2pool / test / test_node.py
1 from twisted.internet import defer
2 from twisted.trial import unittest
3
4 from p2pool import networks, node, work
5 from p2pool.util import deferral, variable
6
7 class factory(object):
8     new_headers = variable.Event()
9     new_block = variable.Event()
10     new_tx = variable.Event()
11     conn = variable.Variable(None)
12     @classmethod
13     def getProtocol(self):
14         return defer.Deferred()
15
16 class bitcoind(object):
17     @classmethod
18     def rpc_help(self):
19         return '\ngetblock '
20     
21     @classmethod
22     def rpc_getblock(self, block_hash_hex):
23         return dict(height=42)
24     
25     @classmethod
26     def rpc_getmemorypool(self):
27         return {
28             "version" : 2,
29             "previousblockhash" : "000000000000016c169477c25421250ec5d32cf9c6d38538b5de970a2355fd89",
30             "transactions" : [
31             ],
32             "coinbaseaux" : {
33                 "flags" : "062f503253482f"
34             },
35             "coinbasevalue" : 5044450000,
36             "target" : "0000000000000513c50000000000000000000000000000000000000000000000",
37             "mintime" : 1351655621,
38             "mutable" : [
39                 "time",
40                 "transactions",
41                 "prevblock"
42             ],
43             "noncerange" : "00000000ffffffff",
44             "sigoplimit" : 20000,
45             "sizelimit" : 1000000,
46             "curtime" : 1351659940,
47             "bits" : "1a0513c5",
48             "height" : 205801
49         }
50
51 class FakeRequest(object):
52     def getUser(self):
53         return 'fakeuser'
54     def getClientIP(self):
55         return 'fakeclientip'
56
57 class Test(unittest.TestCase):
58     @defer.inlineCallbacks
59     def test_node(self):
60         net = networks.nets['litecoin_testnet']
61         n = node.Node(factory, bitcoind, [], [], net)
62         yield n.start()
63         
64         wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[], worker_fee=3)
65         
66         yield deferral.sleep(3)
67         
68         for i in xrange(100):
69             ba, got_resp = wb.get_work(pubkey_hash=4242, desired_share_target=2**256-1, desired_pseudoshare_target=2**256-1)
70             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())
71             yield deferral.sleep(.01)
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 deferral.sleep(20) # waiting for work_poller to exit