palantir / python-jsonrpc-server

A Python 2 and 3 asynchronous JSON RPC server
MIT License
83 stars 36 forks source link

Tests failing with Python 3.8 #33

Closed mcepl closed 4 years ago

mcepl commented 4 years ago
[   11s] =================================== FAILURES ===================================
[   11s] ______________________________ test_request_error ______________________________
[   11s] 
[   11s] endpoint = <pyls_jsonrpc.endpoint.Endpoint object at 0x7f8e1ab39ee0>
[   11s] consumer = <MagicMock id='140248310062672'>
[   11s] 
[   11s]     def test_request_error(endpoint, consumer):
[   11s]         future = endpoint.request('methodName', {'key': 'value'})
[   11s]         assert not future.done()
[   11s]     
[   11s]         consumer.assert_called_once_with({
[   11s]             'jsonrpc': '2.0',
[   11s]             'id': MSG_ID,
[   11s]             'method': 'methodName',
[   11s]             'params': {'key': 'value'}
[   11s]         })
[   11s]     
[   11s]         # Send an error back from the client
[   11s]         error = exceptions.JsonRpcInvalidRequest(data=1234)
[   11s] >       endpoint.consume({
[   11s]             'jsonrpc': '2.0',
[   11s]             'id': MSG_ID,
[   11s]             'error': error.to_dict()
[   11s]         })
[   11s] 
[   11s] test/test_endpoint.py:86: 
[   11s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   11s] pyls_jsonrpc/endpoint.py:109: in consume
[   11s]     self._handle_response(message['id'], message.get('result'), message.get('error'))
[   11s] pyls_jsonrpc/endpoint.py:241: in _handle_response
[   11s]     request_future.set_result(result)
[   11s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   11s] 
[   11s] self = <Future at 0x7f8e1ab3fb20 state=finished raised JsonRpcInvalidRequest>
[   11s] result = None
[   11s] 
[   11s]     def set_result(self, result):
[   11s]         """Sets the return value of work associated with the future.
[   11s]     
[   11s]         Should only be used by Executor implementations and unit tests.
[   11s]         """
[   11s]         with self._condition:
[   11s]             if self._state in {CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED}:
[   11s] >               raise InvalidStateError('{}: {!r}'.format(self._state, self))
[   11s] E               concurrent.futures._base.InvalidStateError: FINISHED: <Future at 0x7f8e1ab3fb20 state=finished raised JsonRpcInvalidRequest>
[   11s] 
[   11s] /usr/lib64/python3.8/concurrent/futures/_base.py:524: InvalidStateError
[   11s] _____________________________ test_request_cancel ______________________________
[   11s] 
[   11s] endpoint = <pyls_jsonrpc.endpoint.Endpoint object at 0x7f8e1ad6f670>
[   11s] consumer = <MagicMock id='140248312379232'>
[   11s] 
[   11s]     def test_request_cancel(endpoint, consumer):
[   11s]         future = endpoint.request('methodName', {'key': 'value'})
[   11s]         assert not future.done()
[   11s]     
[   11s]         consumer.assert_called_once_with({
[   11s]             'jsonrpc': '2.0',
[   11s]             'id': MSG_ID,
[   11s]             'method': 'methodName',
[   11s]             'params': {'key': 'value'}
[   11s]         })
[   11s]     
[   11s]         # Cancel the request
[   11s]         future.cancel()
[   11s]         consumer.assert_any_call({
[   11s]             'jsonrpc': '2.0',
[   11s]             'method': '$/cancelRequest',
[   11s]             'params': {'id': MSG_ID}
[   11s]         })
[   11s]     
[   11s]         with pytest.raises(exceptions.JsonRpcException) as exc_info:
[   11s] >           assert future.result(timeout=2)
[   11s] 
[   11s] test/test_endpoint.py:119: 
[   11s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   11s] 
[   11s] self = <Future at 0x7f8e1ab372b0 state=cancelled>, timeout = 2
[   11s] 
[   11s]     def result(self, timeout=None):
[   11s]         """Return the result of the call that the future represents.
[   11s]     
[   11s]         Args:
[   11s]             timeout: The number of seconds to wait for the result if the future
[   11s]                 isn't done. If None, then there is no limit on the wait time.
[   11s]     
[   11s]         Returns:
[   11s]             The result of the call that the future represents.
[   11s]     
[   11s]         Raises:
[   11s]             CancelledError: If the future was cancelled.
[   11s]             TimeoutError: If the future didn't finish executing before the given
[   11s]                 timeout.
[   11s]             Exception: If the call raised then that exception will be raised.
[   11s]         """
[   11s]         with self._condition:
[   11s]             if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
[   11s] >               raise CancelledError()
[   11s] E               concurrent.futures._base.CancelledError
[   11s] 
[   11s] /usr/lib64/python3.8/concurrent/futures/_base.py:430: CancelledError
[   11s] ------------------------------ Captured log call -------------------------------
[   11s] ERROR    concurrent.futures:_base.py:330 exception calling callback for <Future at 0x7f8e1ab372b0 state=cancelled>
[   11s] Traceback (most recent call last):
[   11s]   File "/usr/lib64/python3.8/concurrent/futures/_base.py", line 328, in _invoke_callbacks
[   11s]     callback(self)
[   11s]   File "/home/abuild/rpmbuild/BUILD/python-jsonrpc-server-0.3.4/pyls_jsonrpc/endpoint.py", line 91, in callback
[   11s]     future.set_exception(JsonRpcRequestCancelled())
[   11s]   File "/usr/lib64/python3.8/concurrent/futures/_base.py", line 539, in set_exception
[   11s]     raise InvalidStateError('{}: {!r}'.format(self._state, self))
[   11s] concurrent.futures._base.InvalidStateError: CANCELLED: <Future at 0x7f8e1ab372b0 state=cancelled>
[   11s] ___________________________ test_writer_bad_message ____________________________
[   11s] 
[   11s] wfile = <_io.BytesIO object at 0x7f8e1ab2d5e0>
[   11s] writer = <pyls_jsonrpc.streams.JsonRpcStreamWriter object at 0x7f8e1aab2580>
[   11s] 
[   11s]     def test_writer_bad_message(wfile, writer):
[   11s]         # A datetime isn't serializable(or poorly serializable),
[   11s]         # ensure the write method doesn't throw
[   11s]         import datetime
[   11s]         writer.write(datetime.datetime(
[   11s]             year=2019,
[   11s]             month=1,
[   11s]             day=1,
[   11s]             hour=1,
[   11s]             minute=1,
[   11s]             second=1,
[   11s]         ))
[   11s]     
[   11s]         if os.name == 'nt':
[   11s]             assert wfile.getvalue() == b''
[   11s]         else:
[   11s] >           assert wfile.getvalue() == (
[   11s]                 b'Content-Length: 10\r\n'
[   11s]                 b'Content-Type: application/vscode-jsonrpc; charset=utf8\r\n'
[   11s]                 b'\r\n'
[   11s]                 b'1546304461'
[   11s]             )
[   11s] E           AssertionError: assert b'' == b'Content-Len...r\n1546304461'
[   11s] E             Full diff:
[   11s] E             - b''
[   11s] E             + (
[   11s] E             +  b'Content-Length: 10\r\nContent-Type: application/vscode-jsonrpc; charset=ut'
[   11s] E             +  b'f8\r\n\r\n1546304461',
[   11s] E             + )
[   11s] 
[   11s] test/test_streams.py:114: AssertionError
[   11s] ------------------------------ Captured log call -------------------------------
[   11s] ERROR    pyls_jsonrpc.streams:streams.py:112 Failed to write message to output file 2019-01-01 01:01:01
[   11s] Traceback (most recent call last):
[   11s]   File "/home/abuild/rpmbuild/BUILD/python-jsonrpc-server-0.3.4/pyls_jsonrpc/streams.py", line 98, in write
[   11s]     body = json.dumps(message, **self._json_dumps_args)
[   11s] TypeError: � is not JSON serializable
[   11s] =============================== warnings summary ===============================
[   11s] test/test_endpoint.py::test_bad_message
[   11s]   /home/abuild/rpmbuild/BUILD/python-jsonrpc-server-0.3.4/pyls_jsonrpc/endpoint.py:101: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead
[   11s]     log.warn("Unknown message type %s", message)
[   11s] 
[   11s] test/test_endpoint.py::test_consume_notification_method_not_found
[   11s]   /home/abuild/rpmbuild/BUILD/python-jsonrpc-server-0.3.4/pyls_jsonrpc/endpoint.py:138: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead
[   11s]     log.warn("Ignoring notification for unknown method %s", method)
[   11s] 
[   11s] test/test_endpoint.py::test_consume_request_cancel_unknown
[   11s]   /home/abuild/rpmbuild/BUILD/python-jsonrpc-server-0.3.4/pyls_jsonrpc/endpoint.py:168: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead
[   11s]     log.warn("Received cancel notification for unknown message id %s", msg_id)
[   11s] 
[   11s] -- Docs: https://docs.pytest.org/en/latest/warnings.html
[   11s] =================== 3 failed, 24 passed, 3 warnings in 0.20s ===================

Full build log with all details

hosiet commented 4 years ago

I'd like to mention that Arch Linux is shipping your package with a custom patch: https://git.archlinux.org/svntogit/community.git/tree/trunk/python-3.8.patch?h=packages/python-jsonrpc-server

I cannot determine whether this patch is reasonable or not. Please review it and contact the patch author ( @maximbaz ) if you have any questions.

bnavigator commented 4 years ago

Thank you @hosiet! Used it for #37