From a6450eb180fddc6556bf4976f899be6fadb85d30 Mon Sep 17 00:00:00 2001 From: Udeesha Gautam <46980425+udeeshagautam@users.noreply.github.com> Date: Thu, 27 Jun 2019 15:55:26 -0700 Subject: [PATCH] Bug/schemacompare publish and script tasks to send back results (#830) * Fix Schema compare Publish and Script generation task to return back error messages correctly. * Elaborating test a bit more to cover tasks * Validate one task at a time for better clarity * send back only errors not whole messages since task view doesnt have a good way (other than hover text) to show long messages * Fixing the negative test cases --- .../SchemaCompareGenerateScriptOperation.cs | 5 +++ .../SchemaComparePublishChangesOperation.cs | 7 ++++ .../SchemaCompareServiceOptionsTests.cs | 17 +++++++-- .../SchemaCompareServiceTests.cs | 38 +++++++++++++++++-- 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs index 37302957..dfd36d2e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs @@ -69,6 +69,11 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare this.SqlTask.AddScript(SqlTaskStatus.Succeeded, ScriptGenerationResult.MasterScript); } } + if (!this.ScriptGenerationResult.Success) + { + ErrorMessage = this.ScriptGenerationResult.Message; + throw new Exception(ErrorMessage); + } } catch (Exception e) { diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaComparePublishChangesOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaComparePublishChangesOperation.cs index 3a32bb7c..16b5d0d7 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaComparePublishChangesOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaComparePublishChangesOperation.cs @@ -9,6 +9,7 @@ using Microsoft.SqlTools.Utility; using System; using System.Diagnostics; using System.IO; +using System.Linq; using System.Threading; namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare @@ -55,6 +56,12 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare try { this.PublishResult = this.ComparisonResult.PublishChangesToTarget(this.CancellationToken); + if (!this.PublishResult.Success) + { + // Sending only errors and warnings - because overall message might be too big for task view + ErrorMessage = string.Join(Environment.NewLine, this.PublishResult.Errors.Where(x => x.MessageType == SqlServer.Dac.DacMessageType.Error || x.MessageType == SqlServer.Dac.DacMessageType.Warning)); + throw new Exception(ErrorMessage); + } } catch (Exception e) { diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs index 5694543a..36486151 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs @@ -254,10 +254,19 @@ END }; SchemaCompareGenerateScriptOperation generateScriptOperation1 = new SchemaCompareGenerateScriptOperation(generateScriptParams1, schemaCompareOperation1.ComparisonResult); - generateScriptOperation1.Execute(TaskExecutionMode.Script); - // validate script generation failed because there were no differences - Assert.False(generateScriptOperation1.ScriptGenerationResult.Success); + try + { + generateScriptOperation1.Execute(TaskExecutionMode.Script); + Assert.True(false); //fail if it reaches here + } + catch (Exception ex) + { + // validate script generation failed because there were no differences + Assert.False(generateScriptOperation1.ScriptGenerationResult.Success); + Assert.Equal("Performing script generation is not possible for this comparison result.", generateScriptOperation1.ScriptGenerationResult.Message); + Assert.Equal("Performing script generation is not possible for this comparison result.", ex.Message); + } var schemaCompareParams2 = new SchemaCompareParams { @@ -382,7 +391,7 @@ END var schemaCompareRequestContext = new Mock>(); schemaCompareRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); schemaCompareRequestContext.Setup((RequestContext x) => x.SendResult(It.Is((options) => SchemaCompareTestUtils.ValidateOptionsEqualsDefault(options) == true))).Returns(Task.FromResult(new object())); - + SchemaCompareGetOptionsParams p = new SchemaCompareGetOptionsParams(); await SchemaCompareService.Instance.HandleSchemaCompareGetDefaultOptionsRequest(p, schemaCompareRequestContext.Object); } diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs index f0009248..983d936f 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs @@ -547,6 +547,7 @@ CREATE TABLE [dbo].[table3] targetInfo.EndpointType = SchemaCompareEndpointType.Database; targetInfo.DatabaseName = targetDb.DatabaseName; targetInfo.OwnerUri = connectionObject.ConnectionInfo.OwnerUri; + TaskService.Instance.TaskManager.Reset(); // Schema compare service call var schemaCompareRequestContext = new Mock>(); @@ -595,6 +596,7 @@ CREATE TABLE [dbo].[table3] }; await SchemaCompareService.Instance.HandleSchemaCompareGenerateScriptRequest(generateScriptParams, generateScriptRequestContext.Object); + ValidateTask(SR.GenerateScriptTaskName); // Publish service call var publishRequestContext = new Mock>(); @@ -602,14 +604,15 @@ CREATE TABLE [dbo].[table3] SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(targetDb.ConnectionString); - var publishParams = new SchemaCompareGenerateScriptParams + var publishParams = new SchemaComparePublishChangesParams { OperationId = operationId, TargetDatabaseName = targetDb.DatabaseName, TargetServerName = builder.DataSource, }; - await SchemaCompareService.Instance.HandleSchemaCompareGenerateScriptRequest(publishParams, publishRequestContext.Object); + await SchemaCompareService.Instance.HandleSchemaComparePublishChangesRequest(publishParams, publishRequestContext.Object); + ValidateTask(SR.PublishChangesTaskName); // Include/Exclude service call var excludeRequestContext = new Mock>(); @@ -650,7 +653,7 @@ CREATE TABLE [dbo].[table3] await SchemaCompareService.Instance.HandleSchemaCompareOpenScmpRequest(openScmpParams, openScmpRequestContext.Object); await SchemaCompareService.Instance.CurrentSchemaCompareTask; - SchemaCompareTestUtils.VerifyAndCleanup(scmpFilePath); + SchemaCompareTestUtils.VerifyAndCleanup(scmpFilePath); } finally { @@ -1021,7 +1024,6 @@ CREATE TABLE [dbo].[table3] return true; } - private bool ValidateScmpRoundtrip(SchemaCompareOpenScmpResult result, string sourceName, string targetName) { Assert.True(true == result.Success, "Result Success is false"); @@ -1031,5 +1033,33 @@ CREATE TABLE [dbo].[table3] Assert.True(targetName == result.TargetEndpointInfo.DatabaseName, $"Source Endpoint name does not match. Expected {targetName}, Actual {result.TargetEndpointInfo.DatabaseName}"); return true; } + + private void ValidateTask(string expectedTaskName) + { + int retry = 5; + Assert.True(TaskService.Instance.TaskManager.Tasks.Count == 1, $"Expected 1 task but found {TaskService.Instance.TaskManager.Tasks.Count} tasks"); + while (TaskService.Instance.TaskManager.Tasks.Any() && retry > 0) + { + if (!TaskService.Instance.TaskManager.HasCompletedTasks()) + { + System.Threading.Thread.Sleep(2000); + } + else + { + foreach (SqlTask sqlTask in TaskService.Instance.TaskManager.Tasks) + { + if (sqlTask.IsCompleted) + { + Assert.True(sqlTask.TaskStatus == SqlTaskStatus.Succeeded, $"Task {sqlTask.TaskMetadata.Name} expected to succeed but failed with {sqlTask.TaskStatus.ToString()}"); + Assert.True(sqlTask.TaskMetadata.Name.Equals(expectedTaskName), $"Unexpected Schema compare task name. Expected : {expectedTaskName}, Actual : {sqlTask.TaskMetadata.Name}"); + TaskService.Instance.TaskManager.RemoveCompletedTask(sqlTask); + } + } + } + retry--; + } + Assert.Equal(false, TaskService.Instance.TaskManager.Tasks.Any()); + TaskService.Instance.TaskManager.Reset(); + } } }