blob: c7d9924aeedf71cdbd904b4dff587be30958a352 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2016 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.jsonrpc.test;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.eclipse.lsp4j.jsonrpc.Launcher;
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
import org.junit.Assert;
import org.junit.Test;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class LauncherTest {
private static final long TIMEOUT = 2000;
static class Param {
Param() {
}
Param(String message) {
this.message = message;
}
public String message;
}
static interface A {
@JsonNotification
public void say(Param p);
}
static interface B {
@JsonRequest
public CompletableFuture<String> ask(Param p);
}
@Test public void testDone() throws Exception {
A a = new A() {
@Override
public void say(Param p) {
}
};
Launcher<A> launcher = Launcher.createLauncher(a, A.class, new ByteArrayInputStream("".getBytes()), new ByteArrayOutputStream());
Future<?> startListening = launcher.startListening();
startListening.get(TIMEOUT, TimeUnit.MILLISECONDS);
Assert.assertTrue(startListening.isDone());
Assert.assertFalse(startListening.isCancelled());
}
@Test public void testCanceled() throws Exception {
A a = new A() {
@Override
public void say(Param p) {
}
};
Launcher<A> launcher = Launcher.createLauncher(a, A.class, new InputStream() {
@Override
public int read() throws IOException {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return '\n';
}
}, new ByteArrayOutputStream());
Future<?> startListening = launcher.startListening();
startListening.cancel(true);
Assert.assertTrue(startListening.isDone());
Assert.assertTrue(startListening.isCancelled());
}
@Test public void testCustomGson() throws Exception {
A a = new A() {
@Override
public void say(Param p) {
}
};
ByteArrayOutputStream out = new ByteArrayOutputStream();
TypeAdapter<Param> typeAdapter = new TypeAdapter<Param>() {
@Override
public void write(JsonWriter out, Param value) throws IOException {
out.beginObject();
out.name("message");
out.value("bar");
out.endObject();
}
@Override
public Param read(JsonReader in) throws IOException {
return null;
}
};
Launcher<A> launcher = Launcher.createIoLauncher(a, A.class, new ByteArrayInputStream("".getBytes()), out,
Executors.newCachedThreadPool(), c -> c,
gsonBuilder -> {gsonBuilder.registerTypeAdapter(Param.class, typeAdapter);});
A remoteProxy = launcher.getRemoteProxy();
remoteProxy.say(new Param("foo"));
Assert.assertEquals("Content-Length: 59\r\n\r\n"
+ "{\"jsonrpc\":\"2.0\",\"method\":\"say\",\"params\":{\"message\":\"bar\"}}",
out.toString());
}
@Test public void testMultipleServices() throws Exception {
final String[] paramA = new String[1];
A a = new A() {
@Override
public void say(Param p) {
paramA[0] = p.message;
}
};
final String[] paramB = new String[1];
B b = new B() {
@Override
public CompletableFuture<String> ask(Param p) {
paramB[0] = p.message;
return CompletableFuture.completedFuture("echo " + p.message);
}
};
String inputMessages = "Content-Length: 60\r\n\r\n"
+ "{\"jsonrpc\":\"2.0\",\"method\":\"say\",\"params\":{\"message\":\"foo1\"}}"
+ "Content-Length: 69\r\n\r\n"
+ "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"ask\",\"params\":{\"message\":\"bar1\"}}";
ByteArrayInputStream in = new ByteArrayInputStream(inputMessages.getBytes());
ByteArrayOutputStream out = new ByteArrayOutputStream();
ClassLoader classLoader = getClass().getClassLoader();
Launcher<Object> launcher = Launcher.createIoLauncher(Arrays.asList(a, b), Arrays.asList(A.class, B.class),
classLoader, in, out, Executors.newCachedThreadPool(), c -> c, null);
launcher.startListening().get(TIMEOUT, TimeUnit.MILLISECONDS);
assertEquals("foo1", paramA[0]);
assertEquals("bar1", paramB[0]);
Object remoteProxy = launcher.getRemoteProxy();
((A) remoteProxy).say(new Param("foo2"));
((B) remoteProxy).ask(new Param("bar2"));
Assert.assertEquals("Content-Length: 47\r\n\r\n"
+ "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"result\":\"echo bar1\"}"
+ "Content-Length: 60\r\n\r\n"
+ "{\"jsonrpc\":\"2.0\",\"method\":\"say\",\"params\":{\"message\":\"foo2\"}}"
+ "Content-Length: 69\r\n\r\n"
+ "{\"jsonrpc\":\"2.0\",\"id\":\"1\",\"method\":\"ask\",\"params\":{\"message\":\"bar2\"}}",
out.toString());
}
}