// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using System; using System.Collections.Generic; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.Contracts; using Microsoft.SqlTools.ServiceLayer.DisasterRecovery.RestoreOperation; using Microsoft.SqlTools.ServiceLayer.Utility; using Moq; using Xunit; namespace Microsoft.SqlTools.ServiceLayer.UnitTests.DisasterRecovery { public class RestoreOptionsHelperTests { [Fact] public void VerifyOptionsCreatedSuccessfullyIsResponse() { GeneralRequestDetails optionValues = CreateOptionsTestData(); IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues); Dictionary result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); Assert.NotNull(result); VerifyOptions(result, optionValues); } [Fact] public void RelocateAllFilesShouldBeReadOnlyGivenNoDbFiles() { GeneralRequestDetails optionValues = CreateOptionsTestData(); optionValues.Options["DbFiles"] = new List(); IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues); Dictionary result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); Assert.NotNull(result); VerifyOptions(result, optionValues); Assert.True(result[RestoreOptionsHelper.RelocateDbFiles].IsReadOnly); } [Fact] public void BackupTailLogShouldBeReadOnlyTailLogBackupNotPossible() { GeneralRequestDetails optionValues = CreateOptionsTestData(); optionValues.Options["IsTailLogBackupPossible"] = false; IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues); Dictionary result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); Assert.NotNull(result); VerifyOptions(result, optionValues); Assert.True(result[RestoreOptionsHelper.BackupTailLog].IsReadOnly); Assert.True(result[RestoreOptionsHelper.TailLogBackupFile].IsReadOnly); } [Fact] public void TailLogWithNoRecoveryShouldBeReadOnlyTailLogBackupWithNoRecoveryNotPossible() { GeneralRequestDetails optionValues = CreateOptionsTestData(); optionValues.Options["IsTailLogBackupWithNoRecoveryPossible"] = false; IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues); Dictionary result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); Assert.NotNull(result); VerifyOptions(result, optionValues); Assert.True(result[RestoreOptionsHelper.TailLogWithNoRecovery].IsReadOnly); } [Fact] public void StandbyFileShouldNotBeReadOnlyGivenRecoveryStateWithStandBy() { GeneralRequestDetails optionValues = CreateOptionsTestData(); optionValues.Options[RestoreOptionsHelper.RecoveryState] = DatabaseRecoveryState.WithStandBy; IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues); Dictionary result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); Assert.NotNull(result); VerifyOptions(result, optionValues); Assert.False(result[RestoreOptionsHelper.StandbyFile].IsReadOnly); } [Fact] public void KeepReplicationShouldNotBeReadOnlyGivenRecoveryStateWithNoRecovery() { GeneralRequestDetails optionValues = CreateOptionsTestData(); optionValues.Options[RestoreOptionsHelper.RecoveryState] = DatabaseRecoveryState.WithNoRecovery; IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(optionValues); Dictionary result = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); Assert.NotNull(result); VerifyOptions(result, optionValues); Assert.True(result[RestoreOptionsHelper.KeepReplication].IsReadOnly); } [Fact] public void KeepReplicationShouldSetToDefaultValueGivenRecoveryStateWithNoRecovery() { RestoreParams restoreParams = CreateOptionsTestData(); restoreParams.Options[RestoreOptionsHelper.RecoveryState] = DatabaseRecoveryState.WithNoRecovery; IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(restoreParams); Dictionary options = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); restoreParams.Options[RestoreOptionsHelper.KeepReplication] = true; RestoreOptionsHelper.UpdateOptionsInPlan(restoreDatabaseTaskDataObject); bool actual = restoreDatabaseTaskDataObject.RestoreOptions.KeepReplication; bool expected = (bool)options[RestoreOptionsHelper.KeepReplication].DefaultValue; Assert.Equal(actual, expected); } [Fact] public void KeepReplicationShouldSetToValueInRequestGivenRecoveryStateWithRecovery() { RestoreParams restoreParams = CreateOptionsTestData(); restoreParams.Options[RestoreOptionsHelper.RecoveryState] = DatabaseRecoveryState.WithRecovery; IRestoreDatabaseTaskDataObject restoreDatabaseTaskDataObject = CreateRestoreDatabaseTaskDataObject(restoreParams); Dictionary options = RestoreOptionsHelper.CreateRestorePlanOptions(restoreDatabaseTaskDataObject); restoreParams.Options[RestoreOptionsHelper.KeepReplication] = true; RestoreOptionsHelper.UpdateOptionsInPlan(restoreDatabaseTaskDataObject); bool actual = restoreDatabaseTaskDataObject.RestoreOptions.KeepReplication; bool expected = true; Assert.Equal(actual, expected); } private RestoreParams CreateOptionsTestData() { RestoreParams optionValues = new RestoreParams(); optionValues.Options.Add(RestoreOptionsHelper.CloseExistingConnections, false); optionValues.Options.Add(RestoreOptionsHelper.DataFileFolder, "Data file folder"); optionValues.Options.Add("DbFiles", new List() { new DbFile("", '1', "") }); optionValues.Options.Add("DefaultDataFileFolder", "Default data file folder"); optionValues.Options.Add("DefaultLogFileFolder", "Default log file folder"); optionValues.Options.Add("IsTailLogBackupPossible", true); optionValues.Options.Add("IsTailLogBackupWithNoRecoveryPossible", true); optionValues.Options.Add("GetDefaultStandbyFile", "default standby file"); optionValues.Options.Add("GetDefaultTailLogbackupFile", "default tail log backup file"); optionValues.Options.Add("LogFilesFolder", "Log file folder"); optionValues.Options.Add("RelocateAllFiles", false); optionValues.Options.Add("TailLogBackupFile", "tail log backup file"); optionValues.Options.Add("TailLogWithNoRecovery", false); optionValues.Options.Add("BackupTailLog", false); optionValues.Options.Add(RestoreOptionsHelper.KeepReplication, false); optionValues.Options.Add("ReplaceDatabase", false); optionValues.Options.Add("SetRestrictedUser", false); optionValues.Options.Add("StandbyFile", "Stand by file"); optionValues.Options.Add(RestoreOptionsHelper.RecoveryState, DatabaseRecoveryState.WithNoRecovery.ToString()); return optionValues; } private IRestoreDatabaseTaskDataObject CreateRestoreDatabaseTaskDataObject(GeneralRequestDetails optionValues) { var restoreDataObject = new RestoreDatabaseTaskDataObjectStub(); restoreDataObject.CloseExistingConnections = optionValues.GetOptionValue(RestoreOptionsHelper.CloseExistingConnections); restoreDataObject.DataFilesFolder = optionValues.GetOptionValue(RestoreOptionsHelper.DataFileFolder); restoreDataObject.DbFiles = optionValues.GetOptionValue>("DbFiles"); restoreDataObject.DefaultDataFileFolder = optionValues.GetOptionValue("DefaultDataFileFolder"); restoreDataObject.DefaultLogFileFolder = optionValues.GetOptionValue("DefaultLogFileFolder"); restoreDataObject.IsTailLogBackupPossible = optionValues.GetOptionValue("IsTailLogBackupPossible"); restoreDataObject.IsTailLogBackupWithNoRecoveryPossible = optionValues.GetOptionValue("IsTailLogBackupWithNoRecoveryPossible"); restoreDataObject.DefaultStandbyFile = optionValues.GetOptionValue("GetDefaultStandbyFile"); restoreDataObject.DefaultTailLogbackupFile = optionValues.GetOptionValue("GetDefaultTailLogbackupFile"); restoreDataObject.LogFilesFolder = optionValues.GetOptionValue("LogFilesFolder"); restoreDataObject.RelocateAllFiles = optionValues.GetOptionValue("RelocateAllFiles"); restoreDataObject.TailLogBackupFile = optionValues.GetOptionValue("TailLogBackupFile"); restoreDataObject.TailLogWithNoRecovery = optionValues.GetOptionValue("TailLogWithNoRecovery"); restoreDataObject.BackupTailLog = optionValues.GetOptionValue("BackupTailLog"); restoreDataObject.RestoreParams = optionValues as RestoreParams; restoreDataObject.RestorePlan = null; RestoreOptions restoreOptions = new RestoreOptions(); restoreOptions.KeepReplication = optionValues.GetOptionValue(RestoreOptionsHelper.KeepReplication); restoreOptions.ReplaceDatabase = optionValues.GetOptionValue("ReplaceDatabase"); restoreOptions.SetRestrictedUser = optionValues.GetOptionValue("SetRestrictedUser"); restoreOptions.StandByFile = optionValues.GetOptionValue("StandbyFile"); restoreOptions.RecoveryState = optionValues.GetOptionValue(RestoreOptionsHelper.RecoveryState); restoreDataObject.RestoreOptions = restoreOptions; return restoreDataObject; } private void VerifyOptions(Dictionary optionInResponse, GeneralRequestDetails optionValues) { RestorePlanDetailInfo planDetailInfo = optionInResponse[RestoreOptionsHelper.DataFileFolder]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.DataFileFolder); Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue("RelocateAllFiles")); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue(RestoreOptionsHelper.DataFileFolder)); Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue("DefaultDataFileFolder")); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.LogFileFolder]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.LogFileFolder); Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue("RelocateAllFiles")); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("LogFilesFolder")); Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue("DefaultLogFileFolder")); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.RelocateDbFiles]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.RelocateDbFiles); Assert.Equal(planDetailInfo.IsReadOnly, (optionValues.GetOptionValue>("DbFiles").Count == 0)); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("LogFilesFolder")); Assert.Equal(planDetailInfo.DefaultValue, false); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.ReplaceDatabase]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.ReplaceDatabase); Assert.Equal(planDetailInfo.IsReadOnly, false); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("ReplaceDatabase")); Assert.Equal(planDetailInfo.DefaultValue, false); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.KeepReplication]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.KeepReplication); Assert.Equal(planDetailInfo.IsReadOnly, optionValues.GetOptionValue(RestoreOptionsHelper.RecoveryState) == DatabaseRecoveryState.WithNoRecovery); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue(RestoreOptionsHelper.KeepReplication)); Assert.Equal(planDetailInfo.DefaultValue, false); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.SetRestrictedUser]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.SetRestrictedUser); Assert.Equal(planDetailInfo.IsReadOnly, false); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("SetRestrictedUser")); Assert.Equal(planDetailInfo.DefaultValue, false); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.RecoveryState]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.RecoveryState); Assert.Equal(planDetailInfo.IsReadOnly, false); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue(RestoreOptionsHelper.RecoveryState).ToString()); Assert.Equal(planDetailInfo.DefaultValue, DatabaseRecoveryState.WithRecovery.ToString()); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.StandbyFile]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.StandbyFile); Assert.Equal(planDetailInfo.IsReadOnly, optionValues.GetOptionValue(RestoreOptionsHelper.RecoveryState) != DatabaseRecoveryState.WithStandBy); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("StandbyFile")); Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue("GetDefaultStandbyFile")); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.BackupTailLog]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.BackupTailLog); Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue("IsTailLogBackupPossible")); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("BackupTailLog")); Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue("IsTailLogBackupPossible")); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.TailLogBackupFile]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.TailLogBackupFile); Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue("IsTailLogBackupPossible") | !optionValues.GetOptionValue(RestoreOptionsHelper.BackupTailLog)); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("TailLogBackupFile")); Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue("GetDefaultTailLogbackupFile")); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.TailLogWithNoRecovery]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.TailLogWithNoRecovery); Assert.Equal(planDetailInfo.IsReadOnly, !optionValues.GetOptionValue("IsTailLogBackupWithNoRecoveryPossible") | !optionValues.GetOptionValue(RestoreOptionsHelper.BackupTailLog)); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("TailLogWithNoRecovery")); Assert.Equal(planDetailInfo.DefaultValue, optionValues.GetOptionValue("IsTailLogBackupWithNoRecoveryPossible")); Assert.Equal(planDetailInfo.IsVisiable, true); planDetailInfo = optionInResponse[RestoreOptionsHelper.CloseExistingConnections]; Assert.Equal(planDetailInfo.Name, RestoreOptionsHelper.CloseExistingConnections); Assert.Equal(planDetailInfo.IsReadOnly, false); Assert.Equal(planDetailInfo.CurrentValue, optionValues.GetOptionValue("CloseExistingConnections")); Assert.Equal(planDetailInfo.DefaultValue, false); Assert.Equal(planDetailInfo.IsVisiable, true); } } }