Merge #12853: qa: Match full plain text by default
faace13868
qa: Match full plain text by default (MarcoFalke)
Pull request description:
Instead of escaping all full plain text error strings, just compare their strings by default.
Tree-SHA512: 42e28f55105eb947ac6af6ce4056f0ec0f701d85f1c2a38b35ab777bbdf2296bdb79639c345621b8adc03a98b28c7630ded9a67b8b04a48e2c3a49d598ecdcd7
This commit is contained in:
commit
2106c4c64c
6 changed files with 29 additions and 18 deletions
|
@ -6,7 +6,6 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework, initialize_datadir
|
from test_framework.test_framework import BitcoinTestFramework, initialize_datadir
|
||||||
|
@ -23,7 +22,7 @@ class BlocksdirTest(BitcoinTestFramework):
|
||||||
initialize_datadir(self.options.tmpdir, 0)
|
initialize_datadir(self.options.tmpdir, 0)
|
||||||
self.log.info("Starting with non exiting blocksdir ...")
|
self.log.info("Starting with non exiting blocksdir ...")
|
||||||
blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir')
|
blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir')
|
||||||
self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], re.escape('Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path)))
|
self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], 'Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path))
|
||||||
os.mkdir(blocksdir_path)
|
os.mkdir(blocksdir_path)
|
||||||
self.log.info("Starting with exiting blocksdir ...")
|
self.log.info("Starting with exiting blocksdir ...")
|
||||||
self.start_node(0, ["-blocksdir=" + blocksdir_path])
|
self.start_node(0, ["-blocksdir=" + blocksdir_path])
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
"""Test various command line arguments and configuration file parameters."""
|
"""Test various command line arguments and configuration file parameters."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
|
||||||
|
@ -26,13 +25,13 @@ class ConfArgsTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Check that using -datadir argument on non-existent directory fails
|
# Check that using -datadir argument on non-existent directory fails
|
||||||
self.nodes[0].datadir = new_data_dir
|
self.nodes[0].datadir = new_data_dir
|
||||||
self.nodes[0].assert_start_raises_init_error(['-datadir=' + new_data_dir], 'Error: Specified data directory "' + re.escape(new_data_dir) + '" does not exist.')
|
self.nodes[0].assert_start_raises_init_error(['-datadir=' + new_data_dir], 'Error: Specified data directory "' + new_data_dir + '" does not exist.')
|
||||||
|
|
||||||
# Check that using non-existent datadir in conf file fails
|
# Check that using non-existent datadir in conf file fails
|
||||||
conf_file = os.path.join(default_data_dir, "bitcoin.conf")
|
conf_file = os.path.join(default_data_dir, "bitcoin.conf")
|
||||||
with open(conf_file, 'a', encoding='utf8') as f:
|
with open(conf_file, 'a', encoding='utf8') as f:
|
||||||
f.write("datadir=" + new_data_dir + "\n")
|
f.write("datadir=" + new_data_dir + "\n")
|
||||||
self.nodes[0].assert_start_raises_init_error(['-conf=' + conf_file], 'Error reading configuration file: specified data directory "' + re.escape(new_data_dir) + '" does not exist.')
|
self.nodes[0].assert_start_raises_init_error(['-conf=' + conf_file], 'Error reading configuration file: specified data directory "' + new_data_dir + '" does not exist.')
|
||||||
|
|
||||||
# Create the directory and ensure the config file now works
|
# Create the directory and ensure the config file now works
|
||||||
os.mkdir(new_data_dir)
|
os.mkdir(new_data_dir)
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.test_node import ErrorMatch
|
||||||
|
|
||||||
|
|
||||||
class LoggingTest(BitcoinTestFramework):
|
class LoggingTest(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
|
@ -31,7 +33,7 @@ class LoggingTest(BitcoinTestFramework):
|
||||||
invalidname = os.path.join("foo", "foo.log")
|
invalidname = os.path.join("foo", "foo.log")
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
exp_stderr = "Error: Could not open debug log file \S+$"
|
exp_stderr = "Error: Could not open debug log file \S+$"
|
||||||
self.nodes[0].assert_start_raises_init_error(["-debuglogfile=%s" % (invalidname)], exp_stderr)
|
self.nodes[0].assert_start_raises_init_error(["-debuglogfile=%s" % (invalidname)], exp_stderr, match=ErrorMatch.FULL_REGEX)
|
||||||
assert not os.path.isfile(os.path.join(invdir, "foo.log"))
|
assert not os.path.isfile(os.path.join(invdir, "foo.log"))
|
||||||
|
|
||||||
# check that invalid log (relative) works after path exists
|
# check that invalid log (relative) works after path exists
|
||||||
|
@ -44,7 +46,7 @@ class LoggingTest(BitcoinTestFramework):
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
invdir = os.path.join(self.options.tmpdir, "foo")
|
invdir = os.path.join(self.options.tmpdir, "foo")
|
||||||
invalidname = os.path.join(invdir, "foo.log")
|
invalidname = os.path.join(invdir, "foo.log")
|
||||||
self.nodes[0].assert_start_raises_init_error(["-debuglogfile=%s" % invalidname], exp_stderr)
|
self.nodes[0].assert_start_raises_init_error(["-debuglogfile=%s" % invalidname], exp_stderr, match=ErrorMatch.FULL_REGEX)
|
||||||
assert not os.path.isfile(os.path.join(invdir, "foo.log"))
|
assert not os.path.isfile(os.path.join(invdir, "foo.log"))
|
||||||
|
|
||||||
# check that invalid log (absolute) works after path exists
|
# check that invalid log (absolute) works after path exists
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.test_node import ErrorMatch
|
||||||
from test_framework.util import assert_equal
|
from test_framework.util import assert_equal
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,12 +28,12 @@ class UacommentTest(BitcoinTestFramework):
|
||||||
self.log.info("test -uacomment max length")
|
self.log.info("test -uacomment max length")
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
expected = "Error: Total length of network version string \([0-9]+\) exceeds maximum length \(256\). Reduce the number or size of uacomments."
|
expected = "Error: Total length of network version string \([0-9]+\) exceeds maximum length \(256\). Reduce the number or size of uacomments."
|
||||||
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + 'a' * 256], expected)
|
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + 'a' * 256], expected, match=ErrorMatch.FULL_REGEX)
|
||||||
|
|
||||||
self.log.info("test -uacomment unsafe characters")
|
self.log.info("test -uacomment unsafe characters")
|
||||||
for unsafe_char in ['/', ':', '(', ')']:
|
for unsafe_char in ['/', ':', '(', ')']:
|
||||||
expected = "Error: User Agent comment \(" + re.escape(unsafe_char) + "\) contains unsafe characters."
|
expected = "Error: User Agent comment \(" + re.escape(unsafe_char) + "\) contains unsafe characters."
|
||||||
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + unsafe_char], expected)
|
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + unsafe_char], expected, match=ErrorMatch.FULL_REGEX)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
import decimal
|
import decimal
|
||||||
import errno
|
import errno
|
||||||
|
from enum import Enum
|
||||||
import http.client
|
import http.client
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
@ -35,6 +36,12 @@ class FailedToStartError(Exception):
|
||||||
"""Raised when a node fails to start correctly."""
|
"""Raised when a node fails to start correctly."""
|
||||||
|
|
||||||
|
|
||||||
|
class ErrorMatch(Enum):
|
||||||
|
FULL_TEXT = 1
|
||||||
|
FULL_REGEX = 2
|
||||||
|
PARTIAL_REGEX = 3
|
||||||
|
|
||||||
|
|
||||||
class TestNode():
|
class TestNode():
|
||||||
"""A class for representing a bitcoind node under test.
|
"""A class for representing a bitcoind node under test.
|
||||||
|
|
||||||
|
@ -172,7 +179,7 @@ class TestNode():
|
||||||
def wait_until_stopped(self, timeout=BITCOIND_PROC_WAIT_TIMEOUT):
|
def wait_until_stopped(self, timeout=BITCOIND_PROC_WAIT_TIMEOUT):
|
||||||
wait_until(self.is_node_stopped, timeout=timeout)
|
wait_until(self.is_node_stopped, timeout=timeout)
|
||||||
|
|
||||||
def assert_start_raises_init_error(self, extra_args=None, expected_msg=None, partial_match=False, *args, **kwargs):
|
def assert_start_raises_init_error(self, extra_args=None, expected_msg=None, match=ErrorMatch.FULL_TEXT, *args, **kwargs):
|
||||||
"""Attempt to start the node and expect it to raise an error.
|
"""Attempt to start the node and expect it to raise an error.
|
||||||
|
|
||||||
extra_args: extra arguments to pass through to bitcoind
|
extra_args: extra arguments to pass through to bitcoind
|
||||||
|
@ -194,12 +201,15 @@ class TestNode():
|
||||||
if expected_msg is not None:
|
if expected_msg is not None:
|
||||||
log_stderr.seek(0)
|
log_stderr.seek(0)
|
||||||
stderr = log_stderr.read().decode('utf-8').strip()
|
stderr = log_stderr.read().decode('utf-8').strip()
|
||||||
if partial_match:
|
if match == ErrorMatch.PARTIAL_REGEX:
|
||||||
if re.search(expected_msg, stderr, flags=re.MULTILINE) is None:
|
if re.search(expected_msg, stderr, flags=re.MULTILINE) is None:
|
||||||
raise AssertionError('Expected message "{}" does not partially match stderr:\n"{}"'.format(expected_msg, stderr))
|
raise AssertionError('Expected message "{}" does not partially match stderr:\n"{}"'.format(expected_msg, stderr))
|
||||||
else:
|
elif match == ErrorMatch.FULL_REGEX:
|
||||||
if re.fullmatch(expected_msg, stderr) is None:
|
if re.fullmatch(expected_msg, stderr) is None:
|
||||||
raise AssertionError('Expected message "{}" does not fully match stderr:\n"{}"'.format(expected_msg, stderr))
|
raise AssertionError('Expected message "{}" does not fully match stderr:\n"{}"'.format(expected_msg, stderr))
|
||||||
|
elif match == ErrorMatch.FULL_TEXT:
|
||||||
|
if expected_msg != stderr:
|
||||||
|
raise AssertionError('Expected message "{}" does not fully match stderr:\n"{}"'.format(expected_msg, stderr))
|
||||||
else:
|
else:
|
||||||
if expected_msg is None:
|
if expected_msg is None:
|
||||||
assert_msg = "bitcoind should have exited with an error"
|
assert_msg = "bitcoind should have exited with an error"
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
Verify that a bitcoind node can load multiple wallet files
|
Verify that a bitcoind node can load multiple wallet files
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.test_node import ErrorMatch
|
||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
assert_raises_rpc_error,
|
assert_raises_rpc_error,
|
||||||
|
@ -66,7 +66,7 @@ class MultiWalletTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# should not initialize if wallet path can't be created
|
# should not initialize if wallet path can't be created
|
||||||
exp_stderr = "boost::filesystem::create_directory: (The system cannot find the path specified|Not a directory):"
|
exp_stderr = "boost::filesystem::create_directory: (The system cannot find the path specified|Not a directory):"
|
||||||
self.nodes[0].assert_start_raises_init_error(['-wallet=wallet.dat/bad'], exp_stderr, partial_match=True)
|
self.nodes[0].assert_start_raises_init_error(['-wallet=wallet.dat/bad'], exp_stderr, match=ErrorMatch.PARTIAL_REGEX)
|
||||||
|
|
||||||
self.nodes[0].assert_start_raises_init_error(['-walletdir=wallets'], 'Error: Specified -walletdir "wallets" does not exist')
|
self.nodes[0].assert_start_raises_init_error(['-walletdir=wallets'], 'Error: Specified -walletdir "wallets" does not exist')
|
||||||
self.nodes[0].assert_start_raises_init_error(['-walletdir=wallets'], 'Error: Specified -walletdir "wallets" is a relative path', cwd=data_dir())
|
self.nodes[0].assert_start_raises_init_error(['-walletdir=wallets'], 'Error: Specified -walletdir "wallets" is a relative path', cwd=data_dir())
|
||||||
|
@ -78,18 +78,18 @@ class MultiWalletTest(BitcoinTestFramework):
|
||||||
# should not initialize if one wallet is a copy of another
|
# should not initialize if one wallet is a copy of another
|
||||||
shutil.copyfile(wallet_dir('w8'), wallet_dir('w8_copy'))
|
shutil.copyfile(wallet_dir('w8'), wallet_dir('w8_copy'))
|
||||||
exp_stderr = "CDB: Can't open database w8_copy \(duplicates fileid \w+ from w8\)"
|
exp_stderr = "CDB: Can't open database w8_copy \(duplicates fileid \w+ from w8\)"
|
||||||
self.nodes[0].assert_start_raises_init_error(['-wallet=w8', '-wallet=w8_copy'], exp_stderr, partial_match=True)
|
self.nodes[0].assert_start_raises_init_error(['-wallet=w8', '-wallet=w8_copy'], exp_stderr, match=ErrorMatch.PARTIAL_REGEX)
|
||||||
|
|
||||||
# should not initialize if wallet file is a symlink
|
# should not initialize if wallet file is a symlink
|
||||||
os.symlink('w8', wallet_dir('w8_symlink'))
|
os.symlink('w8', wallet_dir('w8_symlink'))
|
||||||
self.nodes[0].assert_start_raises_init_error(['-wallet=w8_symlink'], 'Error: Invalid -wallet path \'w8_symlink\'\. .*')
|
self.nodes[0].assert_start_raises_init_error(['-wallet=w8_symlink'], 'Error: Invalid -wallet path \'w8_symlink\'\. .*', match=ErrorMatch.FULL_REGEX)
|
||||||
|
|
||||||
# should not initialize if the specified walletdir does not exist
|
# should not initialize if the specified walletdir does not exist
|
||||||
self.nodes[0].assert_start_raises_init_error(['-walletdir=bad'], 'Error: Specified -walletdir "bad" does not exist')
|
self.nodes[0].assert_start_raises_init_error(['-walletdir=bad'], 'Error: Specified -walletdir "bad" does not exist')
|
||||||
# should not initialize if the specified walletdir is not a directory
|
# should not initialize if the specified walletdir is not a directory
|
||||||
not_a_dir = wallet_dir('notadir')
|
not_a_dir = wallet_dir('notadir')
|
||||||
open(not_a_dir, 'a').close()
|
open(not_a_dir, 'a').close()
|
||||||
self.nodes[0].assert_start_raises_init_error(['-walletdir=' + not_a_dir], 'Error: Specified -walletdir "' + re.escape(not_a_dir) + '" is not a directory')
|
self.nodes[0].assert_start_raises_init_error(['-walletdir=' + not_a_dir], 'Error: Specified -walletdir "' + not_a_dir + '" is not a directory')
|
||||||
|
|
||||||
# if wallets/ doesn't exist, datadir should be the default wallet dir
|
# if wallets/ doesn't exist, datadir should be the default wallet dir
|
||||||
wallet_dir2 = data_dir('walletdir')
|
wallet_dir2 = data_dir('walletdir')
|
||||||
|
@ -111,7 +111,7 @@ class MultiWalletTest(BitcoinTestFramework):
|
||||||
os.mkdir(competing_wallet_dir)
|
os.mkdir(competing_wallet_dir)
|
||||||
self.restart_node(0, ['-walletdir=' + competing_wallet_dir])
|
self.restart_node(0, ['-walletdir=' + competing_wallet_dir])
|
||||||
exp_stderr = "Error: Error initializing wallet database environment \"\S+competing_walletdir\"!"
|
exp_stderr = "Error: Error initializing wallet database environment \"\S+competing_walletdir\"!"
|
||||||
self.nodes[1].assert_start_raises_init_error(['-walletdir=' + competing_wallet_dir], exp_stderr, partial_match=True)
|
self.nodes[1].assert_start_raises_init_error(['-walletdir=' + competing_wallet_dir], exp_stderr, match=ErrorMatch.PARTIAL_REGEX)
|
||||||
|
|
||||||
self.restart_node(0, extra_args)
|
self.restart_node(0, extra_args)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue