// // 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.Reflection; using Microsoft.SqlTools.Extensibility; using Microsoft.SqlTools.ResourceProvider.Core; using Microsoft.SqlTools.ResourceProvider.Core.Authentication; using Microsoft.SqlTools.ResourceProvider.Core.Extensibility; using Microsoft.SqlTools.ServiceLayer.UnitTests.ResourceProvider.Azure; using Microsoft.SqlTools.ServiceLayer.UnitTests.ResourceProvider.Fakes; using Moq; using Xunit; namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ResourceProvider { /// /// Tests for ServiceManager to verify finding services and providers for specific type correctly /// public class ServiceManagerTest { private IList _providers; private IList _accountManagers; public ServiceManagerTest() { _providers = new List() { new FakeServerDiscoveryProvider2(new ExportableMetadata("SqlServer", "Local", Guid.NewGuid().ToString())), new FakeSecureServerDiscoveryProvider(new ExportableMetadata("SqlServer", "Azure", Guid.NewGuid().ToString())), new FakeServerDiscoveryProvider(new ExportableMetadata("SqlServer", "Network", Guid.NewGuid().ToString())) }; _accountManagers = new List() { new FakeAccountManager(new ExportableMetadata("SqlServer", "Azure", Guid.NewGuid().ToString())), new FakeAccountManager2(new ExportableMetadata("SqlServer", "Network", Guid.NewGuid().ToString())) }; } [Fact] public void GetServiceShouldReturnTheServiceThatHasGivenMetadataCorrectly() { //given var serverDefinition = new ServerDefinition("SqlServer", "Azure"); IMultiServiceProvider provider = CreateServiceProvider(); //when IServerDiscoveryProvider service = ExtensionUtils.GetService(provider, serverDefinition); //then Assert.NotNull(service); Assert.True(service.GetType() == typeof(FakeSecureServerDiscoveryProvider)); } [Fact] public void GetServiceShouldReturnNullGivenInvalidMetadata() { //given var serverDefinition = new ServerDefinition(Guid.NewGuid().ToString(), Guid.NewGuid().ToString()); IMultiServiceProvider provider = CreateServiceProvider(); //when IServerDiscoveryProvider service = ExtensionUtils.GetService(provider, serverDefinition); //then Assert.Null(service); } [Fact] public void GetServiceShouldReturnNullGivenUnSupportedMetadata() { //given var serverDefinition = new ServerDefinition("SqlServer", "Local"); IMultiServiceProvider provider = CreateServiceProvider(); //when IAccountManager service = ExtensionUtils.GetService(provider, serverDefinition); //then Assert.Null(service); } [Fact] public void RequiresUserAccountShouldReturnFalseGivenNotSecuredService() { //given var serverDefinition = new ServerDefinition("SqlServer", "Local"); IMultiServiceProvider provider = CreateServiceProvider(); //when IServerDiscoveryProvider service = ExtensionUtils.GetService(provider, serverDefinition); //then Assert.NotNull(service); } [Fact] public void GetShouldReturnDefaultAzureServiceGivenDefaultCatalog() { // given ExtensionServiceProvider provider = ExtensionServiceProvider.Create(new Assembly[] { typeof(IAccountManager).Assembly, typeof(IAzureResourceManager).Assembly }); var serverDefinition = new ServerDefinition("sqlserver", "azure"); // when I query each provider IServerDiscoveryProvider serverDiscoveryProvider = ExtensionUtils.GetService(provider, serverDefinition); // Then I get a valid provider back Assert.NotNull(serverDiscoveryProvider); Assert.True(serverDiscoveryProvider is AzureSqlServerDiscoveryProvider); IDatabaseDiscoveryProvider databaseDiscoveryProvider = ExtensionUtils.GetService(provider, serverDefinition); // TODO Verify account manager is detected as soon as the account manager has a real implementation //IAccountManager accountManager = ((AzureSqlServerDiscoveryProvider)serverDiscoveryProvider).AccountManager; //Assert.NotNull(accountManager); //Assert.True(accountManager is IAzureAuthenticationManager); Assert.NotNull(databaseDiscoveryProvider); Assert.True(databaseDiscoveryProvider is AzureDatabaseDiscoveryProvider); } [Fact] public void GetShouldReturnImplementedAzureServiceIfFoundInCatalog() { //given ExtensionServiceProvider provider = ExtensionServiceProvider.Create(typeof(FakeAzureServerDiscoveryProvider).SingleItemAsEnumerable()); //when IServerDiscoveryProvider serverDiscoveryProvider = ExtensionUtils.GetService(provider, new ServerDefinition("sqlserver", "azure")); Assert.NotNull(serverDiscoveryProvider); Assert.True(serverDiscoveryProvider is FakeAzureServerDiscoveryProvider); } [Fact] public void GetGetServiceOfExportableShouldReturnNullGivenSameTypeAsExportable() { //given ExtensionServiceProvider provider = ExtensionServiceProvider.Create(typeof(FakeAzureServerDiscoveryProvider).SingleItemAsEnumerable()); //when IServerDiscoveryProvider serverDiscoveryProvider = ExtensionUtils.GetService(provider, new ServerDefinition("sqlserver", "azure")); Assert.NotNull(serverDiscoveryProvider); FakeAzureServerDiscoveryProvider fakeAzureServerDiscovery = serverDiscoveryProvider as FakeAzureServerDiscoveryProvider; Assert.NotNull(fakeAzureServerDiscovery); Assert.Null(fakeAzureServerDiscovery.ServerDiscoveryProvider); } private IMultiServiceProvider CreateServiceProvider() { var providerMock = new Mock(); providerMock.Setup(x => x.GetServices()).Returns(_providers); providerMock.Setup(x => x.GetServices()).Returns(_accountManagers); return providerMock.Object; } } }