Changeset View
Changeset View
Standalone View
Standalone View
test/functional/mining_getblocktemplate_longpoll.py
Show All 34 Lines | def run_test(self): | ||||
self.log.info( | self.log.info( | ||||
"Warning: this test will take about 70 seconds in the best case. Be patient.") | "Warning: this test will take about 70 seconds in the best case. Be patient.") | ||||
self.nodes[0].generate(10) | self.nodes[0].generate(10) | ||||
templat = self.nodes[0].getblocktemplate() | templat = self.nodes[0].getblocktemplate() | ||||
longpollid = templat['longpollid'] | longpollid = templat['longpollid'] | ||||
# longpollid should not change between successive invocations if | # longpollid should not change between successive invocations if | ||||
# nothing else happens | # nothing else happens | ||||
templat2 = self.nodes[0].getblocktemplate() | templat2 = self.nodes[0].getblocktemplate() | ||||
assert(templat2['longpollid'] == longpollid) | assert templat2['longpollid'] == longpollid | ||||
# Test 1: test that the longpolling wait if we do nothing | # Test 1: test that the longpolling wait if we do nothing | ||||
thr = LongpollThread(self.nodes[0]) | thr = LongpollThread(self.nodes[0]) | ||||
thr.start() | thr.start() | ||||
# check that thread still lives | # check that thread still lives | ||||
# wait 5 seconds or until thread exits | # wait 5 seconds or until thread exits | ||||
thr.join(5) | thr.join(5) | ||||
assert(thr.is_alive()) | assert thr.is_alive() | ||||
# Test 2: test that longpoll will terminate if another node generates a block | # Test 2: test that longpoll will terminate if another node generates a block | ||||
# generate a block on another node | # generate a block on another node | ||||
self.nodes[1].generate(1) | self.nodes[1].generate(1) | ||||
# check that thread will exit now that new transaction entered mempool | # check that thread will exit now that new transaction entered mempool | ||||
# wait 5 seconds or until thread exits | # wait 5 seconds or until thread exits | ||||
thr.join(5) | thr.join(5) | ||||
assert(not thr.is_alive()) | assert not thr.is_alive() | ||||
# Test 3: test that longpoll will terminate if we generate a block | # Test 3: test that longpoll will terminate if we generate a block | ||||
# ourselves | # ourselves | ||||
thr = LongpollThread(self.nodes[0]) | thr = LongpollThread(self.nodes[0]) | ||||
thr.start() | thr.start() | ||||
# generate a block on another node | # generate a block on another node | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
# wait 5 seconds or until thread exits | # wait 5 seconds or until thread exits | ||||
thr.join(5) | thr.join(5) | ||||
assert(not thr.is_alive()) | assert not thr.is_alive() | ||||
# Test 4: test that introducing a new transaction into the mempool will | # Test 4: test that introducing a new transaction into the mempool will | ||||
# terminate the longpoll | # terminate the longpoll | ||||
thr = LongpollThread(self.nodes[0]) | thr = LongpollThread(self.nodes[0]) | ||||
thr.start() | thr.start() | ||||
# generate a random transaction and submit it | # generate a random transaction and submit it | ||||
min_relay_fee = self.nodes[0].getnetworkinfo()["relayfee"] | min_relay_fee = self.nodes[0].getnetworkinfo()["relayfee"] | ||||
# min_relay_fee is fee per 1000 bytes, which should be more than enough. | # min_relay_fee is fee per 1000 bytes, which should be more than enough. | ||||
(txid, txhex, fee) = random_transaction(self.nodes, | (txid, txhex, fee) = random_transaction(self.nodes, | ||||
Decimal("1.1"), min_relay_fee, Decimal("0.001"), 20) | Decimal("1.1"), min_relay_fee, Decimal("0.001"), 20) | ||||
# after one minute, every 10 seconds the mempool is probed, so in 80 | # after one minute, every 10 seconds the mempool is probed, so in 80 | ||||
# seconds it should have returned | # seconds it should have returned | ||||
thr.join(60 + 20) | thr.join(60 + 20) | ||||
assert(not thr.is_alive()) | assert not thr.is_alive() | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
GetBlockTemplateLPTest().main() | GetBlockTemplateLPTest().main() |