Jonas Schnelli
9 years ago
1 changed files with 99 additions and 0 deletions
@ -0,0 +1,99 @@
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env python3 |
||||
# Copyright (c) 2015-2016 The Bitcoin Core developers |
||||
# Distributed under the MIT software license, see the accompanying |
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
||||
from test_framework.mininode import * |
||||
from test_framework.test_framework import BitcoinTestFramework |
||||
from test_framework.util import * |
||||
import time |
||||
|
||||
class TestNode(NodeConnCB): |
||||
def __init__(self): |
||||
NodeConnCB.__init__(self) |
||||
self.connection = None |
||||
self.ping_counter = 1 |
||||
self.last_pong = msg_pong() |
||||
self.block_receive_map = {} |
||||
|
||||
def add_connection(self, conn): |
||||
self.connection = conn |
||||
self.peer_disconnected = False |
||||
|
||||
def on_inv(self, conn, message): |
||||
pass |
||||
|
||||
# Track the last getdata message we receive (used in the test) |
||||
def on_getdata(self, conn, message): |
||||
self.last_getdata = message |
||||
|
||||
def on_block(self, conn, message): |
||||
message.block.calc_sha256() |
||||
try: |
||||
self.block_receive_map[message.block.sha256] += 1 |
||||
except KeyError as e: |
||||
self.block_receive_map[message.block.sha256] = 1 |
||||
|
||||
# Spin until verack message is received from the node. |
||||
# We use this to signal that our test can begin. This |
||||
# is called from the testing thread, so it needs to acquire |
||||
# the global lock. |
||||
def wait_for_verack(self): |
||||
def veracked(): |
||||
return self.verack_received |
||||
return wait_until(veracked, timeout=10) |
||||
|
||||
def wait_for_disconnect(self): |
||||
def disconnected(): |
||||
return self.peer_disconnected |
||||
return wait_until(disconnected, timeout=10) |
||||
|
||||
# Wrapper for the NodeConn's send_message function |
||||
def send_message(self, message): |
||||
self.connection.send_message(message) |
||||
|
||||
def on_pong(self, conn, message): |
||||
self.last_pong = message |
||||
|
||||
def on_close(self, conn): |
||||
self.peer_disconnected = True |
||||
|
||||
# Sync up with the node after delivery of a block |
||||
def sync_with_ping(self, timeout=30): |
||||
def received_pong(): |
||||
return (self.last_pong.nonce == self.ping_counter) |
||||
self.connection.send_message(msg_ping(nonce=self.ping_counter)) |
||||
success = wait_until(received_pong, timeout) |
||||
self.ping_counter += 1 |
||||
return success |
||||
|
||||
def send_mempool(self): |
||||
self.lastInv = [] |
||||
self.send_message(msg_mempool()) |
||||
|
||||
class P2PMempoolTests(BitcoinTestFramework): |
||||
def setup_chain(self): |
||||
initialize_chain_clean(self.options.tmpdir, 2) |
||||
|
||||
def setup_network(self): |
||||
# Start a node with maxuploadtarget of 200 MB (/24h) |
||||
self.nodes = [] |
||||
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug", "-peerbloomfilters=0"])) |
||||
|
||||
def run_test(self): |
||||
#connect a mininode |
||||
aTestNode = TestNode() |
||||
node = NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], aTestNode) |
||||
aTestNode.add_connection(node) |
||||
NetworkThread().start() |
||||
aTestNode.wait_for_verack() |
||||
|
||||
#request mempool |
||||
aTestNode.send_mempool() |
||||
aTestNode.wait_for_disconnect() |
||||
|
||||
#mininode must be disconnected at this point |
||||
assert_equal(len(self.nodes[0].getpeerinfo()), 0) |
||||
|
||||
if __name__ == '__main__': |
||||
P2PMempoolTests().main() |
Loading…
Reference in new issue