Broken error message matching.

This commit is contained in:
Florian Bruhin 2015-10-22 06:44:05 +02:00
parent 3a948be490
commit 1a562594fa
3 changed files with 54 additions and 15 deletions

View File

@ -13,3 +13,13 @@ Feature: Going back and forward.
data/backforward/2.txt
data/backforward/1.txt
data/backforward/2.txt
# Scenario: Going back without history
# Given I open data/backforward/1.txt
# When I run :back
# Then the error "At beginning of history." should be shown.
#
# Scenario: Going forward without history
# Given I open data/backforward/1.txt
# When I run :forward
# Then the error "At end of history." should be shown.

View File

@ -59,3 +59,8 @@ def lost_of_loaded_pages(httpbin, pages):
requests = [httpbin.Request('GET', '/' + path.strip())
for path in pages.split('\n')]
assert httpbin.get_requests() == requests
@bdd.then(bdd.parsers.parse('the error "{msg}" should be shown.'))
def expect_error(quteproc, msg):
quteproc.mark_expected(category='message', loglevel='ERROR', msg=msg)

View File

@ -35,9 +35,29 @@ import testprocess # pylint: disable=import-error
from qutebrowser.misc import ipc
LogLine = collections.namedtuple('LogLine', [
'timestamp', 'loglevel', 'category', 'module', 'function', 'line',
'message'])
class NoLineMatch(Exception):
"""Raised by LogLine on unmatched lines."""
pass
class LogLine:
LOG_RE = re.compile(r"""
(?P<timestamp>\d\d:\d\d:\d\d)
\ (?P<loglevel>VDEBUG|DEBUG|INFO|WARNING|ERROR)
\ +(?P<category>\w+)
\ +(?P<module>(\w+|Unknown\ module)):(?P<function>\w+):(?P<line>\d+)
\ (?P<message>.+)
""", re.VERBOSE)
def __init__(self, line):
match = self.LOG_RE.match(line)
if match is None:
raise NoLineMatch(line)
self.__dict__.update(match.groupdict())
self.expected = False
class QuteProc(testprocess.Process):
@ -49,14 +69,6 @@ class QuteProc(testprocess.Process):
_httpbin: The HTTPBin webserver.
"""
LOG_RE = re.compile(r"""
(?P<timestamp>\d\d:\d\d:\d\d)
\ (?P<loglevel>VDEBUG|DEBUG|INFO|WARNING|ERROR)
\ +(?P<category>\w+)
\ +(?P<module>(\w+|Unknown\ module)):(?P<function>\w+):(?P<line>\d+)
\ (?P<message>.+)
""", re.VERBOSE)
executing_command = pyqtSignal()
setting_done = pyqtSignal()
url_loaded = pyqtSignal()
@ -68,8 +80,9 @@ class QuteProc(testprocess.Process):
self._ipc_socket = None
def _parse_line(self, line):
match = self.LOG_RE.match(line)
if match is None:
try:
log_line = LogLine(line)
except NoLineMatch:
if line.startswith(' '):
# Multiple lines in some log output...
return None
@ -77,7 +90,6 @@ class QuteProc(testprocess.Process):
return None
else:
raise testprocess.InvalidLine
log_line = LogLine(**match.groupdict())
if (log_line.loglevel in ['INFO', 'WARNING', 'ERROR'] or
pytest.config.getoption('--verbose')):
@ -126,7 +138,8 @@ class QuteProc(testprocess.Process):
def after_test(self):
bad_msgs = [msg for msg in self._data
if msg.loglevel not in ['VDEBUG', 'DEBUG', 'INFO']]
if msg.loglevel not in ['VDEBUG', 'DEBUG', 'INFO']
and not msg.expected]
super().after_test()
if bad_msgs:
text = 'Logged unexpected errors:\n\n' + '\n'.join(
@ -153,6 +166,17 @@ class QuteProc(testprocess.Process):
else:
self.send_cmd(':open ' + url)
def mark_expected(self, category=None, loglevel=None, msg=None):
"""Mark a given logging message as expected."""
for item in self._data:
if category is not None and item.category != category:
continue
elif loglevel is not None and item.loglevel != loglevel:
continue
elif msg is not None and item.message != msg:
continue
item.expected = True
@pytest.yield_fixture
def quteproc(qapp, httpbin):