From 347d233e952701e1d223b61392bbdd76abe7f66c Mon Sep 17 00:00:00 2001 From: Udeesha Gautam <46980425+udeeshagautam@users.noreply.github.com> Date: Wed, 19 Jun 2019 09:49:50 -0700 Subject: [PATCH] Change to pass Schema compare Operation id from ADS (#828) * Changing that SC Operation id be passed from ADS and some test addition * Fixing typos --- .../Contracts/SchemaCompareOpenScmpRequest.cs | 2 +- .../Contracts/SchemaCompareRequest.cs | 5 ++ .../SchemaCompareOpenScmpOperation.cs | 4 +- .../SchemaCompare/SchemaCompareOperation.cs | 2 +- .../SchemaCompare/SchemaCompareService.cs | 23 ++++-- .../SchemaCompareServiceTests.cs | 74 +++++++++++++++---- 6 files changed, 85 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareOpenScmpRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareOpenScmpRequest.cs index a644f3b5..49d01ca2 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareOpenScmpRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareOpenScmpRequest.cs @@ -30,7 +30,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare.Contracts /// /// filepath of scmp /// - public string filePath { get; set; } + public string FilePath { get; set; } } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareRequest.cs index 9a031391..0f1621ed 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareRequest.cs @@ -50,6 +50,11 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare.Contracts /// public class SchemaCompareParams { + /// + /// Operation id of the schema compare operation + /// + public string OperationId { get; set; } + /// /// Gets or sets the source endpoint info /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOpenScmpOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOpenScmpOperation.cs index 7f6d9146..bd087293 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOpenScmpOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOpenScmpOperation.cs @@ -74,10 +74,10 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare try { - SchemaComparison compare = new SchemaComparison(this.Parameters.filePath); + SchemaComparison compare = new SchemaComparison(this.Parameters.FilePath); // load xml file because some parsing still needs to be done - this.scmpInfo = XDocument.Load(this.Parameters.filePath); + this.scmpInfo = XDocument.Load(this.Parameters.FilePath); this.Result = new SchemaCompareOpenScmpResult() { diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOperation.cs index 7567dc5e..0e28d45b 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareOperation.cs @@ -45,7 +45,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare this.Parameters = parameters; this.SourceConnectionString = SchemaCompareUtils.GetConnectionString(sourceConnInfo, parameters.SourceEndpointInfo.DatabaseName); this.TargetConnectionString = SchemaCompareUtils.GetConnectionString(targetConnInfo, parameters.TargetEndpointInfo.DatabaseName); - this.OperationId = Guid.NewGuid().ToString(); + this.OperationId = !string.IsNullOrEmpty(parameters.OperationId) ? parameters.OperationId : Guid.NewGuid().ToString(); } protected CancellationToken CancellationToken { get { return this.cancellation.Token; } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs index 20a7ae3c..94f1687d 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs @@ -96,6 +96,10 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare AreEqual = operation.ComparisonResult.IsEqual, Differences = operation.Differences }); + + // clean up cancellation action now that the operation is complete (using try remove to avoid exception) + Action cancelAction = null; + currentComparisonCancellationAction.Value.TryRemove(operation.OperationId, out cancelAction); } catch (Exception e) { @@ -126,7 +130,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare Action cancelAction = null; if (currentComparisonCancellationAction.Value.TryRemove(parameters.OperationId, out cancelAction)) { - if(cancelAction != null) + if (cancelAction != null) { cancelAction.Invoke(); await requestContext.SendResult(new ResultStatus() @@ -136,11 +140,14 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare }); } } - await requestContext.SendResult(new ResultStatus() + else { - Success = false, - ErrorMessage = SR.SchemaCompareSessionNotFound - }); + await requestContext.SendResult(new ResultStatus() + { + Success = false, + ErrorMessage = SR.SchemaCompareSessionNotFound + }); + } } catch (Exception e) @@ -183,7 +190,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare { Success = false, ErrorMessage = operation == null ? e.Message : operation.ErrorMessage, - }); + }); } } @@ -340,7 +347,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare { operation = new SchemaCompareSaveScmpOperation(parameters, sourceConnInfo, targetConnInfo); operation.Execute(parameters.TaskExecutionMode); - + await requestContext.SendResult(new ResultStatus() { Success = true, @@ -357,7 +364,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare ErrorMessage = operation == null ? e.Message : operation.ErrorMessage, }); } - }); + }); } catch (Exception e) { diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs index bd9f58bd..f0009248 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs @@ -528,8 +528,9 @@ CREATE TABLE [dbo].[table3] [Fact] public async Task VerifySchemaCompareServiceCalls() { - string operationId = null; + string operationId = Guid.NewGuid().ToString(); DiffEntry diffEntry = null; + bool cancelled = false; var connectionObject = SchemaCompareTestUtils.GetLiveAutoCompleteTestObjects(); SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, SourceScript, "SchemaCompareSource"); @@ -550,15 +551,35 @@ CREATE TABLE [dbo].[table3] // Schema compare service call var schemaCompareRequestContext = new Mock>(); schemaCompareRequestContext.Setup((RequestContext x) => x.SendResult(It.Is((diffResult) => - ValidateScResult(diffResult, ref diffEntry, ref operationId)))).Returns(Task.FromResult(new object())); + ValidateScResult(diffResult, out diffEntry, operationId, ref cancelled)))).Returns(Task.FromResult(new object())); var schemaCompareParams = new SchemaCompareParams { + OperationId = operationId, SourceEndpointInfo = sourceInfo, TargetEndpointInfo = targetInfo, DeploymentOptions = new DeploymentOptions() }; + await SchemaCompareService.Instance.HandleSchemaCompareRequest(schemaCompareParams, schemaCompareRequestContext.Object); + + // Schema compare Cancel call + var schemaCompareCancelRequestContext = new Mock>(); + schemaCompareCancelRequestContext.Setup((RequestContext x) => x.SendResult(It.Is((result) => + result.Success == true))).Returns(Task.FromResult(new object())); + + var schemaCompareCancelParams = new SchemaCompareCancelParams + { + OperationId = operationId + }; + + cancelled = true; + await SchemaCompareService.Instance.HandleSchemaCompareCancelRequest(schemaCompareCancelParams, schemaCompareCancelRequestContext.Object); + await SchemaCompareService.Instance.CurrentSchemaCompareTask; + + + // complete schema compare call for further testing + cancelled = false; await SchemaCompareService.Instance.HandleSchemaCompareRequest(schemaCompareParams, schemaCompareRequestContext.Object); await SchemaCompareService.Instance.CurrentSchemaCompareTask; @@ -615,7 +636,19 @@ CREATE TABLE [dbo].[table3] ScmpFilePath = scmpFilePath }; - await SchemaCompareService.Instance.HandleSchemaCompareSaveScmpRequest(saveScmpParams, publishRequestContext.Object); + await SchemaCompareService.Instance.HandleSchemaCompareSaveScmpRequest(saveScmpParams, saveScmpRequestContext.Object); + await SchemaCompareService.Instance.CurrentSchemaCompareTask; + + // Open Scmp service call + var openScmpRequestContext = new Mock>(); + openScmpRequestContext.Setup((RequestContext x) => x.SendResult(It.Is((result) => ValidateScmpRoundtrip(result, sourceDb.DatabaseName, targetDb.DatabaseName)))).Returns(Task.FromResult(new object())); + + var openScmpParams = new SchemaCompareOpenScmpParams + { + FilePath = scmpFilePath + }; + + await SchemaCompareService.Instance.HandleSchemaCompareOpenScmpRequest(openScmpParams, openScmpRequestContext.Object); await SchemaCompareService.Instance.CurrentSchemaCompareTask; SchemaCompareTestUtils.VerifyAndCleanup(scmpFilePath); } @@ -815,7 +848,7 @@ CREATE TABLE [dbo].[table3] var schemaCompareOpenScmpParams = new SchemaCompareOpenScmpParams { - filePath = filePath + FilePath = filePath }; SchemaCompareOpenScmpOperation schemaCompareOpenScmpOperation = new SchemaCompareOpenScmpOperation(schemaCompareOpenScmpParams); @@ -970,18 +1003,33 @@ CREATE TABLE [dbo].[table3] SchemaCompareTestUtils.VerifyAndCleanup(filePath); } - private bool ValidateScResult(SchemaCompareResult diffResult, ref DiffEntry diffEntry, ref string operationId) + private bool ValidateScResult(SchemaCompareResult diffResult, out DiffEntry diffEntry, string operationId, ref bool cancelled) { - try + if (cancelled) { - operationId = diffResult.OperationId; - diffEntry = diffResult.Differences.ElementAt(0); - return (diffResult.Success == true && diffResult.Differences != null && diffResult.Differences.Count > 0); - } - catch - { - return false; + Assert.True(diffResult.Differences == null, "Differences should be null after cancel"); + Assert.True(diffResult.Success == false, "Result success for schema compare should be false after cancel"); + diffEntry = null; + return true; } + + diffEntry = diffResult.Differences.ElementAt(0); + Assert.True(diffResult.Success == true, "Result success is false for schema compare"); + Assert.True(diffResult.Differences != null, "Schema compare Differences should not be null"); + Assert.True(diffResult.Differences.Count > 0, "Schema compare difference count should be greater than 0"); + Assert.True(diffResult.OperationId == operationId, $"Expected Operation id {operationId}. Actual {diffResult.OperationId}"); + return true; + } + + + private bool ValidateScmpRoundtrip(SchemaCompareOpenScmpResult result, string sourceName, string targetName) + { + Assert.True(true == result.Success, "Result Success is false"); + Assert.True(SchemaCompareEndpointType.Database == result.SourceEndpointInfo.EndpointType, $"Source Endpoint type does not match. Expected {SchemaCompareEndpointType.Database}. Actual {result.SourceEndpointInfo.EndpointType}"); + Assert.True(SchemaCompareEndpointType.Database == result.TargetEndpointInfo.EndpointType, $"Target Endpoint type does not match. Expected {SchemaCompareEndpointType.Database}. Actual {result.TargetEndpointInfo.EndpointType}"); + Assert.True(sourceName == result.SourceEndpointInfo.DatabaseName, $"Source Endpoint name does not match. Expected {sourceName}, Actual {result.SourceEndpointInfo.DatabaseName}"); + Assert.True(targetName == result.TargetEndpointInfo.DatabaseName, $"Source Endpoint name does not match. Expected {targetName}, Actual {result.TargetEndpointInfo.DatabaseName}"); + return true; } } }