blob: 17836326f97c5e7984ada68a7723ec8b8ee9f075 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2018 TypeFox and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
******************************************************************************/
package org.eclipse.lsp4j.test
import java.io.ByteArrayOutputStream
import java.io.OutputStreamWriter
import java.io.PipedInputStream
import java.io.PipedOutputStream
import java.util.concurrent.CompletableFuture
import java.util.concurrent.CompletionException
import java.util.concurrent.TimeUnit
import org.eclipse.lsp4j.DidChangeConfigurationParams
import org.eclipse.lsp4j.DidChangeTextDocumentParams
import org.eclipse.lsp4j.DidChangeWatchedFilesParams
import org.eclipse.lsp4j.DidCloseTextDocumentParams
import org.eclipse.lsp4j.DidOpenTextDocumentParams
import org.eclipse.lsp4j.DidSaveTextDocumentParams
import org.eclipse.lsp4j.HoverParams
import org.eclipse.lsp4j.InitializeParams
import org.eclipse.lsp4j.MessageParams
import org.eclipse.lsp4j.Position
import org.eclipse.lsp4j.PublishDiagnosticsParams
import org.eclipse.lsp4j.ShowDocumentParams;
import org.eclipse.lsp4j.ShowMessageRequestParams
import org.eclipse.lsp4j.TextDocumentIdentifier
import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint
import org.eclipse.lsp4j.launch.LSPLauncher
import org.eclipse.lsp4j.services.LanguageClient
import org.eclipse.lsp4j.services.LanguageServer
import org.eclipse.lsp4j.services.TextDocumentService
import org.eclipse.lsp4j.services.WorkspaceService
import org.eclipse.xtend.lib.annotations.Accessors
import org.junit.Test
import static org.junit.Assert.*
class LSPEndpointTest {
static val TIMEOUT = 2000
@Test
def void testIssue152() throws Exception {
val client = new DummyClient
val in = new PipedInputStream
val responseStream = new PipedOutputStream
in.connect(responseStream)
val responseWriter = new OutputStreamWriter(responseStream)
val out = new ByteArrayOutputStream
val launcher = LSPLauncher.createClientLauncher(client, in, out, true, null)
val future = launcher.startListening()
val hoverResult = launcher.remoteProxy.textDocumentService.hover(new HoverParams => [
textDocument = new TextDocumentIdentifier('foo')
position = new Position(0, 0)
])
responseWriter.write('Content-Length: 60\r\n\r\n')
responseWriter.write('{"jsonrpc":"2.0","id":"1","result":{"contents":[null,null]}}')
responseWriter.flush()
try {
hoverResult.join()
fail('Expected a CompletionException to be thrown.')
} catch (CompletionException exception) {
assertEquals('''
Lists must not contain null references. Path: $.result.contents[0]
Lists must not contain null references. Path: $.result.contents[1]
'''.toString.replaceAll("\\r", "").trim, exception.cause.message)
assertFalse(future.isDone)
} finally {
in.close()
}
}
@Test
def void testIssue346() throws Exception {
val logMessages = new LogMessageAccumulator
try {
logMessages.registerTo(GenericEndpoint)
val server = new DummyServer
val in = new PipedInputStream
val messageStream = new PipedOutputStream
in.connect(messageStream)
val messageWriter = new OutputStreamWriter(messageStream)
val out = new ByteArrayOutputStream
val launcher = LSPLauncher.createServerLauncher(server, in, out, true, null)
launcher.startListening()
messageWriter.write('Content-Length: 48\r\n\r\n')
messageWriter.write('{"jsonrpc": "2.0","method": "exit","params": {}}')
messageWriter.flush()
server.exited.get(TIMEOUT, TimeUnit.MILLISECONDS)
assertTrue(logMessages.records.join('\n', [message]), logMessages.records.isEmpty)
} finally {
logMessages.unregister();
}
}
@Accessors
private static class DummyServer implements LanguageServer {
val textDocumentService = new TextDocumentService {
override didChange(DidChangeTextDocumentParams params) {}
override didClose(DidCloseTextDocumentParams params) {}
override didOpen(DidOpenTextDocumentParams params) {}
override didSave(DidSaveTextDocumentParams params) {}
}
val workspaceService = new WorkspaceService {
override didChangeConfiguration(DidChangeConfigurationParams params) {}
override didChangeWatchedFiles(DidChangeWatchedFilesParams params) {}
}
override initialize(InitializeParams params) {}
override shutdown() {}
val exited = new CompletableFuture<Void>
override exit() {
exited.complete(null)
}
}
private static class DummyClient implements LanguageClient {
override logMessage(MessageParams message) {}
override publishDiagnostics(PublishDiagnosticsParams diagnostics) {}
override showMessage(MessageParams messageParams) {}
override showMessageRequest(ShowMessageRequestParams requestParams) {}
override showDocument(ShowDocumentParams requestParams) {}
override telemetryEvent(Object object) {}
}
}