private async Task <RestorePlanResponse> VerifyRestore(string backupFileName, bool canRestore, TaskExecutionModeFlag executionMode = TaskExecutionModeFlag.None, string targetDatabase = null) { return(await VerifyRestore(new string[] { backupFileName }, null, canRestore, executionMode, targetDatabase)); }
private async Task <RestorePlanResponse> VerifyRestore( string[] backupFileNames = null, string sourceDbName = null, bool canRestore = true, TaskExecutionModeFlag executionMode = TaskExecutionModeFlag.None, string targetDatabase = null, string[] selectedBackupSets = null, Dictionary <string, object> options = null, Func <Database, bool> verifyDatabase = null, bool shouldFail = false) { string backUpFilePath = string.Empty; if (backupFileNames != null) { var filePaths = backupFileNames.Select(x => GetBackupFilePath(x)); backUpFilePath = filePaths.Aggregate((current, next) => current + " ," + next); } using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { TestConnectionResult connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); RestoreDatabaseHelper service = new RestoreDatabaseHelper(); // If source database is sepecified verfiy it's part of source db list if (!string.IsNullOrEmpty(sourceDbName)) { RestoreConfigInfoResponse configInfoResponse = service.CreateConfigInfoResponse(new RestoreConfigInfoRequestParams { OwnerUri = queryTempFile.FilePath }); IEnumerable <string> dbNames = configInfoResponse.ConfigInfo[RestoreOptionsHelper.SourceDatabaseNamesWithBackupSets] as IEnumerable <string>; Assert.True(dbNames.Any(x => x == sourceDbName)); } var request = new RestoreParams { BackupFilePaths = backUpFilePath, TargetDatabaseName = targetDatabase, OwnerUri = queryTempFile.FilePath, SelectedBackupSets = selectedBackupSets, SourceDatabaseName = sourceDbName }; request.Options[RestoreOptionsHelper.ReadHeaderFromMedia] = backupFileNames != null; if (options != null) { foreach (var item in options) { if (!request.Options.ContainsKey(item.Key)) { request.Options.Add(item.Key, item.Value); } } } var restoreDataObject = service.CreateRestoreDatabaseTaskDataObject(request); restoreDataObject.ConnectionInfo = connectionResult.ConnectionInfo; var response = service.CreateRestorePlanResponse(restoreDataObject); Assert.NotNull(response); Assert.False(string.IsNullOrWhiteSpace(response.SessionId)); Assert.Equal(response.CanRestore, canRestore); if (canRestore) { Assert.True(response.DbFiles.Any()); if (string.IsNullOrEmpty(targetDatabase)) { targetDatabase = response.DatabaseName; } Assert.Equal(response.DatabaseName, targetDatabase); Assert.NotNull(response.PlanDetails); Assert.True(response.PlanDetails.Any()); Assert.NotNull(response.PlanDetails[RestoreOptionsHelper.BackupTailLog]); Assert.NotNull(response.PlanDetails[RestoreOptionsHelper.TailLogBackupFile]); Assert.NotNull(response.PlanDetails[RestoreOptionsHelper.DataFileFolder]); Assert.NotNull(response.PlanDetails[RestoreOptionsHelper.LogFileFolder]); Assert.NotNull(response.PlanDetails[RestoreOptionsHelper.StandbyFile]); Assert.NotNull(response.PlanDetails[RestoreOptionsHelper.StandbyFile]); if (executionMode != TaskExecutionModeFlag.None) { try { request.SessionId = response.SessionId; restoreDataObject = service.CreateRestoreDatabaseTaskDataObject(request); Assert.Equal(response.SessionId, restoreDataObject.SessionId); request.RelocateDbFiles = !restoreDataObject.DbFilesLocationAreValid(); restoreDataObject.Execute((TaskExecutionMode)Enum.Parse(typeof(TaskExecutionMode), executionMode.ToString())); if (executionMode.HasFlag(TaskExecutionModeFlag.Execute)) { Assert.True(restoreDataObject.Server.Databases.Contains(targetDatabase)); if (verifyDatabase != null) { Assert.True(verifyDatabase(restoreDataObject.Server.Databases[targetDatabase])); } //To verify the backupset that are restored, verifying the database is a better options. //Some tests still verify the number of backup sets that are executed which in some cases can be less than the selected list if (verifyDatabase == null && selectedBackupSets != null) { Assert.Equal(selectedBackupSets.Count(), restoreDataObject.RestorePlanToExecute.RestoreOperations.Count()); } } if (executionMode.HasFlag(TaskExecutionModeFlag.Script)) { Assert.False(string.IsNullOrEmpty(restoreDataObject.ScriptContent)); } } catch (Exception ex) { if (!shouldFail) { Assert.False(true, ex.Message); } } finally { await DropDatabase(targetDatabase); } } } return(response); } }
private async Task VerifyRestoreMultipleBackupSets(string[] backupFiles, int backupSetIndexToDelete, int[] expectedSelectedIndexes, TaskExecutionModeFlag executionMode = TaskExecutionModeFlag.ExecuteAndScript) { var testDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, null, "RestoreTest"); try { string targetDbName = testDb.DatabaseName; bool canRestore = true; var response = await VerifyRestore(backupFiles, null, canRestore, TaskExecutionModeFlag.None, targetDbName, null, null); Assert.True(response.BackupSetsToRestore.Count() >= 2); var allIds = response.BackupSetsToRestore.Select(x => x.Id).ToList(); if (backupSetIndexToDelete >= 0) { allIds.RemoveAt(backupSetIndexToDelete); } string[] selectedIds = allIds.ToArray(); Dictionary <string, object> options = new Dictionary <string, object>(); options.Add(RestoreOptionsHelper.ReplaceDatabase, true); response = await VerifyRestore(backupFiles, null, canRestore, executionMode, targetDbName, selectedIds, options, (database) => { if (executionMode.HasFlag(TaskExecutionModeFlag.Execute)) { bool tablesFound = true; for (int i = 0; i < tableNames.Length; i++) { string tableName = tableNames[i]; if (!database.Tables.Contains(tableName, "test") && expectedSelectedIndexes.Contains(i)) { tablesFound = false; break; } } bool numberOfTableCreatedIsCorrect = database.Tables.Count == expectedSelectedIndexes.Length; return(numberOfTableCreatedIsCorrect && tablesFound); } return(true); }); for (int i = 0; i < response.BackupSetsToRestore.Count(); i++) { DatabaseFileInfo databaseInfo = response.BackupSetsToRestore[i]; Assert.Equal(databaseInfo.IsSelected, expectedSelectedIndexes.Contains(i)); } } finally { if (testDb != null) { testDb.Cleanup(); } } }