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);
        }
        public void L29_Service_Backup_Progress()
        {
            SearchService.InitializeForTest(new BackupManager_for_ProgressTest());
            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;
                }
            }

            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();

            AssertSequenceEqual(new[] { BackupState.Started, BackupState.Executing, BackupState.Finished }, states);
            AssertSequenceEqual(new long[] { 0, 42, 2 * 42, 3 * 42 }, bytes);
            AssertSequenceEqual(new [] { 0, 1, 2, 3 }, files);
            AssertSequenceEqual(new [] { "", "File1", "File2", "File3" }, names);
        }
        public void L29_Service_Backup_OnlyOne()
        {
            SearchService.InitializeForTest(new BackupManager_for_OnlyOneTest());
            var service = new SearchService();

            var tasks = Enumerable.Range(0, 5)
                        .Select(x => Task.Run(() => service.Backup(null, null)))
                        .ToArray();

            // ReSharper disable once CoVariantArrayConversion
            Task.WaitAll(tasks);

            var completed = new string(tasks
                                       .Select(t => (char)((int)'0' + (int)t.Result.State))
                                       .OrderBy(x => x)
                                       .ToArray());
            var faulted = new string(tasks
                                     .Select(t => t.IsFaulted ? 'Y' : 'n')
                                     .ToArray());

            // 1 = Started, 2 = AlreadyStarted,
            Assert.AreEqual("12222", completed);
            Assert.AreEqual("nnnnn", faulted);
        }