Replace cookie auth in tests

Since rpcuser and rpcpassword are now deprecated, replace them with cookie auth.

Fix test failures with cookie auth
This commit is contained in:
Andrew Chow 2017-06-05 10:50:25 -07:00
parent 9fec4da0be
commit c53c9831ee
3 changed files with 43 additions and 21 deletions

View file

@ -1486,7 +1486,7 @@ class SegWitTest(BitcoinTestFramework):
# nodes would have stored, this requires special handling. # nodes would have stored, this requires special handling.
# To enable this test, pass --oldbinary=<path-to-pre-segwit-bitcoind> to # To enable this test, pass --oldbinary=<path-to-pre-segwit-bitcoind> to
# the test. # the test.
def test_upgrade_after_activation(self, node, node_id): def test_upgrade_after_activation(self, node_id):
self.log.info("Testing software upgrade after softfork activation") self.log.info("Testing software upgrade after softfork activation")
assert(node_id != 0) # node0 is assumed to be a segwit-active bitcoind assert(node_id != 0) # node0 is assumed to be a segwit-active bitcoind
@ -1502,14 +1502,14 @@ class SegWitTest(BitcoinTestFramework):
sync_blocks(self.nodes) sync_blocks(self.nodes)
# Make sure that this peer thinks segwit has activated. # Make sure that this peer thinks segwit has activated.
assert(get_bip9_status(node, 'segwit')['status'] == "active") assert(get_bip9_status(self.nodes[node_id], 'segwit')['status'] == "active")
# Make sure this peers blocks match those of node0. # Make sure this peers blocks match those of node0.
height = node.getblockcount() height = self.nodes[node_id].getblockcount()
while height >= 0: while height >= 0:
block_hash = node.getblockhash(height) block_hash = self.nodes[node_id].getblockhash(height)
assert_equal(block_hash, self.nodes[0].getblockhash(height)) assert_equal(block_hash, self.nodes[0].getblockhash(height))
assert_equal(self.nodes[0].getblock(block_hash), node.getblock(block_hash)) assert_equal(self.nodes[0].getblock(block_hash), self.nodes[node_id].getblock(block_hash))
height -= 1 height -= 1
@ -1944,7 +1944,7 @@ class SegWitTest(BitcoinTestFramework):
self.test_signature_version_1() self.test_signature_version_1()
self.test_non_standard_witness() self.test_non_standard_witness()
sync_blocks(self.nodes) sync_blocks(self.nodes)
self.test_upgrade_after_activation(self.nodes[2], 2) self.test_upgrade_after_activation(2)
self.test_witness_sigops() self.test_witness_sigops()

View file

