Skip to content

Commit c6457e4

Browse files
authored
Merge pull request #120 from eclipse/msp_issue119
Send full stack trace to remote endpoint on internal error
2 parents a5d4957 + bf22871 commit c6457e4

File tree

5 files changed

+50
-8
lines changed

5 files changed

+50
-8
lines changed

org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/RemoteEndpoint.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*******************************************************************************/
88
package org.eclipse.lsp4j.jsonrpc;
99

10+
import java.io.ByteArrayOutputStream;
11+
import java.io.PrintWriter;
1012
import java.lang.reflect.InvocationTargetException;
1113
import java.util.LinkedHashMap;
1214
import java.util.Map;
@@ -47,8 +49,13 @@ public class RemoteEndpoint implements Endpoint, MessageConsumer, MethodProvider
4749
} else {
4850
LOG.log(Level.SEVERE, "Internal error: " + throwable.getMessage(), throwable);
4951
ResponseError error = new ResponseError();
50-
error.setMessage("Internal error, please look at the server's logs.");
52+
error.setMessage("Internal error.");
5153
error.setCode(ResponseErrorCode.InternalError);
54+
ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
55+
PrintWriter stackTraceWriter = new PrintWriter(stackTrace);
56+
throwable.printStackTrace(stackTraceWriter);
57+
stackTraceWriter.flush();
58+
error.setData(stackTrace.toString());
5259
return error;
5360
}
5461
};

org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/IntegrationTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public void testUnknownMessages() throws Exception {
261261
// intercept log messages
262262
LogMessageAccumulator logMessages = new LogMessageAccumulator();
263263
try {
264-
logMessages.registerTo(GenericEndpoint.class.getName());
264+
logMessages.registerTo(GenericEndpoint.class);
265265

266266
// create client messages
267267
String clientMessage1 = "{\"jsonrpc\":\"2.0\","
@@ -304,7 +304,7 @@ public void testUnknownOptionalMessages() throws Exception {
304304
// intercept log messages
305305
LogMessageAccumulator logMessages = new LogMessageAccumulator();
306306
try {
307-
logMessages.registerTo(GenericEndpoint.class.getName());
307+
logMessages.registerTo(GenericEndpoint.class);
308308

309309
// create client messages
310310
String clientMessage1 = "{\"jsonrpc\":\"2.0\","
@@ -352,7 +352,7 @@ public void testUnexpectedParams() throws Exception {
352352
// intercept log messages
353353
LogMessageAccumulator logMessages = new LogMessageAccumulator();
354354
try {
355-
logMessages.registerTo(GenericEndpoint.class.getName());
355+
logMessages.registerTo(GenericEndpoint.class);
356356

357357
// create client messages
358358
String notificationMessage = "{\"jsonrpc\":\"2.0\","

org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/LogMessageAccumulator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public class LogMessageAccumulator extends Handler {
2626

2727
private final List<Logger> registeredLoggers = new ArrayList<>();
2828

29+
public Logger registerTo(Class<?> clazz) {
30+
return registerTo(clazz.getName());
31+
}
32+
2933
public Logger registerTo(String name) {
3034
Logger logger = Logger.getLogger(name);
3135
logger.setUseParentHandlers(false);

org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/RemoteEndpointTest.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,38 @@ public void consume(Message message) {
117117
assertNotNull(error);
118118
assertEquals(error.getCode(), ResponseErrorCode.RequestCancelled.getValue());
119119
assertEquals(error.getMessage(), "The request (id: 1, method: 'foo') has been cancelled");
120-
120+
}
121+
122+
@Test public void testException() {
123+
LogMessageAccumulator logMessages = new LogMessageAccumulator();
124+
try {
125+
// Don't show the exception in the test execution log
126+
logMessages.registerTo(RemoteEndpoint.class);
127+
128+
TestEndpoint endp = new TestEndpoint() {
129+
@Override
130+
public CompletableFuture<Object> request(String method, Object parameter) {
131+
throw new RuntimeException("BAAZ");
132+
}
133+
};
134+
TestMessageConsumer consumer = new TestMessageConsumer();
135+
RemoteEndpoint endpoint = new RemoteEndpoint(consumer, endp);
136+
137+
endpoint.consume(new RequestMessage() {{
138+
setId("1");
139+
setMethod("foo");
140+
setParams("myparam");
141+
}});
142+
143+
ResponseMessage response = (ResponseMessage) consumer.messages.get(0);
144+
assertEquals("Internal error.", response.getError().getMessage());
145+
assertEquals(ResponseErrorCode.InternalError.getValue(), response.getError().getCode());
146+
String exception = (String) response.getError().getData();
147+
String expected = "java.lang.RuntimeException: BAAZ\n\tat org.eclipse.lsp4j.jsonrpc.test.RemoteEndpointTest";
148+
assertEquals(expected, exception.substring(0, expected.length()));
149+
} finally {
150+
logMessages.unregister();
151+
}
121152
}
122153

123154
}

org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/annotations/impl/GenericEndpointTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ protected void testZeroParams(Object params, Predicate<String> predicate) throws
105105
try {
106106
if (predicate != null) {
107107
logMessages = new LogMessageAccumulator();
108-
logMessages.registerTo(GenericEndpoint.class.getName());
108+
logMessages.registerTo(GenericEndpoint.class);
109109
}
110110
GenericEndpoint endpoint = new GenericEndpoint(new Object() {
111111

@@ -156,7 +156,7 @@ protected void testSingleParams(Object params, String expectedString, Predicate<
156156
try {
157157
if (predicate != null) {
158158
logMessages = new LogMessageAccumulator();
159-
logMessages.registerTo(GenericEndpoint.class.getName());
159+
logMessages.registerTo(GenericEndpoint.class);
160160
}
161161
GenericEndpoint endpoint = new GenericEndpoint(new Object() {
162162

@@ -208,7 +208,7 @@ protected void testMultiParams(Object params, String expectedString, Integer exp
208208
try {
209209
if (predicate != null) {
210210
logMessages = new LogMessageAccumulator();
211-
logMessages.registerTo(GenericEndpoint.class.getName());
211+
logMessages.registerTo(GenericEndpoint.class);
212212
}
213213

214214
GenericEndpoint endpoint = new GenericEndpoint(new Object() {

0 commit comments

Comments
 (0)