diff --git a/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SqlTaskManager.cs b/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SqlTaskManager.cs index 659aaabb..766cd95e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SqlTaskManager.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TaskServices/SqlTaskManager.cs @@ -166,7 +166,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TaskServices { tasks.TryGetValue(taskId, out taskToCancel); } - if(taskToCancel != null) + if (taskToCancel != null) { taskToCancel.Cancel(); } diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupOperationStub.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupOperationStub.cs index 3936d297..9a83086b 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupOperationStub.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupOperationStub.cs @@ -7,6 +7,7 @@ using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.ServiceLayer.Admin; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts; +using System; using System.Data.SqlClient; using System.Threading; @@ -17,6 +18,14 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery /// public class BackupOperationStub : IBackupOperation { + public SemaphoreSlim BackupSemaphore { get; set; } + + public BackupOperationStub() + { + this.BackupSemaphore = new SemaphoreSlim(0, 1); + } + + /// /// Initialize /// @@ -49,7 +58,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery /// public void PerformBackup() { - Thread.Sleep(500); + this.BackupSemaphore.Wait(TimeSpan.FromSeconds(5)); } /// diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupTests.cs index 491699c6..ad1cd65a 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/DisasterRecovery/BackupTests.cs @@ -13,14 +13,6 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { public class BackupTests { - private TaskMetadata taskMetaData = new TaskMetadata - { - ServerName = "server name", - DatabaseName = "database name", - Name = "Backup Database", - IsCancelable = true - }; - /// /// Create and run a backup task /// @@ -32,9 +24,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { DisasterRecoveryService service = new DisasterRecoveryService(); var mockBackupOperation = new Mock(); - this.taskMetaData.Data = mockBackupOperation.Object; - - SqlTask sqlTask = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); + TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object); + SqlTask sqlTask = manager.CreateTask(taskMetaData, service.BackupTaskAsync); Assert.NotNull(sqlTask); Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task => { @@ -55,11 +46,11 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery using (SqlTaskManager manager = new SqlTaskManager()) { DisasterRecoveryService service = new DisasterRecoveryService(); - var mockUtility = new Mock(); - this.taskMetaData.Data = mockUtility.Object; + var mockBackupOperation = new Mock(); + TaskMetadata taskMetaData = this.CreateTaskMetaData(mockBackupOperation.Object); - SqlTask sqlTask = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); - SqlTask sqlTask2 = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); + SqlTask sqlTask = manager.CreateTask(taskMetaData, service.BackupTaskAsync); + SqlTask sqlTask2 = manager.CreateTask(taskMetaData, service.BackupTaskAsync); Assert.NotNull(sqlTask); Assert.NotNull(sqlTask2); @@ -88,13 +79,14 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { IBackupOperation backupOperation = new BackupOperationStub(); DisasterRecoveryService service = new DisasterRecoveryService(); - this.taskMetaData.Data = backupOperation; - SqlTask sqlTask = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); + TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation); + SqlTask sqlTask = manager.CreateTask(taskMetaData, service.BackupTaskAsync); Assert.NotNull(sqlTask); Task taskToVerify = sqlTask.RunAsync().ContinueWith(Task => { Assert.Equal(SqlTaskStatus.Canceled, sqlTask.TaskStatus); Assert.Equal(sqlTask.IsCancelRequested, true); + ((BackupOperationStub)backupOperation).BackupSemaphore.Release(); manager.Reset(); }); @@ -113,11 +105,14 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { using (SqlTaskManager manager = new SqlTaskManager()) { - IBackupOperation backupOperation = new BackupOperationStub(); DisasterRecoveryService service = new DisasterRecoveryService(); - this.taskMetaData.Data = backupOperation; - SqlTask sqlTask = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); - SqlTask sqlTask2 = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); + IBackupOperation backupOperation = new BackupOperationStub(); + IBackupOperation backupOperation2 = new BackupOperationStub(); + TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation); + TaskMetadata taskMetaData2 = this.CreateTaskMetaData(backupOperation2); + + SqlTask sqlTask = manager.CreateTask(taskMetaData, service.BackupTaskAsync); + SqlTask sqlTask2 = manager.CreateTask(taskMetaData2, service.BackupTaskAsync); Assert.NotNull(sqlTask); Assert.NotNull(sqlTask2); @@ -125,6 +120,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { Assert.Equal(SqlTaskStatus.Canceled, sqlTask.TaskStatus); Assert.Equal(sqlTask.IsCancelRequested, true); + ((BackupOperationStub)backupOperation).BackupSemaphore.Release(); manager.Reset(); }); @@ -132,12 +128,12 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { Assert.Equal(SqlTaskStatus.Canceled, sqlTask2.TaskStatus); Assert.Equal(sqlTask2.IsCancelRequested, true); + ((BackupOperationStub)backupOperation2).BackupSemaphore.Release(); manager.Reset(); }); manager.CancelTask(sqlTask.TaskId); manager.CancelTask(sqlTask2.TaskId); - await Task.WhenAll(taskToVerify, taskToVerify2); } } @@ -152,11 +148,15 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { using (SqlTaskManager manager = new SqlTaskManager()) { - IBackupOperation backupOperation = new BackupOperationStub(); DisasterRecoveryService service = new DisasterRecoveryService(); - this.taskMetaData.Data = backupOperation; - SqlTask sqlTask = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); - SqlTask sqlTask2 = manager.CreateTask(this.taskMetaData, service.BackupTaskAsync); + IBackupOperation backupOperation = new BackupOperationStub(); + TaskMetadata taskMetaData = this.CreateTaskMetaData(backupOperation); + SqlTask sqlTask = manager.CreateTask(taskMetaData, service.BackupTaskAsync); + + var mockBackupOperation = new Mock(); + TaskMetadata taskMetaData2 = this.CreateTaskMetaData(mockBackupOperation.Object); + SqlTask sqlTask2 = manager.CreateTask(taskMetaData2, service.BackupTaskAsync); + Assert.NotNull(sqlTask); Assert.NotNull(sqlTask2); @@ -164,6 +164,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { Assert.Equal(SqlTaskStatus.Canceled, sqlTask.TaskStatus); Assert.Equal(sqlTask.IsCancelRequested, true); + ((BackupOperationStub)backupOperation).BackupSemaphore.Release(); manager.Reset(); }); @@ -173,8 +174,22 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery }); manager.CancelTask(sqlTask.TaskId); - await Task.WhenAll(taskToVerify, taskToVerify2); + await Task.WhenAll(taskToVerify, taskToVerify2); } } + + private TaskMetadata CreateTaskMetaData(object data) + { + TaskMetadata taskMetaData = new TaskMetadata + { + ServerName = "server name", + DatabaseName = "database name", + Name = "backup database", + IsCancelable = true, + Data = data + }; + + return taskMetaData; + } } }