public void BeforeEach()
        {
            logSources         = Substitute.For <ILogSourcesManager>();
            telemetry          = Substitute.For <Telemetry.ITelemetryCollector>();
            mockedSyncContext  = new ManualSynchronizationContext();
            heartbeat          = Substitute.For <IHeartBeatTimer>();
            progressAggregator = Substitute.For <Progress.IProgressAggregator>();
            settingsAccessor   = Substitute.For <Settings.IGlobalSettingsAccessor>();
            logSource1         = Substitute.For <ILogSource>();
            logProviderFac1    = Substitute.For <ILogProviderFactory>();
            logSource1.Provider.Factory.Returns(logProviderFac1);
            logSource1.Provider.ConnectionParams.Returns(new ConnectionParams($"{ConnectionParamsKeys.PathConnectionParam}=/log.txt"));
            logSource1.Provider.Stats.Returns(new LogProviderStats()
            {
                ContentsEtag = null
            });
            logSourcePP1 = Substitute.For <ILogSourcePostprocessor>();
            logSourcePP1.Kind.Returns(PostprocessorKind.SequenceDiagram);
            pp1outputXmlSection = Substitute.For <Persistence.ISaxXMLStorageSection>();
            logSource1.LogSourceSpecificStorageEntry.OpenSaxXMLSection("postproc-sequencediagram.xml", Persistence.StorageSectionOpenFlag.ReadOnly).Returns(pp1outputXmlSection);
            pp1outputXmlSection.Reader.Returns(Substitute.For <XmlReader>());
            pp1PostprocessorOutput = Substitute.For <IPostprocessorOutputETag>();
            outputDataDeserializer = Substitute.For <IOutputDataDeserializer>();
            outputDataDeserializer.Deserialize(PostprocessorKind.SequenceDiagram, Arg.Any <LogSourcePostprocessorDeserializationParams>()).Returns(pp1PostprocessorOutput);
            pp1RunSummary = Substitute.For <IPostprocessorRunSummary>();
            logSourcePP1.Run(null).ReturnsForAnyArgs(Task.FromResult(pp1RunSummary));
            pp1RunSummary.GetLogSpecificSummary(null).ReturnsForAnyArgs((IPostprocessorRunSummary)null);

            manager = new LogJoint.Postprocessing.PostprocessorsManager(
                logSources, telemetry, mockedSyncContext, mockedSyncContext, heartbeat, progressAggregator, settingsAccessor, outputDataDeserializer, new TraceSourceFactory());

            manager.RegisterLogType(new LogSourceMetadata(logProviderFac1, logSourcePP1));
        }
        public void CanRunPostprocessingIfItWasNotRunBefore()
        {
            pp1outputXmlSection.Reader.Returns((XmlReader)null);
            EmitLogSource1Addition();
            mockedSyncContext.Deplete();

            var exposedOutput = manager.LogSourcePostprocessors.Single();

            Assert.AreSame(null, exposedOutput.OutputData);
            Assert.AreEqual(LogSourcePostprocessorState.Status.NeverRun, exposedOutput.OutputStatus);
            Assert.AreSame(null, exposedOutput.LastRunSummary);
            Assert.AreSame(new double?(), exposedOutput.Progress);
            Assert.AreEqual(logSource1, exposedOutput.LogSource);
            Assert.AreEqual(logSourcePP1, exposedOutput.Postprocessor);


            var pp1runResult = new TaskCompletionSource <IPostprocessorRunSummary>();

            logSourcePP1.Run(null).ReturnsForAnyArgs(pp1runResult.Task);

            Task runTask = manager.RunPostprocessors(
                new[] { exposedOutput }, null);

            mockedSyncContext.Deplete();
            Assert.IsFalse(runTask.IsCompleted);

            exposedOutput = manager.LogSourcePostprocessors.Single();
            Assert.AreSame(null, exposedOutput.OutputData);
            Assert.AreEqual(LogSourcePostprocessorState.Status.InProgress, exposedOutput.OutputStatus);
            Assert.AreSame(null, exposedOutput.LastRunSummary);
            Assert.AreSame(new double?(), exposedOutput.Progress);
            Assert.AreEqual(logSource1, exposedOutput.LogSource);
            Assert.AreEqual(logSourcePP1, exposedOutput.Postprocessor);


            pp1outputXmlSection.Reader.Returns(Substitute.For <XmlReader>());
            pp1runResult.SetResult(pp1RunSummary);
            mockedSyncContext.Deplete();
            Assert.IsTrue(runTask.IsCompleted);

            exposedOutput = manager.LogSourcePostprocessors.Single();
            Assert.AreEqual(LogSourcePostprocessorState.Status.Finished, exposedOutput.OutputStatus);
            Assert.AreSame(pp1PostprocessorOutput, exposedOutput.OutputData);
            Assert.AreSame(pp1RunSummary, exposedOutput.LastRunSummary);
            Assert.AreSame(new double?(), exposedOutput.Progress);
            Assert.AreEqual(logSource1, exposedOutput.LogSource);
            Assert.AreEqual(logSourcePP1, exposedOutput.Postprocessor);
        }