All tests now use 'jsonrpc--with-python-fixture' with a Python3
subprocess instead of the in-Emacs TCP server. Changed the "harakiri"
method to be a request instead of a notification for to reduce chance of
"Sentinel hasn't run" warning.
The two in-Emacs-RPC-specific error tests ('errors-with--32601' and
'signals-an--32603-JSONRPC-error') are dropped with the fixture itself,
as the error paths they exercise are internal to the Emacs Lisp
dispatcher and have no direct Python equivalent. They will have to be
re-done later on in other form.
* test/lisp/jsonrpc-resources/server-emacsrpc.py: New file.
* test/lisp/jsonrpc-resources/server-anxious-nested.py: Use new
harakiri.
* test/lisp/jsonrpc-resources/server-emacsrpc.py: Use new harakiri.
* test/lisp/jsonrpc-resources/server-harakiri.py: Use new harakiri.
* test/lisp/jsonrpc-resources/server-remote-during-sync-1.py: Use new
harakiri.
* test/lisp/jsonrpc-resources/server-remote-during-sync-2.py: Use new
harakiri.
* test/lisp/jsonrpc-resources/server-remote-error.py: Use new harakiri.
* test/lisp/jsonrpc-resources/common.py (harakiri): New definition.
* test/lisp/jsonrpc-tests.el
(jsonrpc--with-python-fixture): Rework, move up.
(jsonrpc-connection-ready-p): Move up.
(jsonrpc--call-with-emacsrpc-fixture)
(jsonrpc--with-emacsrpc-fixture)
(errors-with--32601)
(signals-an--32603-JSONRPC-error): Remove.
(returns-3, times-out, doesnt-time-out, stretching-it-but-works)
(deferred-action-toolate, deferred-action-intime)
(deferred-action-complex-tests): Migrate to Python fixture.
(scontrol-remote-during-sync-1, scontrol-remote-during-sync-2)
(scontrol-anxious-nested, scontrol-remote-error)
(shutdown-clean-after-notification): Tweak.
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
"""General-purpose JSONRPC server for jsonrpc.el tests.
|
|
|
|
Handles arithmetic (+ - * /), sit-for, vconcat, append, and ignore,
|
|
mirroring the methods the in-process Emacs RPC server supports.
|
|
"""
|
|
import functools
|
|
import operator
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
from common import log, read_msg, write_msg, harakiri
|
|
|
|
HANDLERS = {
|
|
'+': lambda p: sum(p),
|
|
'-': lambda p: functools.reduce(operator.sub, p),
|
|
'*': lambda p: functools.reduce(operator.mul, p),
|
|
'/': lambda p: functools.reduce(operator.truediv, p),
|
|
'vconcat': lambda p: sum(p, []),
|
|
'append': lambda p: sum(p, []),
|
|
'sit-for': lambda p: time.sleep(p[0]),
|
|
'ignore': lambda _: None,
|
|
}
|
|
|
|
|
|
def main():
|
|
while True:
|
|
msg = read_msg()
|
|
if msg is None:
|
|
break
|
|
mid = msg.get('id')
|
|
method = msg.get('method')
|
|
log(f'<- {method or "(response)"} id={mid}')
|
|
if harakiri(msg): break
|
|
if method is None or mid is None:
|
|
continue
|
|
handler = HANDLERS.get(method)
|
|
if handler is None:
|
|
write_msg({'jsonrpc': '2.0', 'id': mid,
|
|
'error': {'code': -32601, 'message': 'Method not found'}})
|
|
else:
|
|
try:
|
|
result = handler(msg.get('params', []))
|
|
write_msg({'jsonrpc': '2.0', 'id': mid, 'result': result})
|
|
log(f'-> (response {method}) id={mid}')
|
|
except Exception as exc:
|
|
write_msg({'jsonrpc': '2.0', 'id': mid,
|
|
'error': {'code': -32603, 'message': str(exc)}})
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|