Improve error message when server crashes

Give the exact command that the user needs to type to open the server logfile
when the server unexpectedly crashes.
This commit is contained in:
micbou 2017-08-18 17:58:31 +02:00
parent 9a76fd2e9a
commit 031edea89e
No known key found for this signature in database
GPG Key ID: C7E8FD1F3BDA1E05
2 changed files with 25 additions and 30 deletions

View File

@ -28,7 +28,7 @@ MockVimModule()
import os
import sys
from hamcrest import ( assert_that, contains, empty, is_in, is_not, has_length,
from hamcrest import ( assert_that, contains, empty, equal_to, is_in, is_not,
matches_regexp )
from mock import call, MagicMock, patch
@ -53,23 +53,19 @@ def RunNotifyUserIfServerCrashed( ycm, test, post_vim_message ):
ycm._NotifyUserIfServerCrashed()
assert_that( ycm._logger.method_calls,
has_length( len( test[ 'expected_logs' ] ) ) )
ycm._logger.error.assert_has_calls(
[ call( log ) for log in test[ 'expected_logs' ] ] )
post_vim_message.assert_has_exact_calls( [
call( test[ 'expected_vim_message' ] )
] )
assert_that( ycm._logger.error.call_args[ 0 ][ 0 ],
test[ 'expected_message' ] )
assert_that( post_vim_message.call_args[ 0 ][ 0 ],
test[ 'expected_message' ] )
def YouCompleteMe_NotifyUserIfServerCrashed_UnexpectedCore_test():
message = ( "The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). "
"Unexpected error while loading the YCM core library. "
"Use the ':YcmToggleLogs' command to check the logs." )
message = ( "The ycmd server SHUT DOWN \(restart with ':YcmRestartServer'\). "
"Unexpected error while loading the YCM core library. Type "
"':YcmToggleLogs ycmd_\d+_stderr_.+.log' to check the logs." )
RunNotifyUserIfServerCrashed( {
'return_code': 3,
'expected_logs': [ message ],
'expected_vim_message': message
'expected_message': matches_regexp( message )
} )
@ -79,8 +75,7 @@ def YouCompleteMe_NotifyUserIfServerCrashed_MissingCore_test():
"using it. Follow the instructions in the documentation." )
RunNotifyUserIfServerCrashed( {
'return_code': 4,
'expected_logs': [ message ],
'expected_vim_message': message
'expected_message': equal_to( message )
} )
@ -91,8 +86,7 @@ def YouCompleteMe_NotifyUserIfServerCrashed_Python2Core_test():
"interpreter path." )
RunNotifyUserIfServerCrashed( {
'return_code': 5,
'expected_logs': [ message ],
'expected_vim_message': message
'expected_message': equal_to( message )
} )
@ -103,8 +97,7 @@ def YouCompleteMe_NotifyUserIfServerCrashed_Python3Core_test():
"interpreter path." )
RunNotifyUserIfServerCrashed( {
'return_code': 6,
'expected_logs': [ message ],
'expected_vim_message': message
'expected_message': equal_to( message )
} )
@ -114,19 +107,17 @@ def YouCompleteMe_NotifyUserIfServerCrashed_OutdatedCore_test():
"install.py script. See the documentation for more details." )
RunNotifyUserIfServerCrashed( {
'return_code': 7,
'expected_logs': [ message ],
'expected_vim_message': message
'expected_message': equal_to( message )
} )
def YouCompleteMe_NotifyUserIfServerCrashed_UnexpectedExitCode_test():
message = ( "The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). "
"Unexpected exit code 1. Use the ':YcmToggleLogs' command to "
"check the logs." )
message = ( "The ycmd server SHUT DOWN \(restart with ':YcmRestartServer'\). "
"Unexpected exit code 1. Type "
"':YcmToggleLogs ycmd_\d+_stderr_.+.log' to check the logs." )
RunNotifyUserIfServerCrashed( {
'return_code': 1,
'expected_logs': [ message ],
'expected_vim_message': message
'expected_message': matches_regexp( message )
} )

View File

@ -79,10 +79,10 @@ SERVER_SHUTDOWN_MESSAGE = (
"The ycmd server SHUT DOWN (restart with ':YcmRestartServer')." )
EXIT_CODE_UNEXPECTED_MESSAGE = (
"Unexpected exit code {code}. "
"Use the ':YcmToggleLogs' command to check the logs." )
"Type ':YcmToggleLogs {logfile}' to check the logs." )
CORE_UNEXPECTED_MESSAGE = (
"Unexpected error while loading the YCM core library. "
"Use the ':YcmToggleLogs' command to check the logs." )
"Type ':YcmToggleLogs {logfile}' to check the logs." )
CORE_MISSING_MESSAGE = (
'YCM core library not detected; you need to compile YCM before using it. '
'Follow the instructions in the documentation.' )
@ -238,8 +238,10 @@ class YouCompleteMe( object ):
self._user_notified_about_crash = True
return_code = self._server_popen.poll()
logfile = os.path.basename( self._server_stderr )
if return_code == server_utils.CORE_UNEXPECTED_STATUS:
error_message = CORE_UNEXPECTED_MESSAGE
error_message = CORE_UNEXPECTED_MESSAGE.format(
logfile = logfile )
elif return_code == server_utils.CORE_MISSING_STATUS:
error_message = CORE_MISSING_MESSAGE
elif return_code == server_utils.CORE_PYTHON2_STATUS:
@ -249,7 +251,9 @@ class YouCompleteMe( object ):
elif return_code == server_utils.CORE_OUTDATED_STATUS:
error_message = CORE_OUTDATED_MESSAGE
else:
error_message = EXIT_CODE_UNEXPECTED_MESSAGE.format( code = return_code )
error_message = EXIT_CODE_UNEXPECTED_MESSAGE.format(
code = return_code,
logfile = logfile )
error_message = SERVER_SHUTDOWN_MESSAGE + ' ' + error_message
self._logger.error( error_message )