From f7c86a80cac191e6b315ce68035613afb6ffe016 Mon Sep 17 00:00:00 2001 From: Kim Santiago <31145923+kisantia@users.noreply.github.com> Date: Mon, 10 Jun 2019 09:26:42 -0700 Subject: [PATCH] Open dacfx deploy script instead of saving to file path (#822) * open dacfx deploy script * moving test db cleanups into finally blocks --- .../Contracts/GenerateDeployScriptRequest.cs | 5 - .../DacFx/DacFxService.cs | 15 +- .../DacFx/GenerateDeployScriptOperation.cs | 22 +- .../SchemaCompareGenerateScriptOperation.cs | 28 +- .../DacFx/DacFxserviceTests.cs | 372 ++++++++++-------- .../SchemaCompareServiceOptionsTests.cs | 4 +- .../SchemaCompareServiceTests.cs | 6 +- .../SchemaCompare/SchemaCompareTestUtils.cs | 3 +- 8 files changed, 244 insertions(+), 211 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/DacFx/Contracts/GenerateDeployScriptRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/DacFx/Contracts/GenerateDeployScriptRequest.cs index d05ef8df..3d7dbbc0 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DacFx/Contracts/GenerateDeployScriptRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DacFx/Contracts/GenerateDeployScriptRequest.cs @@ -13,11 +13,6 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx.Contracts /// public class GenerateDeployScriptParams : DacFxParams { - /// - /// Gets or sets the filepath where to save the generated script - /// - public string ScriptFilePath { get; set; } - /// /// Gets or sets whether a Deployment Report should be generated during deploy. /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs b/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs index bf311aad..dc83d5b0 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs @@ -164,11 +164,12 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx { GenerateDeployScriptOperation operation = new GenerateDeployScriptOperation(parameters, connInfo); SqlTask sqlTask = null; - TaskMetadata metadata = TaskMetadata.Create(parameters, SR.GenerateScriptTaskName, operation, ConnectionServiceInstance); - - // want to show filepath in task history instead of server and database - metadata.ServerName = parameters.ScriptFilePath; - metadata.DatabaseName = string.Empty; + TaskMetadata metadata = new TaskMetadata(); + metadata.TaskOperation = operation; + metadata.TaskExecutionMode = parameters.TaskExecutionMode; + metadata.ServerName = connInfo.ConnectionDetails.ServerName; + metadata.DatabaseName = parameters.DatabaseName; + metadata.Name = SR.GenerateScriptTaskName; sqlTask = SqlTaskManagerInstance.CreateAndRun(metadata); @@ -275,9 +276,9 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx /// For testing purpose only /// /// - internal void PerformOperation(DacFxOperation operation) + internal void PerformOperation(DacFxOperation operation, TaskExecutionMode taskExecutionMode) { - operation.Execute(TaskExecutionMode.Execute); + operation.Execute(taskExecutionMode); } } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/DacFx/GenerateDeployScriptOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/DacFx/GenerateDeployScriptOperation.cs index d68cab29..e1fe7f6e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DacFx/GenerateDeployScriptOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DacFx/GenerateDeployScriptOperation.cs @@ -21,6 +21,8 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx { public GenerateDeployScriptParams Parameters { get; } + public PublishResult Result { get; set; } + public GenerateDeployScriptOperation(GenerateDeployScriptParams parameters, ConnectionInfo connInfo) : base(connInfo) { Validate.IsNotNull("parameters", parameters); @@ -34,15 +36,23 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx publishOptions.GenerateDeploymentReport = this.Parameters.GenerateDeploymentReport; publishOptions.CancelToken = this.CancellationToken; publishOptions.DeployOptions = this.GetDefaultDeployOptions(); - publishOptions.DatabaseScriptPath = this.Parameters.ScriptFilePath; - // master script is only used if the target is Azure SQL db and the script contains all operations that must be done against the master database - publishOptions.MasterDbScriptPath = Path.Combine(Path.GetDirectoryName(this.Parameters.ScriptFilePath), string.Concat("master_", Path.GetFileName(this.Parameters.ScriptFilePath))); - PublishResult result = this.DacServices.Script(dacpac, this.Parameters.DatabaseName, publishOptions); + this.Result = this.DacServices.Script(dacpac, this.Parameters.DatabaseName, publishOptions); - if(this.Parameters.GenerateDeploymentReport && !string.IsNullOrEmpty(this.Parameters.DeploymentReportFilePath)) + // tests don't create a SqlTask, so only add the script when the SqlTask isn't null + if (this.SqlTask != null) { - File.WriteAllText(this.Parameters.DeploymentReportFilePath, result.DeploymentReport); + this.SqlTask.AddScript(SqlTaskStatus.Succeeded, Result.DatabaseScript); + if (!string.IsNullOrEmpty(this.Result.MasterDbScript)) + { + // master script is only used if the target is Azure SQL db and the script contains all operations that must be done against the master database + this.SqlTask.AddScript(SqlTaskStatus.Succeeded, this.Result.MasterDbScript); + } + } + + if (this.Parameters.GenerateDeploymentReport && !string.IsNullOrEmpty(this.Parameters.DeploymentReportFilePath)) + { + File.WriteAllText(this.Parameters.DeploymentReportFilePath, this.Result.DeploymentReport); } } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs index 0a5c3d7c..7b09ed98 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs @@ -49,12 +49,6 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare } public void Execute(TaskExecutionMode mode) - { - Execute(); - AddScriptToTask(); - } - - public void Execute() { if (this.CancellationToken.IsCancellationRequested) { @@ -64,6 +58,17 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare try { this.ScriptGenerationResult = this.ComparisonResult.GenerateScript(this.Parameters.TargetDatabaseName); + + // tests don't create a SqlTask, so only add the script when the SqlTask isn't null + if (this.SqlTask != null) + { + this.SqlTask.AddScript(SqlTaskStatus.Succeeded, this.ScriptGenerationResult.Script); + if (!string.IsNullOrEmpty(this.ScriptGenerationResult.MasterScript)) + { + // master script is only used if the target is Azure SQL db and the script contains all operations that must be done against the master database + this.SqlTask.AddScript(SqlTaskStatus.Succeeded, ScriptGenerationResult.MasterScript); + } + } } catch (Exception e) { @@ -73,17 +78,6 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare } } - // Separated from Execute() since tests don't create SqlTasks - public void AddScriptToTask() - { - this.SqlTask.AddScript(SqlTaskStatus.Succeeded, this.ScriptGenerationResult.Script); - if (!string.IsNullOrEmpty(this.ScriptGenerationResult.MasterScript)) - { - // master script is only used if the target is Azure SQL db and the script contains all operations that must be done against the master database - this.SqlTask.AddScript(SqlTaskStatus.Succeeded, ScriptGenerationResult.MasterScript); - } - } - // The schema compare public api doesn't currently take a cancellation token so the operation can't be cancelled public void Cancel() { diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DacFx/DacFxserviceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DacFx/DacFxserviceTests.cs index 08cbf5a9..8e6a4ee4 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DacFx/DacFxserviceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/DacFx/DacFxserviceTests.cs @@ -57,19 +57,24 @@ CREATE TABLE [dbo].[table3] string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); Directory.CreateDirectory(folderPath); - var exportParams = new ExportParams + try { - DatabaseName = testdb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.bacpac", testdb.DatabaseName)) - }; + var exportParams = new ExportParams + { + DatabaseName = testdb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.bacpac", testdb.DatabaseName)) + }; - DacFxService service = new DacFxService(); - ExportOperation operation = new ExportOperation(exportParams, result.ConnectionInfo); - service.PerformOperation(operation); + DacFxService service = new DacFxService(); + ExportOperation operation = new ExportOperation(exportParams, result.ConnectionInfo); + service.PerformOperation(operation, TaskExecutionMode.Execute); - // cleanup - VerifyAndCleanup(exportParams.PackageFilePath); - testdb.Cleanup(); + VerifyAndCleanup(exportParams.PackageFilePath); + } + finally + { + testdb.Cleanup(); + } return requestContext; } @@ -78,42 +83,47 @@ CREATE TABLE [dbo].[table3] { // first export a bacpac var result = GetLiveAutoCompleteTestObjects(); - var exportRequestContext = new Mock>(); - exportRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); - - SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "DacFxImportTest"); - string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); - Directory.CreateDirectory(folderPath); - - var exportParams = new ExportParams - { - DatabaseName = sourceDb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.bacpac", sourceDb.DatabaseName)) - }; - - DacFxService service = new DacFxService(); - ExportOperation exportOperation = new ExportOperation(exportParams, result.ConnectionInfo); - service.PerformOperation(exportOperation); - - // import the created bacpac var importRequestContext = new Mock>(); importRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); - var importParams = new ImportParams + SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "DacFxImportTest"); + SqlTestDb targetDb = null; + string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); + Directory.CreateDirectory(folderPath); + + try { - PackageFilePath = exportParams.PackageFilePath, - DatabaseName = string.Concat(sourceDb.DatabaseName, "-imported") - }; + var exportParams = new ExportParams + { + DatabaseName = sourceDb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.bacpac", sourceDb.DatabaseName)) + }; - ImportOperation importOperation = new ImportOperation(importParams, result.ConnectionInfo); - service.PerformOperation(importOperation); - SqlTestDb targetDb = SqlTestDb.CreateFromExisting(importParams.DatabaseName); + DacFxService service = new DacFxService(); + ExportOperation exportOperation = new ExportOperation(exportParams, result.ConnectionInfo); + service.PerformOperation(exportOperation, TaskExecutionMode.Execute); - // cleanup - VerifyAndCleanup(exportParams.PackageFilePath); - sourceDb.Cleanup(); - targetDb.Cleanup(); + // import the created bacpac + var importParams = new ImportParams + { + PackageFilePath = exportParams.PackageFilePath, + DatabaseName = string.Concat(sourceDb.DatabaseName, "-imported") + }; + ImportOperation importOperation = new ImportOperation(importParams, result.ConnectionInfo); + service.PerformOperation(importOperation, TaskExecutionMode.Execute); + targetDb = SqlTestDb.CreateFromExisting(importParams.DatabaseName); + + VerifyAndCleanup(exportParams.PackageFilePath); + } + finally + { + sourceDb.Cleanup(); + if (targetDb != null) + { + targetDb.Cleanup(); + } + } return importRequestContext; } @@ -127,22 +137,26 @@ CREATE TABLE [dbo].[table3] string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); Directory.CreateDirectory(folderPath); - var extractParams = new ExtractParams + try { - DatabaseName = testdb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", testdb.DatabaseName)), - ApplicationName = "test", - ApplicationVersion = "1.0.0.0" - }; + var extractParams = new ExtractParams + { + DatabaseName = testdb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", testdb.DatabaseName)), + ApplicationName = "test", + ApplicationVersion = "1.0.0.0" + }; - DacFxService service = new DacFxService(); - ExtractOperation operation = new ExtractOperation(extractParams, result.ConnectionInfo); - service.PerformOperation(operation); - - // cleanup - VerifyAndCleanup(extractParams.PackageFilePath); - testdb.Cleanup(); + DacFxService service = new DacFxService(); + ExtractOperation operation = new ExtractOperation(extractParams, result.ConnectionInfo); + service.PerformOperation(operation, TaskExecutionMode.Execute); + VerifyAndCleanup(extractParams.PackageFilePath); + } + finally + { + testdb.Cleanup(); + } return requestContext; } @@ -150,46 +164,50 @@ CREATE TABLE [dbo].[table3] { // first extract a db to have a dacpac to import later var result = GetLiveAutoCompleteTestObjects(); - var extractRequestContext = new Mock>(); - extractRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); - - SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "DacFxDeployTest"); - string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); - Directory.CreateDirectory(folderPath); - - var extractParams = new ExtractParams - { - DatabaseName = sourceDb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", sourceDb.DatabaseName)), - ApplicationName = "test", - ApplicationVersion = "1.0.0.0" - }; - - DacFxService service = new DacFxService(); - ExtractOperation extractOperation = new ExtractOperation(extractParams, result.ConnectionInfo); - service.PerformOperation(extractOperation); - - // deploy the created dacpac var deployRequestContext = new Mock>(); deployRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); + SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "DacFxDeployTest"); + SqlTestDb targetDb = null; + string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); + Directory.CreateDirectory(folderPath); - var deployParams = new DeployParams + try { - PackageFilePath = extractParams.PackageFilePath, - DatabaseName = string.Concat(sourceDb.DatabaseName, "-deployed"), - UpgradeExisting = false - }; + var extractParams = new ExtractParams + { + DatabaseName = sourceDb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", sourceDb.DatabaseName)), + ApplicationName = "test", + ApplicationVersion = "1.0.0.0" + }; - DeployOperation deployOperation = new DeployOperation(deployParams, result.ConnectionInfo); - service.PerformOperation(deployOperation); - SqlTestDb targetDb = SqlTestDb.CreateFromExisting(deployParams.DatabaseName); + DacFxService service = new DacFxService(); + ExtractOperation extractOperation = new ExtractOperation(extractParams, result.ConnectionInfo); + service.PerformOperation(extractOperation, TaskExecutionMode.Execute); - // cleanup - VerifyAndCleanup(extractParams.PackageFilePath); - sourceDb.Cleanup(); - targetDb.Cleanup(); + // deploy the created dacpac + var deployParams = new DeployParams + { + PackageFilePath = extractParams.PackageFilePath, + DatabaseName = string.Concat(sourceDb.DatabaseName, "-deployed"), + UpgradeExisting = false + }; + DeployOperation deployOperation = new DeployOperation(deployParams, result.ConnectionInfo); + service.PerformOperation(deployOperation, TaskExecutionMode.Execute); + targetDb = SqlTestDb.CreateFromExisting(deployParams.DatabaseName); + + VerifyAndCleanup(extractParams.PackageFilePath); + } + finally + { + sourceDb.Cleanup(); + if (targetDb != null) + { + targetDb.Cleanup(); + } + } return deployRequestContext; } @@ -203,33 +221,36 @@ CREATE TABLE [dbo].[table3] string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); Directory.CreateDirectory(folderPath); - var exportParams = new ExportParams - { - DatabaseName = testdb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.bacpac", testdb.DatabaseName)) - }; - - DacFxService service = new DacFxService(); - ExportOperation operation = new ExportOperation(exportParams, result.ConnectionInfo); - - // set cancellation token to cancel - operation.Cancel(); - OperationCanceledException expectedException = null; - try { - service.PerformOperation(operation); + var exportParams = new ExportParams + { + DatabaseName = testdb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.bacpac", testdb.DatabaseName)) + }; + + DacFxService service = new DacFxService(); + ExportOperation operation = new ExportOperation(exportParams, result.ConnectionInfo); + + // set cancellation token to cancel + operation.Cancel(); + OperationCanceledException expectedException = null; + + try + { + service.PerformOperation(operation, TaskExecutionMode.Execute); + } + catch (OperationCanceledException canceledException) + { + expectedException = canceledException; + } + + Assert.NotNull(expectedException); } - catch (OperationCanceledException canceledException) + finally { - expectedException = canceledException; + testdb.Cleanup(); } - - Assert.NotNull(expectedException); - - // cleanup - testdb.Cleanup(); - return requestContext; } @@ -239,95 +260,106 @@ CREATE TABLE [dbo].[table3] { // first extract a dacpac var result = GetLiveAutoCompleteTestObjects(); - var extractRequestContext = new Mock>(); - extractRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); - - SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "DacFxGenerateScriptTest"); - string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); - Directory.CreateDirectory(folderPath); - - var extractParams = new ExtractParams - { - DatabaseName = sourceDb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", sourceDb.DatabaseName)), - ApplicationName = "test", - ApplicationVersion = "1.0.0.0" - }; - - DacFxService service = new DacFxService(); - ExtractOperation extractOperation = new ExtractOperation(extractParams, result.ConnectionInfo); - service.PerformOperation(extractOperation); - - // generate script var generateScriptRequestContext = new Mock>(); generateScriptRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); + SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, SourceScript, "DacFxGenerateScriptTest"); + SqlTestDb targetDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "DacFxGenerateScriptTest"); - var generateScriptParams = new GenerateDeployScriptParams + string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); + Directory.CreateDirectory(folderPath); + + try { - PackageFilePath = extractParams.PackageFilePath, - DatabaseName = string.Concat(sourceDb.DatabaseName, "-deployed"), - ScriptFilePath = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "UpgradeDACScript.sql")) - }; + var extractParams = new ExtractParams + { + DatabaseName = sourceDb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", sourceDb.DatabaseName)), + ApplicationName = "test", + ApplicationVersion = "1.0.0.0" + }; - GenerateDeployScriptOperation generateScriptOperation = new GenerateDeployScriptOperation(generateScriptParams, result.ConnectionInfo); - service.PerformOperation(generateScriptOperation); - SqlTestDb targetDb = SqlTestDb.CreateFromExisting(generateScriptParams.DatabaseName); + DacFxService service = new DacFxService(); + ExtractOperation extractOperation = new ExtractOperation(extractParams, result.ConnectionInfo); + service.PerformOperation(extractOperation, TaskExecutionMode.Execute); - // cleanup - VerifyAndCleanup(generateScriptParams.ScriptFilePath); - VerifyAndCleanup(extractParams.PackageFilePath); - sourceDb.Cleanup(); - targetDb.Cleanup(); + // generate script + var generateScriptParams = new GenerateDeployScriptParams + { + PackageFilePath = extractParams.PackageFilePath, + DatabaseName = targetDb.DatabaseName + }; + // Generate script for deploying source dacpac to target db + GenerateDeployScriptOperation generateScriptOperation = new GenerateDeployScriptOperation(generateScriptParams, result.ConnectionInfo); + service.PerformOperation(generateScriptOperation, TaskExecutionMode.Script); + + // Verify script was generated + Assert.NotEmpty(generateScriptOperation.Result.DatabaseScript); + Assert.Contains("CREATE TABLE", generateScriptOperation.Result.DatabaseScript); + + VerifyAndCleanup(extractParams.PackageFilePath); + } + finally + { + sourceDb.Cleanup(); + targetDb.Cleanup(); + } return generateScriptRequestContext; } private async Task>> SendAndValidateGenerateDeployPlanRequest() { var result = GetLiveAutoCompleteTestObjects(); - SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, SourceScript, "DacFxGenerateDeployPlanTest"); + var generateDeployPlanRequestContext = new Mock>(); + generateDeployPlanRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); + SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, SourceScript, "DacFxGenerateDeployPlanTest"); + SqlTestDb targetDb = null; DacFxService service = new DacFxService(); string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "DacFxTest"); Directory.CreateDirectory(folderPath); - var extractParams = new ExtractParams + try { - DatabaseName = sourceDb.DatabaseName, - PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", sourceDb.DatabaseName)), - ApplicationName = "test", - ApplicationVersion = "1.0.0.0" - }; + var extractParams = new ExtractParams + { + DatabaseName = sourceDb.DatabaseName, + PackageFilePath = Path.Combine(folderPath, string.Format("{0}.dacpac", sourceDb.DatabaseName)), + ApplicationName = "test", + ApplicationVersion = "1.0.0.0" + }; - ExtractOperation extractOperation = new ExtractOperation(extractParams, result.ConnectionInfo); - service.PerformOperation(extractOperation); + ExtractOperation extractOperation = new ExtractOperation(extractParams, result.ConnectionInfo); + service.PerformOperation(extractOperation, TaskExecutionMode.Execute); - // generate deploy plan for deploying dacpac to targetDb - var generateDeployPlanRequestContext = new Mock>(); - generateDeployPlanRequestContext.Setup(x => x.SendResult(It.IsAny())).Returns(Task.FromResult(new object())); + // generate deploy plan for deploying dacpac to targetDb + targetDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, TargetScript, "DacFxGenerateDeployPlanTestTarget"); - SqlTestDb targetDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, TargetScript, "DacFxGenerateDeployPlanTestTarget"); + var generateDeployPlanParams = new GenerateDeployPlanParams + { + PackageFilePath = extractParams.PackageFilePath, + DatabaseName = targetDb.DatabaseName, + }; - var generateDeployPlanParams = new GenerateDeployPlanParams + GenerateDeployPlanOperation generateDeployPlanOperation = new GenerateDeployPlanOperation(generateDeployPlanParams, result.ConnectionInfo); + service.PerformOperation(generateDeployPlanOperation, TaskExecutionMode.Execute); + string report = generateDeployPlanOperation.DeployReport; + Assert.NotNull(report); + Assert.Contains("Create", report); + Assert.Contains("Drop", report); + Assert.Contains("Alter", report); + + VerifyAndCleanup(extractParams.PackageFilePath); + } + finally { - PackageFilePath = extractParams.PackageFilePath, - DatabaseName = targetDb.DatabaseName, - }; - - GenerateDeployPlanOperation generateDeployPlanOperation = new GenerateDeployPlanOperation(generateDeployPlanParams, result.ConnectionInfo); - service.PerformOperation(generateDeployPlanOperation); - string report = generateDeployPlanOperation.DeployReport; - Assert.NotNull(report); - Assert.Contains("Create", report); - Assert.Contains("Drop", report); - Assert.Contains("Alter", report); - - // cleanup - VerifyAndCleanup(extractParams.PackageFilePath); - sourceDb.Cleanup(); - targetDb.Cleanup(); - + sourceDb.Cleanup(); + if (targetDb != null) + { + targetDb.Cleanup(); + } + } return generateDeployPlanRequestContext; } diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs index f30b4f2e..7a8ece6c 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs @@ -266,7 +266,7 @@ END }; SchemaCompareGenerateScriptOperation generateScriptOperation1 = new SchemaCompareGenerateScriptOperation(generateScriptParams1, schemaCompareOperation1.ComparisonResult); - generateScriptOperation1.Execute(); + generateScriptOperation1.Execute(TaskExecutionMode.Script); // validate script generation failed because there were no differences Assert.False(generateScriptOperation1.ScriptGenerationResult.Success); @@ -293,7 +293,7 @@ END }; SchemaCompareGenerateScriptOperation generateScriptOperation2 = new SchemaCompareGenerateScriptOperation(generateScriptParams2, schemaCompareOperation2.ComparisonResult); - generateScriptOperation2.Execute(); + generateScriptOperation2.Execute(TaskExecutionMode.Script); // validate script generation succeeded Assert.True(generateScriptOperation2.ScriptGenerationResult.Success); diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs index 64bb84ec..2e7d3cf0 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs @@ -448,7 +448,7 @@ CREATE TABLE [dbo].[table3] Assert.NotNull(schemaCompareOperation.ComparisonResult.Differences); SchemaCompareGenerateScriptOperation generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult); - generateScriptOperation.Execute(); + generateScriptOperation.Execute(TaskExecutionMode.Script); Assert.True(generateScriptOperation.ScriptGenerationResult.Success); string initialScript = generateScriptOperation.ScriptGenerationResult.Script; @@ -472,7 +472,7 @@ CREATE TABLE [dbo].[table3] Assert.True(initial == afterExclude, $"Changes should be same again after excluding/including, before {initial}, now {afterExclude}"); generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult); - generateScriptOperation.Execute(); + generateScriptOperation.Execute(TaskExecutionMode.Script); Assert.True(generateScriptOperation.ScriptGenerationResult.Success); string afterExcludeScript = generateScriptOperation.ScriptGenerationResult.Script; @@ -493,7 +493,7 @@ CREATE TABLE [dbo].[table3] Assert.True(initial == afterInclude, $"Changes should be same again after excluding/including:{initial}, now {afterInclude}"); generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult); - generateScriptOperation.Execute(); + generateScriptOperation.Execute(TaskExecutionMode.Script); Assert.True(generateScriptOperation.ScriptGenerationResult.Success); string afterIncludeScript = generateScriptOperation.ScriptGenerationResult.Script; diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareTestUtils.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareTestUtils.cs index f764304d..9393f311 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareTestUtils.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareTestUtils.cs @@ -6,6 +6,7 @@ using Microsoft.SqlTools.ServiceLayer.DacFx; using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts; using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility; +using Microsoft.SqlTools.ServiceLayer.TaskServices; using Microsoft.SqlTools.ServiceLayer.Test.Common; using NUnit.Framework; using System; @@ -44,7 +45,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.SchemaCompare DacFxService service = new DacFxService(); ExtractOperation operation = new ExtractOperation(extractParams, result.ConnectionInfo); - service.PerformOperation(operation); + service.PerformOperation(operation, TaskExecutionMode.Execute); return extractParams.PackageFilePath; }