make prematurely exited processes fail the test

Change-Id: I54394c40718b44378df597e32003742059052869
This commit is contained in:
Neels Hofmeyr 2017-04-09 22:01:16 +02:00
parent b02c21115d
commit 85eb324165
3 changed files with 41 additions and 10 deletions

View File

@ -48,6 +48,9 @@ DATEFMT = '%H:%M:%S'
# may be overridden by regression tests
get_process_id = lambda: '%d-%d' % (os.getpid(), time.time())
class Error(Exception):
pass
class LogTarget:
do_log_time = None
do_log_category = None
@ -166,13 +169,7 @@ class LogTarget:
else:
loglevel = ''
log_line = [str(m) for m in messages]
if named_items:
# unfortunately needs to be sorted to get deterministic results
log_line.append('{%s}' %
(', '.join(['%s=%r' % (k,v)
for k,v in sorted(named_items.items())])))
log_line = [compose_message(messages, named_items)]
if deeper_origins:
log_line.append(' [%s]' % deeper_origins)
@ -316,6 +313,10 @@ class Origin:
Origin._global_current_origin, self._parent_origin = self._parent_origin, None
return rc
def raise_exn(self, *messages, exn_class=Error, **named_items):
with self:
raise exn_class(compose_message(messages, named_items))
def redirect_stdout(self):
return contextlib.redirect_stdout(SafeRedirectStdout(self))
@ -498,4 +499,15 @@ def run_logging_exceptions(func, *func_args, return_on_failure=None, **func_kwar
log_exn()
return return_on_failure
def compose_message(messages, named_items):
msgs = [str(m) for m in messages]
if named_items:
# unfortunately needs to be sorted to get deterministic results
msgs.append('{%s}' %
(', '.join(['%s=%r' % (k,v)
for k,v in sorted(named_items.items())])))
return ' '.join(msgs)
# vim: expandtab tabstop=4 shiftwidth=4

View File

@ -133,8 +133,20 @@ class Process(log.Origin):
self.log('Terminated', rc=self.result)
else:
self.err('Terminated: ERROR', rc=self.result)
#self.err('stdout:\n', self.get_stdout_tail(prefix='| '), '\n')
self.err('stderr:\n', self.get_stderr_tail(prefix='| '), '\n')
#self.log_stdout_tail()
self.log_stderr_tail()
def log_stdout_tail(self):
m = self.get_stdout_tail(prefix='| ')
if not m:
return
self.log('stdout:\n', m, '\n')
def log_stderr_tail(self):
m = self.get_stderr_tail(prefix='| ')
if not m:
return
self.log('stderr:\n', m, '\n')
def close_output_logs(self):
self.dbg('Cleanup')
@ -154,6 +166,9 @@ class Process(log.Origin):
if self.result is not None:
self.cleanup()
def is_running(self):
return self.process_obj is not None and self.result is None
def get_output(self, which):
v = self.outputs.get(which)
if not v:

View File

@ -250,10 +250,14 @@ class SuiteRun(log.Origin):
self.wait(lambda: False, timeout=seconds)
def poll(self):
ofono_client.poll()
if self._processes:
for process in self._processes:
process.poll()
ofono_client.poll()
if not process.is_running():
process.log_stdout_tail()
process.log_stderr_tail()
process.raise_exn('Process ended prematurely')
def prompt(self, *msgs, **msg_details):
'ask for user interaction. Do not use in tests that should run automatically!'