Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: hoist p2p values to test framework constants
Browse files Browse the repository at this point in the history
jonatack committed Jun 14, 2020
1 parent 8964119 commit bc42270
Showing 3 changed files with 17 additions and 8 deletions.
17 changes: 11 additions & 6 deletions test/functional/p2p_invalid_messages.py
Original file line number Diff line number Diff line change
@@ -6,6 +6,9 @@
from test_framework.messages import (
CBlockHeader,
CInv,
MAX_HEADERS_RESULTS,
MAX_INV_SIZE,
MAX_PROTOCOL_MESSAGE_LENGTH,
msg_getdata,
msg_headers,
msg_inv,
@@ -18,8 +21,7 @@
)
from test_framework.test_framework import BitcoinTestFramework

MSG_LIMIT = 4 * 1000 * 1000 # 4MB, per MAX_PROTOCOL_MESSAGE_LENGTH
VALID_DATA_LIMIT = MSG_LIMIT - 5 # Account for the 5-byte length prefix
VALID_DATA_LIMIT = MAX_PROTOCOL_MESSAGE_LENGTH - 5 # Account for the 5-byte length prefix

class msg_unrecognized:
"""Nonsensical message. Modeled after similar types in test_framework.messages."""
@@ -106,20 +108,23 @@ def test_oversized(self, msg_type, msg, size):
self.nodes[0].disconnect_p2ps()

def test_oversized_inv(self):
self.test_oversized('inv', msg_inv([CInv(MSG_TX, 1)] * 50001), 50001)
size = MAX_INV_SIZE + 1
self.test_oversized('inv', msg_inv([CInv(MSG_TX, 1)] * size), size)

def test_oversized_getdata(self):
self.test_oversized('getdata', msg_getdata([CInv(MSG_TX, 1)] * 50001), 50001)
size = MAX_INV_SIZE + 1
self.test_oversized('getdata', msg_getdata([CInv(MSG_TX, 1)] * size), size)

def test_oversized_headers(self):
self.test_oversized('headers', msg_headers([CBlockHeader()] * 2001), 2001)
size = MAX_HEADERS_RESULTS + 1
self.test_oversized('headers', msg_headers([CBlockHeader()] * size), size)

def test_resource_exhaustion(self):
self.log.info("Test serving many large junk messages")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
conn2 = self.nodes[0].add_p2p_connection(P2PDataStore())
msg_at_size = msg_unrecognized(str_data="b" * VALID_DATA_LIMIT)
assert len(msg_at_size.serialize()) == MSG_LIMIT
assert len(msg_at_size.serialize()) == MAX_PROTOCOL_MESSAGE_LENGTH

self.log.info("(a) Send 80 messages of max data size 4MB to test for memory exhaustion")
for _ in range(80):
4 changes: 4 additions & 0 deletions test/functional/test_framework/messages.py
Original file line number Diff line number Diff line change
@@ -45,6 +45,10 @@

BIP125_SEQUENCE_NUMBER = 0xfffffffd # Sequence number that is BIP 125 opt-in and BIP 68-opt-out

MAX_PROTOCOL_MESSAGE_LENGTH = 4000000 # Maximum length of incoming protocol messages
MAX_HEADERS_RESULTS = 2000 # Number of headers sent in one getheaders result
MAX_INV_SIZE = 50000 # Maximum number of entries in an 'inv' protocol message

NODE_NETWORK = (1 << 0)
NODE_GETUTXO = (1 << 1)
NODE_BLOOM = (1 << 2)
4 changes: 2 additions & 2 deletions test/functional/test_framework/mininode.py
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@

from test_framework.messages import (
CBlockHeader,
MAX_HEADERS_RESULTS,
MIN_VERSION_SUPPORTED,
msg_addr,
msg_block,
@@ -553,7 +554,6 @@ def on_getheaders(self, message):
return

headers_list = [self.block_store[self.last_block_hash]]
maxheaders = 2000
while headers_list[-1].sha256 not in locator.vHave:
# Walk back through the block store, adding headers to headers_list
# as we go.
@@ -569,7 +569,7 @@ def on_getheaders(self, message):
break

# Truncate the list if there are too many headers
headers_list = headers_list[:-maxheaders - 1:-1]
headers_list = headers_list[:-MAX_HEADERS_RESULTS - 1:-1]
response = msg_headers(headers_list)

if response is not None:

0 comments on commit bc42270

Please sign in to comment.