public void L29_Service_Backup_Cancellation() { SearchService.InitializeForTest(new BackupManager_for_CancellationTest()); var service = new SearchService(); BackupResponse response; var responses = new List <BackupResponse>(); responses.Add(response = service.Backup(null, null)); var backupInfo = response.Current; Assert.IsNotNull(backupInfo); Assert.AreEqual(BackupState.Started, response.State); var timeout = TimeSpan.FromSeconds(5.0d); var timer = Stopwatch.StartNew(); while (timer.Elapsed < timeout) { Thread.Sleep(400); responses.Add(response = service.QueryBackup()); if (response.State != BackupState.Executing) { break; } } Thread.Sleep(400); responses.Add(service.CancelBackup()); Thread.Sleep(400); responses.Add(service.QueryBackup()); var states = responses.Select(r => r.State).Distinct().ToArray(); var bytes = responses.Select(r => (r.Current ?? r.History[0]).CopiedBytes).Distinct().ToArray(); var files = responses.Select(r => (r.Current ?? r.History[0]).CopiedFiles).Distinct().ToArray(); var names = responses.Select(r => (r.Current ?? r.History[0]).CurrentlyCopiedFile ?? "").Distinct().ToArray(); var messages = responses.Select(r => (r.Current ?? r.History[0]).Message ?? "").Distinct().ToArray(); var count = files.Length; var expectedStates = new[] { BackupState.Started, BackupState.Executing, BackupState.CancelRequested, BackupState.Canceled }; var expectedFiles = Enumerable.Range(0, count).ToArray(); var expectedBytes = expectedFiles.Select(x => x * 42L).ToArray(); var expectedNames = (new[] { "" }).Union(expectedFiles.Select(x => $"File{x + 1}")).ToArray(); AssertSequenceEqual(expectedStates, states); AssertSequenceEqual(expectedBytes, bytes); AssertSequenceEqual(expectedFiles, files); AssertSequenceEqual(expectedNames, names); }