diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs index 99613436..85ca7984 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs @@ -69,7 +69,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlAssessment /// /// Gets the used to run assessment operations. /// - private Engine Engine { get; } = new Engine(); + internal Engine Engine { get; } = new Engine(); /// /// Gets the instance of the connection service, @@ -356,19 +356,23 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlAssessment foreach (var r in resultsList) { + var targetName = target.Type != SqlObjectType.Server + ? $"{target.ServerName}:{target.Name}" + : target.Name; + var item = new CheckInfo() - { - CheckId = r.Id, - Description = r.Description, - DisplayName = r.DisplayName, - HelpLink = r.HelpLink, - Level = r.Level.ToString(), - TargetName = $"{target.ServerName}/{target.Name}", - Tags = r.Tags.ToArray(), - TargetType = target.Type, - RulesetName = Engine.Configuration.DefaultRuleset.Name, - RulesetVersion = Engine.Configuration.DefaultRuleset.Version.ToString() - }; + { + CheckId = r.Id, + Description = r.Description, + DisplayName = r.DisplayName, + HelpLink = r.HelpLink, + Level = r.Level.ToString(), + TargetName = targetName, + Tags = r.Tags.ToArray(), + TargetType = target.Type, + RulesetName = Engine.Configuration.DefaultRuleset.Name, + RulesetVersion = Engine.Configuration.DefaultRuleset.Version.ToString() + }; result.Add(item); } @@ -379,20 +383,20 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlAssessment private AssessmentResultItem TranslateAssessmentResult(IAssessmentResult r) { var item = new AssessmentResultItem - { - CheckId = r.Check.Id, - Description = r.Check.Description, - DisplayName = r.Check.DisplayName, - HelpLink = r.Check.HelpLink, - Level = r.Check.Level.ToString(), - Message = r.Message, - TargetName = r.TargetPath, - Tags = r.Check.Tags.ToArray(), - TargetType = r.TargetType, - RulesetVersion = Engine.Configuration.DefaultRuleset.Version.ToString(), - RulesetName = Engine.Configuration.DefaultRuleset.Name, - Timestamp = r.Timestamp - }; + { + CheckId = r.Check.Id, + Description = r.Check.Description, + DisplayName = r.Check.DisplayName, + HelpLink = r.Check.HelpLink, + Level = r.Check.Level.ToString(), + Message = r.Message, + TargetName = r.TargetPath, + Tags = r.Check.Tags.ToArray(), + TargetType = r.TargetType, + RulesetVersion = Engine.Configuration.DefaultRuleset.Version.ToString(), + RulesetName = Engine.Configuration.DefaultRuleset.Name, + Timestamp = r.Timestamp + }; if (r is IAssessmentNote) { @@ -426,7 +430,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlAssessment Platform = server.Platform, ServerName = server.Name, Type = SqlObjectType.Database, - Urn = $"{server.Name}/{databaseName}", + Urn = $"{server.Name}:{databaseName}", Version = server.Version }; } diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlAssessment/SqlAssessmentServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlAssessment/SqlAssessmentServiceTests.cs index cd6bcd15..a98ee6b4 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlAssessment/SqlAssessmentServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SqlAssessment/SqlAssessmentServiceTests.cs @@ -5,12 +5,16 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; using System.Reflection; using System.Threading.Tasks; using Microsoft.SqlServer.Management.Assessment; using Microsoft.SqlTools.ServiceLayer.Connection; using Microsoft.SqlTools.ServiceLayer.Connection.Contracts; +using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection; using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility; using Microsoft.SqlTools.ServiceLayer.SqlAssessment; using Microsoft.SqlTools.ServiceLayer.SqlAssessment.Contracts; @@ -27,40 +31,57 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlAssessment private static readonly string[] AllowedSeverityLevels = { "Information", "Warning", "Critical" }; + [Fact] + public async void InvokeSqlAssessmentServerTest() + { + var liveConnection = LiveConnectionHelper.InitLiveConnectionInfo("master"); + + var connection = liveConnection.ConnectionInfo.AllConnections.FirstOrDefault(); + Debug.Assert(connection != null, "Live connection is always expected providing a connection"); + + var serverInfo = ReliableConnectionHelper.GetServerVersion(connection); + + var response = await CallAssessment( + nameof(SqlAssessmentService.InvokeSqlAssessment), + SqlObjectType.Server, + liveConnection); + + Assert.All( + response.Items, + i => + { + Assert.NotNull(i.Message); + Assert.NotEmpty(i.Message); + Assert.Equal(serverInfo.ServerName, i.TargetName); + + if (i.Kind == 0) + { + AssertInfoPresent(i); + } + }); + } + [Fact] public async void GetAssessmentItemsServerTest() { + var liveConnection = LiveConnectionHelper.InitLiveConnectionInfo("master"); + + var connection = liveConnection.ConnectionInfo.AllConnections.FirstOrDefault(); + Debug.Assert(connection != null, "Live connection is always expected providing a connection"); + + var serverInfo = ReliableConnectionHelper.GetServerVersion(connection); + var response = await CallAssessment( nameof(SqlAssessmentService.GetAssessmentItems), - SqlObjectType.Server); + SqlObjectType.Server, + liveConnection); Assert.All( response.Items, i => { AssertInfoPresent(i); - }); - } - - [Fact] - public async void InvokeSqlAssessmentServerTest() - { - var response = await CallAssessment( - nameof(SqlAssessmentService.InvokeSqlAssessment), - SqlObjectType.Server); - - - Assert.All( - response.Items, - i => - { - Assert.NotNull(i.Message); - Assert.NotEmpty(i.Message); - - if (i.Kind == 0) - { - AssertInfoPresent(i); - } + Assert.Equal(serverInfo.ServerName, i.TargetName); }); } @@ -68,16 +89,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlAssessment public async void GetAssessmentItemsDatabaseTest() { const string DatabaseName = "tempdb"; + var liveConnection = LiveConnectionHelper.InitLiveConnectionInfo(DatabaseName); var response = await CallAssessment( nameof(SqlAssessmentService.GetAssessmentItems), SqlObjectType.Database, - DatabaseName); + liveConnection); Assert.All( response.Items, i => { - StringAssert.EndsWith("/" + DatabaseName, i.TargetName); + StringAssert.EndsWith(":" + DatabaseName, i.TargetName); AssertInfoPresent(i); }); } @@ -86,16 +108,17 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlAssessment public async void InvokeSqlAssessmentIDatabaseTest() { const string DatabaseName = "tempdb"; + var liveConnection = LiveConnectionHelper.InitLiveConnectionInfo(DatabaseName); var response = await CallAssessment( nameof(SqlAssessmentService.InvokeSqlAssessment), SqlObjectType.Database, - DatabaseName); + liveConnection); Assert.All( response.Items, i => { - StringAssert.EndsWith("/" + DatabaseName, i.TargetName); + StringAssert.EndsWith(":" + DatabaseName, i.TargetName); Assert.NotNull(i.Message); Assert.NotEmpty(i.Message); @@ -109,10 +132,9 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlAssessment private static async Task> CallAssessment( string methodName, SqlObjectType sqlObjectType, - string databaseName = "master") + LiveConnectionHelper.TestConnectionResult liveConnection) where TResult : AssessmentItemInfo { - var liveConnection = LiveConnectionHelper.InitLiveConnectionInfo(databaseName); var connInfo = liveConnection.ConnectionInfo; AssessmentResult response; @@ -121,6 +143,8 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlAssessment TestServiceProvider.Instance.ConnectionService, TestServiceProvider.Instance.WorkspaceService)) { + AddTestRules(service); + string randomUri = Guid.NewGuid().ToString(); AssessmentParams requestParams = new AssessmentParams { OwnerUri = randomUri, TargetType = sqlObjectType }; @@ -164,6 +188,41 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SqlAssessment return response; } + private static void AddTestRules(SqlAssessmentService service) + { + const string TestRuleset = @" + { + 'name': 'Tags & Checks', + 'version': '0.3', + 'schemaVersion': '1.0', + 'rules': [ + { + 'id': 'ServerRule', + 'itemType': 'definition', + 'tags': [ 'Test' ], + 'displayName': 'Test server check', + 'description': 'This check always fails for testing purposes.', + 'message': 'This check intentionally fails', + 'target': { 'type': 'Server' } + }, + { + 'id': 'DatabaseRule', + 'itemType': 'definition', + 'tags': [ 'Test' ], + 'displayName': 'Test server check', + 'description': 'This check always fails for testing purposes.', + 'message': 'This check intentionally fails', + 'target': { 'type': 'Database' } + } + ] + } +"; + using (var reader = new StringReader(TestRuleset)) + { + service.Engine.PushRuleFactoryJson(reader); + } + } + private void AssertInfoPresent(AssessmentItemInfo item) { Assert.NotNull(item.CheckId);