| /****************************************************************************** |
| * 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.annotations.impl; |
| |
| import java.util.Arrays; |
| import java.util.concurrent.CompletableFuture; |
| import java.util.function.Predicate; |
| import java.util.logging.Level; |
| |
| import org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint; |
| import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate; |
| import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; |
| import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; |
| import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; |
| import org.eclipse.lsp4j.jsonrpc.test.LogMessageAccumulator; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class GenericEndpointTest { |
| |
| public static class Foo implements MyIf, OtherThing { |
| |
| public int calls = 0; |
| |
| @Override |
| public void myNotification() { |
| calls++; |
| } |
| |
| @Override |
| public OtherThing doDelegate() { |
| return this; |
| } |
| |
| } |
| |
| public static class Bar { |
| |
| public int calls = 0; |
| |
| @JsonNotification |
| public void barrr() { |
| calls++; |
| } |
| |
| } |
| |
| public static interface MyIf { |
| |
| @JsonNotification |
| public void myNotification(); |
| |
| @JsonDelegate |
| public OtherThing doDelegate(); |
| } |
| |
| @JsonSegment("other") |
| public static interface OtherThing { |
| |
| @JsonNotification |
| public void myNotification(); |
| } |
| |
| @Test |
| public void testSimple() { |
| Foo foo = new Foo(); |
| GenericEndpoint endpoint = new GenericEndpoint(foo); |
| endpoint.notify("myNotification", null); |
| endpoint.notify("other/myNotification", null); |
| |
| Assert.assertEquals(2, foo.calls); |
| } |
| |
| @Test |
| public void testMultiServices() { |
| Foo foo = new Foo(); |
| Bar bar = new Bar(); |
| GenericEndpoint endpoint = new GenericEndpoint(Arrays.asList(foo, bar)); |
| endpoint.notify("myNotification", null); |
| endpoint.notify("barrr", null); |
| endpoint.notify("other/myNotification", null); |
| |
| Assert.assertEquals(2, foo.calls); |
| Assert.assertEquals(1, bar.calls); |
| } |
| |
| @Test |
| public void testUnexpectedParams() { |
| LogMessageAccumulator logMessages = new LogMessageAccumulator(); |
| try { |
| logMessages.registerTo(GenericEndpoint.class); |
| |
| Foo foo = new Foo(); |
| GenericEndpoint endpoint = new GenericEndpoint(foo); |
| Assert.assertEquals(0, foo.calls); |
| |
| endpoint.notify("myNotification", new Object()); |
| Assert.assertEquals(1, foo.calls); |
| } finally { |
| logMessages.unregister(); |
| } |
| } |
| |
| @Test |
| public void testZeroParams_01() throws Exception { |
| testZeroParams("foo", m -> m.contains("Unexpected params 'foo'")); |
| } |
| |
| @Test |
| public void testZeroParams_02() throws Exception { |
| testZeroParams(null); |
| } |
| |
| @Test |
| public void testZeroParams_03() throws Exception { |
| testZeroParams(Arrays.asList("foo"), m -> m.contains("Unexpected params '[foo]'")); |
| } |
| |
| @Test |
| public void testZeroParams_04() throws Exception { |
| testZeroParams(Arrays.asList("foo", "bar"), m -> m.contains("Unexpected params '[foo, bar]'")); |
| } |
| |
| protected void testZeroParams(Object params) throws Exception { |
| testZeroParams(params, null); |
| } |
| |
| protected void testZeroParams(Object params, Predicate<String> predicate) throws Exception { |
| LogMessageAccumulator logMessages = null; |
| try { |
| if (predicate != null) { |
| logMessages = new LogMessageAccumulator(); |
| logMessages.registerTo(GenericEndpoint.class); |
| } |
| GenericEndpoint endpoint = new GenericEndpoint(new Object() { |
| |
| @JsonNotification |
| public void myNotification() { |
| } |
| |
| }); |
| |
| endpoint.notify("myNotification", params); |
| |
| if (predicate != null) { |
| logMessages.await(r -> Level.WARNING == r.getLevel() && predicate.test(r.getMessage())); |
| } |
| } finally { |
| if (logMessages != null) { |
| logMessages.unregister(); |
| } |
| } |
| } |
| |
| @Test |
| public void testSingleParams_01() throws Exception { |
| testSingleParams("foo", "foo"); |
| } |
| |
| @Test |
| public void testSingleParams_02() throws Exception { |
| testSingleParams(null, null); |
| } |
| |
| @Test |
| public void testSingleParams_03() throws Exception { |
| testSingleParams(Arrays.asList("foo"), "foo"); |
| } |
| |
| @Test |
| public void testSingleParams_04() throws Exception { |
| testSingleParams(Arrays.asList("foo", "bar"), "foo", m -> m.contains("Unexpected params 'bar'")); |
| } |
| |
| protected void testSingleParams(Object params, String expectedString) throws Exception { |
| this.testSingleParams(params, expectedString, null); |
| } |
| |
| protected void testSingleParams(Object params, String expectedString, Predicate<String> predicate) throws Exception { |
| LogMessageAccumulator logMessages = null; |
| try { |
| if (predicate != null) { |
| logMessages = new LogMessageAccumulator(); |
| logMessages.registerTo(GenericEndpoint.class); |
| } |
| GenericEndpoint endpoint = new GenericEndpoint(new Object() { |
| |
| @JsonRequest |
| public CompletableFuture<String> getStringValue(String stringValue) { |
| return CompletableFuture.completedFuture(stringValue); |
| } |
| |
| }); |
| |
| Assert.assertEquals(expectedString, endpoint.request("getStringValue", params).get()); |
| |
| if (predicate != null) { |
| logMessages.await(r -> Level.WARNING == r.getLevel() && predicate.test(r.getMessage())); |
| } |
| } finally { |
| if (logMessages != null) { |
| logMessages.unregister(); |
| } |
| } |
| } |
| |
| @Test |
| public void testMultiParams_01() throws Exception { |
| testMultiParams(Arrays.asList("foo", 1), "foo", 1); |
| } |
| |
| @Test |
| public void testMultiParams_02() throws Exception { |
| testMultiParams(Arrays.asList("foo"), "foo", null); |
| } |
| |
| @Test |
| public void testMultiParams_03() throws Exception { |
| testMultiParams(Arrays.asList("foo", 1, "bar", 2), "foo", 1, m -> m.contains("Unexpected params 'bar', '2'")); |
| } |
| |
| @Test |
| public void testMultiParams_04() throws Exception { |
| testMultiParams("foo", "foo", null); |
| } |
| |
| protected void testMultiParams(Object params, String expectedString, Integer expectedInt) throws Exception { |
| testMultiParams(params, expectedString, expectedInt, null); |
| } |
| |
| protected void testMultiParams(Object params, String expectedString, Integer expectedInt, Predicate<String> predicate) throws Exception { |
| LogMessageAccumulator logMessages = null; |
| try { |
| if (predicate != null) { |
| logMessages = new LogMessageAccumulator(); |
| logMessages.registerTo(GenericEndpoint.class); |
| } |
| |
| GenericEndpoint endpoint = new GenericEndpoint(new Object() { |
| |
| String stringValue; |
| Integer intValue; |
| |
| @JsonRequest |
| public CompletableFuture<String> getStringValue() { |
| return CompletableFuture.completedFuture(stringValue); |
| } |
| |
| @JsonRequest |
| public CompletableFuture<Integer> getIntValue() { |
| return CompletableFuture.completedFuture(intValue); |
| } |
| |
| @JsonNotification |
| public void myNotification(String stringValue, Integer intValue) { |
| this.stringValue = stringValue; |
| this.intValue = intValue; |
| } |
| |
| }); |
| endpoint.notify("myNotification", params); |
| |
| if (predicate != null) { |
| logMessages.await(r -> Level.WARNING == r.getLevel() && predicate.test(r.getMessage())); |
| } |
| |
| Assert.assertEquals(expectedString, endpoint.request("getStringValue", null).get()); |
| Assert.assertEquals(expectedInt, endpoint.request("getIntValue", null).get()); |
| } finally { |
| if (logMessages != null) { |
| logMessages.unregister(); |
| } |
| } |
| } |
| |
| } |