Skip to content

Commit

Permalink
Create SingleNodeConnCB class for RPC tests
Browse files Browse the repository at this point in the history
  • Loading branch information
morcos committed Mar 21, 2016
1 parent 9e072a6 commit 5fa66e4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 15 deletions.
1 change: 0 additions & 1 deletion qa/rpc-tests/maxuploadtarget.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from test_framework.mininode import *
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import *
from test_framework.comptool import wait_until
import time

'''
Expand Down
14 changes: 0 additions & 14 deletions qa/rpc-tests/test_framework/comptool.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,6 @@

global mininode_lock

def wait_until(predicate, attempts=float('inf'), timeout=float('inf')):
attempt = 0
elapsed = 0

while attempt < attempts and elapsed < timeout:
with mininode_lock:
if predicate():
return True
attempt += 1
elapsed += 0.05
time.sleep(0.05)

return False

class RejectResult(object):
'''
Outcome that expects rejection of a transaction or block.
Expand Down
40 changes: 40 additions & 0 deletions qa/rpc-tests/test_framework/mininode.py
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,20 @@ def __repr__(self):
return "msg_reject: %s %d %s [%064x]" \
% (self.message, self.code, self.reason, self.data)

# Helper function
def wait_until(predicate, attempts=float('inf'), timeout=float('inf')):
attempt = 0
elapsed = 0

while attempt < attempts and elapsed < timeout:
with mininode_lock:
if predicate():
return True
attempt += 1
elapsed += 0.05
time.sleep(0.05)

return False

# This is what a callback should look like for NodeConn
# Reimplement the on_* functions to provide handling for events
Expand Down Expand Up @@ -1085,6 +1099,32 @@ def on_close(self, conn): pass
def on_mempool(self, conn): pass
def on_pong(self, conn, message): pass

# More useful callbacks and functions for NodeConnCB's which have a single NodeConn
class SingleNodeConnCB(NodeConnCB):
def __init__(self):
NodeConnCB.__init__(self)
self.connection = None
self.ping_counter = 1
self.last_pong = msg_pong()

def add_connection(self, conn):
self.connection = conn

# 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

# Sync up with the node
def sync_with_ping(self, timeout=30):
def received_pong():
return (self.last_pong.nonce == self.ping_counter)
self.send_message(msg_ping(nonce=self.ping_counter))
success = wait_until(received_pong, timeout)
self.ping_counter += 1
return success

# The actual NodeConn class
# This class provides an interface for a p2p connection to a specified node
Expand Down

0 comments on commit 5fa66e4

Please sign in to comment.