/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.languageserver.registry; import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncher; import org.eclipse.che.api.languageserver.shared.model.LanguageDescription; import org.eclipse.lsp4j.InitializeParams; import org.eclipse.lsp4j.InitializeResult; import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.lsp4j.services.TextDocumentService; import org.mockito.Mock; import org.mockito.testng.MockitoTestNGListener; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import java.util.Collections; import java.util.concurrent.CompletableFuture; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; /** * @author Anatoliy Bazko */ @Listeners(MockitoTestNGListener.class) public class LanguageServerRegistryImplTest { private static final String PREFIX = "file://"; private static final String FILE_PATH = "/projects/1/test.txt"; private static final String PROJECT_PATH = "/1"; @Mock private ServerInitializer initializer; @Mock private LanguageServerLauncher languageServerLauncher; @Mock private LanguageDescription languageDescription; @Mock private LanguageServer languageServer; @Mock private InitializeResult initializeResult; @Mock private ServerCapabilities serverCapabilities; @Mock private CompletableFuture<InitializeResult> completableFuture; private LanguageServerRegistryImpl registry; @BeforeMethod public void setUp() throws Exception { when(completableFuture.get()).thenReturn(initializeResult); when(initializeResult.getCapabilities()).thenReturn(serverCapabilities); when(languageServerLauncher.getLanguageDescription()).thenReturn(languageDescription); when(languageServerLauncher.isAbleToLaunch()).thenReturn(true); when(languageDescription.getLanguageId()).thenReturn("id"); when(languageDescription.getFileExtensions()).thenReturn(Collections.singletonList("txt")); when(languageDescription.getMimeTypes()).thenReturn(Collections.singletonList("plain/text")); when(languageServer.getTextDocumentService()).thenReturn(mock(TextDocumentService.class)); when(languageServer.initialize(any(InitializeParams.class))).thenReturn(completableFuture); registry = spy(new LanguageServerRegistryImpl(Collections.singleton(languageServerLauncher), null, initializer)); when(initializer.initialize(any(LanguageServerLauncher.class), anyString())).thenAnswer(invocation -> { Object[] arguments = invocation.getArguments(); registry.onServerInitialized(languageServer, serverCapabilities, languageDescription, (String)arguments[1]); return languageServer; }); doReturn(PROJECT_PATH).when(registry).extractProjectPath(FILE_PATH); } @Test public void testFindServer() throws Exception { LanguageServer server = registry.findServer(PREFIX + FILE_PATH); assertNotNull(server); assertEquals(server, languageServer); verify(initializer).initialize(eq(languageServerLauncher), eq(PROJECT_PATH)); verify(registry).onServerInitialized(eq(languageServer), eq(serverCapabilities), eq(languageDescription), eq(PROJECT_PATH)); } }