Identify pending handlers.

This commit is contained in:
Eric Snow 2018-03-08 23:39:02 +00:00
parent daaa1a47ea
commit 0eb8f41aa1
3 changed files with 22 additions and 9 deletions

View file

@ -179,9 +179,13 @@ class Daemon(object):
self._closed = True
self._close()
def add_handler(self, handler, oneoff=True):
def add_handler(self, handler, handlername=None, oneoff=True):
"""Add the given handler to the list of possible handlers."""
entry = (handler, 1 if oneoff else None)
entry = (
handler,
handlername or repr(handler),
1 if oneoff else None,
)
self._handlers.append(entry)
return handler
@ -230,14 +234,14 @@ class Daemon(object):
def _handle_message(self, msg):
for i, entry in enumerate(list(self._handlers)):
handle_message, remaining = entry
handle_message, name, remaining = entry
handled = handle_message(msg, self._send_message)
if handled or handled is None:
if remaining is not None:
if remaining == 1:
self._handlers.pop(i)
else:
self._handlers[i] = (handle_message, remaining-1)
self._handlers[i] = (handle_message, name, remaining-1)
return handled
else:
if self._default_handler is not None:
@ -280,5 +284,6 @@ class Daemon(object):
if force:
self._handlers = []
else:
raise RuntimeError('have pending handlers')
names = ', '.join(name for _, name, _ in self._handlers)
raise RuntimeError('have pending handlers: [{}]'.format(names))
self._received = list(self._protocol.parse_each(initial))

View file

@ -112,12 +112,15 @@ class FakePyDevd(protocol.Daemon):
# XXX Ensure it's a request?
return self.send_message(msg)
def add_pending_response(self, cmdid, text, reqid=None):
def add_pending_response(self, cmdid, text, reqid=None, handlername=None):
"""Add a response for a request."""
if reqid is None:
reqid = cmdid
respid = cmdid
if handlername is None:
handlername = '<request cmdid={}>'.format(cmdid)
def handle_request(req, send_message):
try:
cmdid, seq, _ = req
@ -129,4 +132,4 @@ class FakePyDevd(protocol.Daemon):
resp = Message(respid, seq, text)
send_message(resp)
return True
self.add_handler(handle_request)
self.add_handler(handle_request, handlername)

View file

@ -99,6 +99,8 @@ class FakeVSC(protocol.Daemon):
assert(msg.command == command)
return True
kwargs.setdefault('handlername',
'<request cmd={} seq={}>'.format(command, reqseq))
return self._wait_for_message(match, req, **kwargs)
def wait_for_event(self, event, **kwargs):
@ -112,6 +114,8 @@ class FakeVSC(protocol.Daemon):
return False
return True
kwargs.setdefault('handlername',
'<event {}>'.format(event))
return self._wait_for_message(match, req=None, **kwargs)
# internal methods
@ -138,7 +142,8 @@ class FakeVSC(protocol.Daemon):
super(FakeVSC, self)._close()
@contextlib.contextmanager
def _wait_for_message(self, match, req=None, handler=None, timeout=1):
def _wait_for_message(self, match, req=None, handler=None,
handlername=None, timeout=1):
lock = threading.Lock()
lock.acquire()
@ -149,7 +154,7 @@ class FakeVSC(protocol.Daemon):
handler(msg, send_message)
else:
return False
self.add_handler(handle_message)
self.add_handler(handle_message, handlername)
yield req