// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using System; using System.Collections.Generic; using System.IO; using System.Reflection; using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.ServiceLayer.Connection.Contracts; using Microsoft.SqlTools.ServiceLayer.Credentials; using Microsoft.SqlTools.ServiceLayer.Hosting; using Microsoft.SqlTools.ServiceLayer.LanguageServices; using Microsoft.SqlTools.ServiceLayer.QueryExecution; using Microsoft.SqlTools.ServiceLayer.QueryExecution.DataStorage; using Microsoft.SqlTools.ServiceLayer.SqlContext; using Microsoft.SqlTools.ServiceLayer.Workspace; using Moq; using Xunit; namespace Microsoft.SqlTools.ServiceLayer.Test.Common { /// /// Class to provide SQL tools service classes /// public class TestServiceProvider { private TestServiceProvider() { InitializeTestServices(); } private static object _lockObject = new object(); private static TestServiceProvider _instance = new TestServiceProvider(); public static TestServiceProvider Instance { get { return _instance; } } public CredentialService CredentialService { get { return CredentialService.Instance; } } public TestConnectionProfileService ConnectionProfileService { get { return TestConnectionProfileService.Instance; } } public WorkspaceService WorkspaceService { get { return WorkspaceService.Instance; } } /// /// Runs a query by calling the services directly (not using the test driver) /// public void RunQuery(TestServerType serverType, string databaseName, string queryText) { using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { ConnectionInfo connInfo = InitLiveConnectionInfo(serverType, databaseName, queryTempFile.FilePath); Query query = new Query(queryText, connInfo, new QueryExecutionSettings(), GetFileStreamFactory(new Dictionary())); query.Execute(); query.ExecutionTask.Wait(); } } private ConnectionInfo InitLiveConnectionInfo(TestServerType serverType, string databaseName, string scriptFilePath) { ConnectParams connectParams = ConnectionProfileService.GetConnectionParameters(serverType, databaseName); string ownerUri = scriptFilePath; var connectionService = ConnectionService.Instance; var connectionResult = connectionService.Connect(new ConnectParams() { OwnerUri = ownerUri, Connection = connectParams.Connection }); connectionResult.Wait(); ConnectionInfo connInfo = null; connectionService.TryFindConnection(ownerUri, out connInfo); Assert.NotNull(connInfo); return connInfo; } private static IFileStreamFactory GetFileStreamFactory(Dictionary storage) { Mock mock = new Mock(); mock.Setup(fsf => fsf.CreateFile()) .Returns(() => { string fileName = Guid.NewGuid().ToString(); storage.Add(fileName, new byte[8192]); return fileName; }); mock.Setup(fsf => fsf.GetReader(It.IsAny())) .Returns(output => new ServiceBufferFileStreamReader(new MemoryStream(storage[output]))); mock.Setup(fsf => fsf.GetWriter(It.IsAny())) .Returns(output => new ServiceBufferFileStreamWriter(new MemoryStream(storage[output]), 1024, 1024)); return mock.Object; } private static bool hasInitServices = false; private static void InitializeTestServices() { if (TestServiceProvider.hasInitServices) { return; } lock (_lockObject) { if (TestServiceProvider.hasInitServices) { return; } TestServiceProvider.hasInitServices = true; const string hostName = "SQ Tools Test Service Host"; const string hostProfileId = "SQLToolsTestService"; Version hostVersion = new Version(1, 0); // set up the host details and profile paths var hostDetails = new HostDetails(hostName, hostProfileId, hostVersion); SqlToolsContext sqlToolsContext = new SqlToolsContext(hostDetails); // Grab the instance of the service host ServiceHost serviceHost = ServiceHost.Instance; // Start the service serviceHost.Start().Wait(); // Initialize the services that will be hosted here WorkspaceService.Instance.InitializeService(serviceHost); LanguageService.Instance.InitializeService(serviceHost, sqlToolsContext); ConnectionService.Instance.InitializeService(serviceHost); CredentialService.Instance.InitializeService(serviceHost); QueryExecutionService.Instance.InitializeService(serviceHost); serviceHost.Initialize(); } } } }