Browse Source

test-fixtures: return error set, don't throw exception

Throwing an exception while killing all nodes meant that
we aren't cleaning up all the nodes properly. Instead,
collect the errors, and return them back to the upper level,
where we report them and terminate as expected.
pull/2803/head
lisa neigut 6 years ago
committed by Rusty Russell
parent
commit
df1d92a7a2
  1. 6
      tests/fixtures.py
  2. 6
      tests/utils.py

6
tests/fixtures.py

@ -109,7 +109,7 @@ def node_factory(request, directory, test_name, bitcoind, executor):
nf = NodeFactory(test_name, bitcoind, executor, directory=directory) nf = NodeFactory(test_name, bitcoind, executor, directory=directory)
yield nf yield nf
err_count = 0 err_count = 0
ok = nf.killall([not n.may_fail for n in nf.nodes]) ok, errs = nf.killall([not n.may_fail for n in nf.nodes])
def check_errors(request, err_count, msg): def check_errors(request, err_count, msg):
"""Just a simple helper to format a message, set flags on request and then raise """Just a simple helper to format a message, set flags on request and then raise
@ -147,7 +147,7 @@ def node_factory(request, directory, test_name, bitcoind, executor):
for node in nf.nodes: for node in nf.nodes:
err_count += checkMemleak(node) err_count += checkMemleak(node)
if err_count: if err_count:
raise ValueError("{} nodes had memleak messages".format(err_count)) raise ValueError("{} nodes had memleak messages \n{}".format(err_count, '\n'.join(errs)))
for node in [n for n in nf.nodes if not n.allow_broken_log]: for node in [n for n in nf.nodes if not n.allow_broken_log]:
err_count += checkBroken(node) err_count += checkBroken(node)
@ -155,7 +155,7 @@ def node_factory(request, directory, test_name, bitcoind, executor):
if not ok: if not ok:
request.node.has_errors = True request.node.has_errors = True
raise Exception("At least one lightning exited with unexpected non-zero return code") raise Exception("At least one lightning node exited with unexpected non-zero return code\n Recorded errors: {}".format('\n'.join(errs)))
def getValgrindErrors(node): def getValgrindErrors(node):

6
tests/utils.py

@ -967,6 +967,7 @@ class NodeFactory(object):
def killall(self, expected_successes): def killall(self, expected_successes):
"""Returns true if every node we expected to succeed actually succeeded""" """Returns true if every node we expected to succeed actually succeeded"""
unexpected_fail = False unexpected_fail = False
err_msgs = []
for i in range(len(self.nodes)): for i in range(len(self.nodes)):
leaks = None leaks = None
# leak detection upsets VALGRIND by reading uninitialized mem. # leak detection upsets VALGRIND by reading uninitialized mem.
@ -985,9 +986,10 @@ class NodeFactory(object):
unexpected_fail = True unexpected_fail = True
if leaks is not None and len(leaks) != 0: if leaks is not None and len(leaks) != 0:
raise Exception("Node {} has memory leaks: {}".format( unexpected_fail = True
err_msgs.append("Node {} has memory leaks: {}".format(
self.nodes[i].daemon.lightning_dir, self.nodes[i].daemon.lightning_dir,
json.dumps(leaks, sort_keys=True, indent=4) json.dumps(leaks, sort_keys=True, indent=4)
)) ))
return not unexpected_fail return not unexpected_fail, err_msgs

Loading…
Cancel
Save