@ -28,6 +28,7 @@ from .util import (
get_mocktime, get_mocktime,
get_rpc_proxy, get_rpc_proxy,
initialize_datadir, initialize_datadir,
get_datadir_path,
log_filename, log_filename,
p2p_port, p2p_port,
rpc_url, rpc_url,
@ -300,13 +301,13 @@ class BitcoinTestFramework(object):
args.append("-connect=127.0.0.1:" + str(p2p_port(0))) args.append("-connect=127.0.0.1:" + str(p2p_port(0)))
bitcoind_processes[i] = subprocess.Popen(args) bitcoind_processes[i] = subprocess.Popen(args)
self.log.debug("initialize_chain: bitcoind started, waiting for RPC to come up") self.log.debug("initialize_chain: bitcoind started, waiting for RPC to come up")
wait_for_bitcoind_start(bitcoind_processes[i], rpc_url(i), i) wait_for_bitcoind_start(bitcoind_processes[i], datadir, i)
self.log.debug("initialize_chain: RPC successfully started") self.log.debug("initialize_chain: RPC successfully started")
self.nodes = [] self.nodes = []
for i in range(MAX_NODES): for i in range(MAX_NODES):
try: try:
self.nodes.append(get_rpc_proxy(rpc_url(i), i)) self.nodes.append(get_rpc_proxy(rpc_url(get_datadir_path(cachedir, i), i), i))
except: except:
self.log.exception("Error connecting to node %d" % i) self.log.exception("Error connecting to node %d" % i)
sys.exit(1) sys.exit(1)

View file

@ -181,21 +181,39 @@ def initialize_datadir(dirname, n):
datadir = os.path.join(dirname, "node"+str(n)) datadir = os.path.join(dirname, "node"+str(n))
if not os.path.isdir(datadir): if not os.path.isdir(datadir):
os.makedirs(datadir) os.makedirs(datadir)
rpc_u, rpc_p = rpc_auth_pair(n)
with open(os.path.join(datadir, "bitcoin.conf"), 'w', encoding='utf8') as f: with open(os.path.join(datadir, "bitcoin.conf"), 'w', encoding='utf8') as f:
f.write("regtest=1\n") f.write("regtest=1\n")
f.write("rpcuser=" + rpc_u + "\n")
f.write("rpcpassword=" + rpc_p + "\n")
f.write("port="+str(p2p_port(n))+"\n") f.write("port="+str(p2p_port(n))+"\n")
f.write("rpcport="+str(rpc_port(n))+"\n") f.write("rpcport="+str(rpc_port(n))+"\n")
f.write("listenonion=0\n") f.write("listenonion=0\n")
return datadir return datadir
def get_datadir_path(dirname, n):
return os.path.join(dirname, "node"+str(n))
def get_auth_cookie(datadir, n):
if os.path.isfile(os.path.join(datadir, "regtest", ".cookie")):
with open(os.path.join(datadir, "regtest", ".cookie"), 'r') as f:
userpass = f.read()
split_userpass = userpass.split(':')
return split_userpass[0], split_userpass[1]
else:
with open(os.path.join(datadir, "bitcoin.conf"), 'r') as f:
user = None
password = None
for line in f:
if line.startswith("rpcuser="):
assert user is None # Ensure that there is only one rpcuser line
user = line.split("=")[1].strip("\n")
if line.startswith("rpcpassword="):
assert password is None # Ensure that there is only one rpcpassword line
password = line.split("=")[1].strip("\n")
if user is None and password is None:
raise ValueError("No RPC credentials")
return user, password
def rpc_auth_pair(n): def rpc_url(datadir, i, rpchost=None):
return 'rpcuser💻' + str(n), 'rpcpass🔑' + str(n) rpc_u, rpc_p = get_auth_cookie(datadir, i)
def rpc_url(i, rpchost=None):
rpc_u, rpc_p = rpc_auth_pair(i)
host = '127.0.0.1' host = '127.0.0.1'
port = rpc_port(i) port = rpc_port(i)
if rpchost: if rpchost:
@ -206,7 +224,7 @@ def rpc_url(i, rpchost=None):
host = rpchost host = rpchost
return "http://%s:%s@%s:%d" % (rpc_u, rpc_p, host, int(port)) return "http://%s:%s@%s:%d" % (rpc_u, rpc_p, host, int(port))
def wait_for_bitcoind_start(process, url, i): def wait_for_bitcoind_start(process, datadir, i):
''' '''
Wait for bitcoind to start. This means that RPC is accessible and fully initialized. Wait for bitcoind to start. This means that RPC is accessible and fully initialized.
Raise an exception if bitcoind exits during initialization. Raise an exception if bitcoind exits during initialization.
@ -215,7 +233,8 @@ def wait_for_bitcoind_start(process, url, i):
if process.poll() is not None: if process.poll() is not None:
raise Exception('bitcoind exited with status %i during initialization' % process.returncode) raise Exception('bitcoind exited with status %i during initialization' % process.returncode)
try: try:
rpc = get_rpc_proxy(url, i) # Check if .cookie file to be created
rpc = get_rpc_proxy(rpc_url(datadir, i), i)
blocks = rpc.getblockcount() blocks = rpc.getblockcount()
break # break out of loop on success break # break out of loop on success
except IOError as e: except IOError as e:
@ -224,6 +243,9 @@ def wait_for_bitcoind_start(process, url, i):
except JSONRPCException as e: # Initialization phase except JSONRPCException as e: # Initialization phase
if e.error['code'] != -28: # RPC in warmup? if e.error['code'] != -28: # RPC in warmup?
raise # unknown JSON RPC exception raise # unknown JSON RPC exception
except ValueError as e: # cookie file not found and no rpcuser or rpcassword. bitcoind still starting
if "No RPC credentials" not in str(e):
raise
time.sleep(0.25) time.sleep(0.25)
@ -239,10 +261,9 @@ def _start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary
if extra_args is not None: args.extend(extra_args) if extra_args is not None: args.extend(extra_args)
bitcoind_processes[i] = subprocess.Popen(args, stderr=stderr) bitcoind_processes[i] = subprocess.Popen(args, stderr=stderr)
logger.debug("initialize_chain: bitcoind started, waiting for RPC to come up") logger.debug("initialize_chain: bitcoind started, waiting for RPC to come up")
url = rpc_url(i, rpchost) wait_for_bitcoind_start(bitcoind_processes[i], datadir, i)
wait_for_bitcoind_start(bitcoind_processes[i], url, i)
logger.debug("initialize_chain: RPC successfully started") logger.debug("initialize_chain: RPC successfully started")
proxy = get_rpc_proxy(url, i, timeout=timewait) proxy = get_rpc_proxy(rpc_url(datadir, i, rpchost), i, timeout=timewait)
if COVERAGE_DIR: if COVERAGE_DIR:
coverage.write_all_rpc_commands(COVERAGE_DIR, proxy) coverage.write_all_rpc_commands(COVERAGE_DIR, proxy)