diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/Platform.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/Platform.java new file mode 100644 index 0000000000..5767a26434 --- /dev/null +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/Platform.java @@ -0,0 +1,183 @@ +/******************************************************************************* +* Copyright (c) 2019 Red Hat Inc. and others. +* All rights reserved. This program and the accompanying materials +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v20.html +* +* Contributors: +* Red Hat Inc. - initial API and implementation +*******************************************************************************/ + +package org.eclipse.lsp4xml; + +/** + * PLatform information about OS and JVM. + */ +public class Platform { + + private static final OS os = new OS(); + + public static final boolean isWindows = getOS().isWindows(); + public static String SLASH = isWindows ? "\\" : "/"; + + /** + * OS information + */ + public static class OS { + + private final String name; + + private final String version; + + private final String arch; + + private final transient boolean isWindows; + + public OS() { + this.name = getSystemProperty("os.name"); + this.version = getSystemProperty("os.version"); + this.arch = getSystemProperty("os.arch"); + isWindows = name != null && name.toLowerCase().indexOf("win") >= 0; + } + + /** + * Returns the OS name. + * + * @return the OS name. + */ + public String getName() { + return name; + } + + /** + * Returns the OS version. + * + * @return the OS version. + */ + public String getVersion() { + return version; + } + + /** + * Returns the OS arch. + * + * @return the OS arch. + */ + public String getArch() { + return arch; + } + + public boolean isWindows() { + return isWindows; + } + } + + /** + * JVM information + * + */ + public static class JVM { + + /** + * JVM memory information + * + */ + public static class Memory { + + private final long free; + + private final long total; + + private final long max; + + private Memory() { + super(); + this.free = Runtime.getRuntime().freeMemory(); + this.total = Runtime.getRuntime().totalMemory(); + this.max = Runtime.getRuntime().maxMemory(); + } + + public long getFree() { + return free; + } + + public long getTotal() { + return total; + } + + public long getMax() { + return max; + } + + } + + private final String name; + + private final String runtime; + + private final String version; + + private final Memory memory; + + public JVM() { + this.name = getSystemProperty("java.vm.name"); // ex : OpenJDK 64-Bit Server VM + this.runtime = getSystemProperty("java.runtime.name"); // ex : OpenJDK Runtime Environment + this.version = getSystemProperty("java.version"); // ex : 11 + this.memory = new Memory(); + } + + /** + * Returns the JVM name + * + * @return the JVM name + */ + public String getName() { + return name; + } + + /** + * Returns the JVM version + * + * @return the JVM version + */ + public String getVersion() { + return version; + } + + /** + * Returns the JVM runtime name. + * + * @return the JVM runtime name. + */ + public String getRuntime() { + return runtime; + } + + public Memory getMemory() { + return memory; + } + } + + /** + * Returns the OS information. + * + * @return the OS information. + */ + public static OS getOS() { + return os; + } + + /** + * Returns the system property from the given key and null otherwise. + * + * @param key the property system key + * @return the system property from the given key and null otherwise. + */ + private static String getSystemProperty(String key) { + try { + return System.getProperty(key); + } catch (SecurityException e) { + return null; + } + } +} \ No newline at end of file diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLLanguageServer.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLLanguageServer.java index 02c4858c3e..3edb5b8627 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLLanguageServer.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLLanguageServer.java @@ -53,9 +53,11 @@ import org.eclipse.lsp4xml.settings.XMLGeneralClientSettings; import org.eclipse.lsp4xml.settings.XMLIncrementalSupportSettings; import org.eclipse.lsp4xml.settings.XMLSymbolSettings; +import org.eclipse.lsp4xml.settings.XMLTelemetrySettings; import org.eclipse.lsp4xml.settings.capabilities.InitializationOptionsExtendedClientCapabilities; import org.eclipse.lsp4xml.settings.capabilities.ServerCapabilitiesInitializer; import org.eclipse.lsp4xml.settings.capabilities.XMLCapabilityManager; +import org.eclipse.lsp4xml.telemetry.TelemetryManager; import org.eclipse.lsp4xml.utils.FilesUtils; /** @@ -74,6 +76,7 @@ public class XMLLanguageServer private final ScheduledExecutorService delayer; private Integer parentProcessId; public XMLCapabilityManager capabilityManager; + private TelemetryManager telemetryManager; public XMLLanguageServer() { xmlLanguageService = new XMLLanguageService(); @@ -116,6 +119,7 @@ public CompletableFuture initialize(InitializeParams params) { @Override public void initialized(InitializedParams params) { capabilityManager.initializeCapabilities(); + getTelemetryManager().onInitialized(params); } /** @@ -164,6 +168,11 @@ public synchronized void updateSettings(Object initializationOptionsSettings) { FilesUtils.setCachePathSetting(workDir); } + XMLTelemetrySettings newTelemetry = xmlClientSettings.getTelemetry(); + if (newTelemetry != null) { + getTelemetryManager().setEnabled(newTelemetry.isEnabled()); + } + XMLExperimentalSettings experimentalSettings = xmlClientSettings.getExperimental(); if (experimentalSettings != null) { XMLIncrementalSupportSettings incrementalSettings = experimentalSettings.getIncrementalSupport(); @@ -212,6 +221,7 @@ public WorkspaceService getWorkspaceService() { public void setClient(LanguageClient languageClient) { this.languageClient = languageClient; capabilityManager = new XMLCapabilityManager(this.languageClient, xmlTextDocumentService); + telemetryManager = new TelemetryManager(languageClient); } public LanguageClient getLanguageClient() { @@ -247,4 +257,13 @@ public DOMDocument getDocument(String uri) { ModelTextDocument document = xmlTextDocumentService.getDocument(uri); return document != null ? document.getModel().getNow(null) : null; } + + /** + * Returns the telemetry manager. + * + * @return the telemetry manager. + */ + public TelemetryManager getTelemetryManager() { + return telemetryManager; + } } diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLTextDocumentService.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLTextDocumentService.java index c1d3bfcd26..79c2a74436 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLTextDocumentService.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/XMLTextDocumentService.java @@ -80,6 +80,7 @@ import org.eclipse.lsp4xml.settings.XMLFormattingOptions; import org.eclipse.lsp4xml.settings.XMLIncrementalSupportSettings; import org.eclipse.lsp4xml.settings.XMLSymbolSettings; +import org.eclipse.lsp4xml.settings.capabilities.ServerCapabilitiesConstants; import org.eclipse.lsp4xml.utils.XMLPositionUtility; /** @@ -144,8 +145,11 @@ public XMLTextDocumentService(XMLLanguageServer xmlLanguageServer) { this.sharedSettings = new SharedSettings(); } - public void updateClientCapabilities(ClientCapabilities capabilities, ExtendedClientCapabilities extendedClientCapabilities) { - TextDocumentClientCapabilities textDocumentClientCapabilities = capabilities.getTextDocument(); + public void updateClientCapabilities(ClientCapabilities capabilities, + ExtendedClientCapabilities extendedClientCapabilities) { + TextDocumentClientCapabilities textDocumentClientCapabilities = capabilities != null + ? capabilities.getTextDocument() + : null; if (textDocumentClientCapabilities != null) { // Completion settings sharedSettings.completionSettings.setCapabilities(textDocumentClientCapabilities.getCompletion()); @@ -160,7 +164,7 @@ public void updateClientCapabilities(ClientCapabilities capabilities, ExtendedCl } if (extendedClientCapabilities != null) { // Extended client capabilities - sharedSettings.getCodeLensSettings().setCodeLens(extendedClientCapabilities.getCodeLens()); + sharedSettings.getCodeLensSettings().setCodeLens(extendedClientCapabilities.getCodeLens()); } } @@ -225,6 +229,7 @@ public CompletableFuture>> docume @Override public CompletableFuture> formatting(DocumentFormattingParams params) { + xmlLanguageServer.getTelemetryManager().onServiceCall(ServerCapabilitiesConstants.TEXT_DOCUMENT_FORMATTING); return computeAsync((cancelChecker) -> { String uri = params.getTextDocument().getUri(); TextDocument document = getDocument(uri); @@ -235,6 +240,8 @@ public CompletableFuture> formatting(DocumentFormatting @Override public CompletableFuture> rangeFormatting(DocumentRangeFormattingParams params) { + xmlLanguageServer.getTelemetryManager() + .onServiceCall(ServerCapabilitiesConstants.TEXT_DOCUMENT_RANGE_FORMATTING); return computeAsync((cancelChecker) -> { String uri = params.getTextDocument().getUri(); TextDocument document = getDocument(uri); @@ -245,6 +252,7 @@ public CompletableFuture> rangeFormatting(DocumentRange @Override public CompletableFuture rename(RenameParams params) { + xmlLanguageServer.getTelemetryManager().onServiceCall(ServerCapabilitiesConstants.TEXT_DOCUMENT_RENAME); return computeDOMAsync(params.getTextDocument(), (cancelChecker, xmlDocument) -> { return getXMLLanguageService().doRename(xmlDocument, params.getPosition(), params.getNewName()); }); @@ -319,7 +327,8 @@ public CompletableFuture> codeLens(CodeLensParams param return CompletableFuture.completedFuture(Collections.emptyList()); } return computeDOMAsync(params.getTextDocument(), (cancelChecker, xmlDocument) -> { - return getXMLLanguageService().getCodeLens(xmlDocument, sharedSettings.getCodeLensSettings(), cancelChecker); + return getXMLLanguageService().getCodeLens(xmlDocument, sharedSettings.getCodeLensSettings(), + cancelChecker); }); } diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/commons/ParentProcessWatcher.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/commons/ParentProcessWatcher.java index e6c178970e..7dfdc67f7d 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/commons/ParentProcessWatcher.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/commons/ParentProcessWatcher.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipse.lsp4xml.commons; -import static org.eclipse.lsp4xml.utils.OSUtils.isWindows; +import static org.eclipse.lsp4xml.Platform.isWindows; import java.io.IOException; import java.util.concurrent.Executors; diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/general/completion/FilePathCompletionParticipant.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/general/completion/FilePathCompletionParticipant.java index 2bc6bebb32..2a04388614 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/general/completion/FilePathCompletionParticipant.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/extensions/general/completion/FilePathCompletionParticipant.java @@ -10,10 +10,10 @@ package org.eclipse.lsp4xml.extensions.general.completion; +import static org.eclipse.lsp4xml.Platform.isWindows; import static org.eclipse.lsp4xml.utils.FilesUtils.convertToWindowsPath; import static org.eclipse.lsp4xml.utils.FilesUtils.getFilePathSlash; import static org.eclipse.lsp4xml.utils.FilesUtils.getNormalizedPath; -import static org.eclipse.lsp4xml.utils.OSUtils.isWindows; import static org.eclipse.lsp4xml.utils.StringUtils.isEmpty; import java.io.File; diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLGeneralClientSettings.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLGeneralClientSettings.java index eb152ccbfa..71fe8be02c 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLGeneralClientSettings.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLGeneralClientSettings.java @@ -46,6 +46,8 @@ public class XMLGeneralClientSettings { private XMLCodeLensSettings codeLens; + private XMLTelemetrySettings telemetry; + private XMLExperimentalSettings experimental; public XMLExperimentalSettings getExperimental() { @@ -90,6 +92,24 @@ public void setCodeLens(XMLCodeLensSettings codeLens) { this.codeLens = codeLens; } + /** + * Returns the telemetry settings. + * + * @return the telemetry settings. + */ + public XMLTelemetrySettings getTelemetry() { + return telemetry; + } + + /** + * Set the telemetry settings + * + * @param telemetry the telementry setting + */ + public void setTelemetry(XMLTelemetrySettings telemetry) { + this.telemetry = telemetry; + } + public void setFormat(XMLFormattingOptions format) { this.format = format; } diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/OSUtils.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLTelemetrySettings.java similarity index 64% rename from org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/OSUtils.java rename to org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLTelemetrySettings.java index 548fcf71c8..8388c1aed7 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/OSUtils.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/settings/XMLTelemetrySettings.java @@ -8,15 +8,21 @@ * Red Hat Inc. - initial API and implementation *******************************************************************************/ -package org.eclipse.lsp4xml.utils; +package org.eclipse.lsp4xml.settings; /** - * OSUtils + * Telemetry settings */ -public class OSUtils { - - public static final boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("win") >= 0; - public static String SLASH = isWindows ? "\\" : "/"; +public class XMLTelemetrySettings { - -} \ No newline at end of file + private boolean enabled; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + +} diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/telemetry/ServerInfo.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/telemetry/ServerInfo.java new file mode 100644 index 0000000000..2c5fb8f4f5 --- /dev/null +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/telemetry/ServerInfo.java @@ -0,0 +1,54 @@ +/******************************************************************************* +* Copyright (c) 2019 Red Hat Inc. and others. +* All rights reserved. This program and the accompanying materials +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v20.html +* +* Contributors: +* Red Hat Inc. - initial API and implementation +*******************************************************************************/ +package org.eclipse.lsp4xml.telemetry; + +import org.eclipse.lsp4xml.Platform; +import org.eclipse.lsp4xml.Platform.JVM; +import org.eclipse.lsp4xml.Platform.OS; +import org.eclipse.lsp4xml.utils.VersionHelper; + +/** + * Telemetry data to collect. + * + *
    + *
  • Server Version
  • + *
  • JVM information
  • + *
  • Memory information
  • + *
+ * + * @author Angelo ZERR + * + */ +public class ServerInfo { + + private final String version; + + private OS os; + + private JVM jvm; + + public ServerInfo() { + this.version = VersionHelper.getVersion(); + this.os = Platform.getOS(); + this.jvm = new JVM(); + } + + public String getVersion() { + return version; + } + + public OS getOs() { + return os; + } + + public JVM getJvm() { + return jvm; + } +} diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/telemetry/TelemetryManager.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/telemetry/TelemetryManager.java new file mode 100644 index 0000000000..d1eb161b70 --- /dev/null +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/telemetry/TelemetryManager.java @@ -0,0 +1,69 @@ +/******************************************************************************* +* Copyright (c) 2019 Red Hat Inc. and others. +* All rights reserved. This program and the accompanying materials +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v20.html +* +* Contributors: +* Red Hat Inc. - initial API and implementation +*******************************************************************************/ +package org.eclipse.lsp4xml.telemetry; + +import org.eclipse.lsp4j.InitializedParams; +import org.eclipse.lsp4j.services.LanguageClient; + +/** + * Telemetry manager. + * + * @author Angelo ZERRs + * + */ +public class TelemetryManager { + + private final LanguageClient languageClient; + + private boolean enabled; + + public TelemetryManager(LanguageClient languageClient) { + this.languageClient = languageClient; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + /** + * Send a telemetry event on start of the LSP server + * + * @param params + */ + public void onInitialized(InitializedParams params) { + if (isEnabled()) { + telemetryEvent(new ServerInfo()); + } + } + + /** + * Send a telemetry event on call of a service. + * + * @param serviceName service name. + */ + public void onServiceCall(String serviceName) { + if (isEnabled()) { + telemetryEvent(serviceName); + } + } + + /** + * The telemetry notification is sent from the server to the client to ask the + * client to log a telemetry event. + */ + private void telemetryEvent(Object object) { + languageClient.telemetryEvent(object); + } + +} diff --git a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/FilesUtils.java b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/FilesUtils.java index 897e4a472e..994a0f818e 100644 --- a/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/FilesUtils.java +++ b/org.eclipse.lsp4xml/src/main/java/org/eclipse/lsp4xml/utils/FilesUtils.java @@ -10,7 +10,7 @@ */ package org.eclipse.lsp4xml.utils; -import static org.eclipse.lsp4xml.utils.OSUtils.SLASH; +import static org.eclipse.lsp4xml.Platform.SLASH; import java.io.File; import java.io.IOException; diff --git a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/general/FilePathCompletionTest.java b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/general/FilePathCompletionTest.java index 8fc929c9f3..f8c467b114 100644 --- a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/general/FilePathCompletionTest.java +++ b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/extensions/general/FilePathCompletionTest.java @@ -10,10 +10,10 @@ package org.eclipse.lsp4xml.extensions.general; +import static org.eclipse.lsp4xml.Platform.SLASH; +import static org.eclipse.lsp4xml.Platform.isWindows; import static org.eclipse.lsp4xml.XMLAssert.c; import static org.eclipse.lsp4xml.XMLAssert.te; -import static org.eclipse.lsp4xml.utils.OSUtils.SLASH; -import static org.eclipse.lsp4xml.utils.OSUtils.isWindows; import org.eclipse.lsp4j.CompletionItem; import org.eclipse.lsp4xml.XMLAssert; diff --git a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/settings/XMLSymbolSettingsTest.java b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/settings/XMLSymbolSettingsTest.java index 4ba48965d3..7fb882eb0d 100644 --- a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/settings/XMLSymbolSettingsTest.java +++ b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/settings/XMLSymbolSettingsTest.java @@ -10,7 +10,6 @@ package org.eclipse.lsp4xml.settings; -import static org.eclipse.lsp4xml.utils.OSUtils.isWindows; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/telemetry/TelemetryTest.java b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/telemetry/TelemetryTest.java new file mode 100644 index 0000000000..e0c5702db6 --- /dev/null +++ b/org.eclipse.lsp4xml/src/test/java/org/eclipse/lsp4xml/telemetry/TelemetryTest.java @@ -0,0 +1,160 @@ +/******************************************************************************* +* Copyright (c) 2019 Red Hat Inc. and others. +* All rights reserved. This program and the accompanying materials +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v20.html +* +* Contributors: +* Red Hat Inc. - initial API and implementation +*******************************************************************************/ +package org.eclipse.lsp4xml.telemetry; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.lsp4j.DidOpenTextDocumentParams; +import org.eclipse.lsp4j.DocumentFormattingParams; +import org.eclipse.lsp4j.DocumentRangeFormattingParams; +import org.eclipse.lsp4j.FormattingOptions; +import org.eclipse.lsp4j.InitializeParams; +import org.eclipse.lsp4j.InitializedParams; +import org.eclipse.lsp4j.MessageActionItem; +import org.eclipse.lsp4j.MessageParams; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PublishDiagnosticsParams; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.ShowMessageRequestParams; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.TextDocumentItem; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.lsp4xml.Platform; +import org.eclipse.lsp4xml.Platform.JVM; +import org.eclipse.lsp4xml.Platform.OS; +import org.eclipse.lsp4xml.XMLLanguageServer; +import org.eclipse.lsp4xml.utils.VersionHelper; +import org.junit.Assert; +import org.junit.Test; + +/** + * Telemetry test + * + * @author Angelo ZERR + * + */ +public class TelemetryTest { + + @Test + public void telemetryEnabled() { + + List actualTelementryEvents = new ArrayList(); + XMLLanguageServer languageServer = createServer(actualTelementryEvents); + // By default telemtry is disabled, enable it + languageServer.getTelemetryManager().setEnabled(true); + callServices(languageServer, actualTelementryEvents); + + Assert.assertEquals(5, actualTelementryEvents.size()); + + Assert.assertTrue(actualTelementryEvents.get(0) instanceof ServerInfo); + ServerInfo serverInfo = (ServerInfo) actualTelementryEvents.get(0); + Assert.assertEquals(VersionHelper.getVersion(), serverInfo.getVersion()); + JVM jvm = serverInfo.getJvm(); + Assert.assertTrue(jvm.getMemory().getFree() > 0); + Assert.assertTrue(jvm.getMemory().getMax() > 0); + Assert.assertTrue(jvm.getMemory().getTotal() > 0); + OS os = serverInfo.getOs(); + Assert.assertEquals(Platform.getOS().getName(), os.getName()); + Assert.assertEquals(Platform.getOS().getVersion(), os.getVersion()); + Assert.assertEquals(Platform.getOS().getArch(), os.getArch()); + + Assert.assertEquals("textDocument/rename", actualTelementryEvents.get(1)); + Assert.assertEquals("textDocument/rename", actualTelementryEvents.get(2)); + Assert.assertEquals("textDocument/formatting", actualTelementryEvents.get(3)); + Assert.assertEquals("textDocument/rangeFormatting", actualTelementryEvents.get(4)); + + } + + @Test + public void telemetryDisabled() { + + List actualTelementryEvents = new ArrayList(); + XMLLanguageServer languageServer = createServer(actualTelementryEvents); + callServices(languageServer, actualTelementryEvents); + + Assert.assertEquals(0, actualTelementryEvents.size()); + + } + + private static void callServices(XMLLanguageServer languageServer, List actualTelementryEvents) { + // initialize -> no telemetry + InitializeParams params = new InitializeParams(); + languageServer.initialize(params); + Assert.assertEquals(0, actualTelementryEvents.size()); + + // initialized -> add telemetry + InitializedParams initialized = new InitializedParams(); + languageServer.initialized(initialized); + + TextDocumentIdentifier id = new TextDocumentIdentifier("test.xml"); + + // didOpen -> no telemetry + DidOpenTextDocumentParams open = new DidOpenTextDocumentParams( + new TextDocumentItem(id.getUri(), "xml", 1, "")); + languageServer.getTextDocumentService().didOpen(open); + + // rename -> add telemetry + RenameParams rename = new RenameParams(); + rename.setTextDocument(id); + rename.setPosition(new Position(0, 1)); + rename.setNewName("bar"); + languageServer.getTextDocumentService().rename(rename); + + // rename -> add telemetry + languageServer.getTextDocumentService().rename(rename); + + // formatting -> add telemetry + DocumentFormattingParams formatting = new DocumentFormattingParams(id, new FormattingOptions()); + languageServer.getTextDocumentService().formatting(formatting); + + // formatting -> add telemetry + DocumentRangeFormattingParams rangeFormatting = new DocumentRangeFormattingParams( + new Range(new Position(0, 1), new Position(0, 2))); + rangeFormatting.setTextDocument(id); + languageServer.getTextDocumentService().rangeFormatting(rangeFormatting); + } + + private static XMLLanguageServer createServer(List actualTelementryEvents) { + // Create XML Language Server + XMLLanguageServer languageServer = new XMLLanguageServer(); + LanguageClient client = new LanguageClient() { + + @Override + public void telemetryEvent(Object object) { + actualTelementryEvents.add(object); + } + + @Override + public CompletableFuture showMessageRequest(ShowMessageRequestParams requestParams) { + return null; + } + + @Override + public void showMessage(MessageParams messageParams) { + + } + + @Override + public void publishDiagnostics(PublishDiagnosticsParams diagnostics) { + + } + + @Override + public void logMessage(MessageParams message) { + + } + }; + languageServer.setClient(client); + return languageServer; + } +}