diff --git a/AltCover.Engine/Runner.fs b/AltCover.Engine/Runner.fs index 1f6f8e4b..4632c595 100644 --- a/AltCover.Engine/Runner.fs +++ b/AltCover.Engine/Runner.fs @@ -1380,10 +1380,18 @@ module internal Runner = let (container, file) = Zip.openUpdate report zipped - try - if format &&& ReportFormat.TrackMask = ReportFormat.NativeJson then - writeNativeJsonReport hits format file arg - else + use container' = container + use file' = file + + if format &&& ReportFormat.TrackMask = ReportFormat.NativeJson then + writeNativeJsonReport hits format file arg + else + use outputFile = + match arg with + | None -> file + | _ -> new MemoryStream() :> Stream + + let result = AltCover.Counter.doFlushStream (postProcess hits format) pointProcess @@ -1391,12 +1399,15 @@ module internal Runner = hits format file - arg - finally - file.Dispose() + outputFile + + match arg with + | None -> () + | Some x -> + outputFile.Position <- 0l + Zip.save (outputFile.CopyTo) x zipped - if container.IsNotNull then - container.Dispose() + result reporter diff --git a/AltCover.Recorder.Tests/Recorder.Tests.fs b/AltCover.Recorder.Tests/Recorder.Tests.fs index eda014cf..d9143889 100644 --- a/AltCover.Recorder.Tests/Recorder.Tests.fs +++ b/AltCover.Recorder.Tests/Recorder.Tests.fs @@ -2019,7 +2019,6 @@ module AltCoverTests = #if !NET20 [] -#endif let ZipFlushLeavesExpectedTraces () = getMyMethodName "=>" @@ -2140,6 +2139,7 @@ module AltCoverTests = AltCoverCoreTests.maybeIOException (fun () -> Directory.Delete(unique)))) getMyMethodName "<=" +#endif [] let ShouldCreateDummyAttribute () = diff --git a/AltCover.Recorder/Base.fs b/AltCover.Recorder/Base.fs index 269b1ec3..1335a70b 100644 --- a/AltCover.Recorder/Base.fs +++ b/AltCover.Recorder/Base.fs @@ -424,8 +424,14 @@ module internal Counter = | _ -> addSingleVisit counts moduleId hitPointId context 1L -#endif + [] + let doFlushStream postProcess pointProcess own counts format coverageFile outputFile = + I.doFlush postProcess pointProcess own counts format coverageFile outputFile + +#else [] @@ -463,7 +469,6 @@ module internal Counter = I.doFlush postProcess pointProcess own counts format coverageFile outputFile -#if !RUNNER [] diff --git a/AltCover.Tests/Expecto.fs b/AltCover.Tests/Expecto.fs index 42f052b7..e0881028 100644 --- a/AltCover.Tests/Expecto.fs +++ b/AltCover.Tests/Expecto.fs @@ -38,10 +38,14 @@ module ExpectoTestManifest = "Runner.RepeatVisitsShouldIncrementTotal" Tests.AltCoverRunnerTests.KnownModuleWithPayloadMakesExpectedChangeInOpenCover, "Runner.KnownModuleWithPayloadMakesExpectedChangeInOpenCover" - Tests.AltCoverRunnerTests.FlushLeavesExpectedTraces, - "Runner.FlushLeavesExpectedTraces" - Tests.AltCoverRunnerTests.FlushLeavesExpectedTracesWhenDiverted, - "Runner.FlushLeavesExpectedTracesWhenDiverted" + Tests.AltCoverRunnerTests.DivertedWriteLeavesExpectedTraces, + "Runner.DivertedWriteLeavesExpectedTraces" + Tests.AltCoverRunnerTests.DivertedWriteJsonLeavesExpectedTraces, + "Runner.DivertedWriteJsonLeavesExpectedTraces" + Tests.AltCoverRunnerTests.DivertedZipWriteLeavesExpectedTraces, + "Runner.DivertedZipWriteLeavesExpectedTraces" + Tests.AltCoverRunnerTests.DivertedZipWriteJsonLeavesExpectedTraces, + "Runner.DivertedZipWriteJsonLeavesExpectedTraces" Tests.AltCoverRunnerTests.NCoverShouldGeneratePlausibleJson, "Runner.NCoverShouldGeneratePlausibleJson" Tests.AltCoverRunnerTests.OpenCoverShouldGeneratePlausibleJson, diff --git a/AltCover.Tests/Runner.Tests.fs b/AltCover.Tests/Runner.Tests.fs index 522f9b33..b31d616c 100644 --- a/AltCover.Tests/Runner.Tests.fs +++ b/AltCover.Tests/Runner.Tests.fs @@ -301,208 +301,6 @@ module AltCoverRunnerTests = Is.EquivalentTo [ "2"; "2" ] ) - [] - let FlushLeavesExpectedTraces () = - Runner.init () - let saved = Console.Out - let here = Directory.GetCurrentDirectory() - - let where = - Assembly.GetExecutingAssembly().Location - |> Path.GetDirectoryName - - let unique = - Path.Combine(where, Guid.NewGuid().ToString()) - - let reportFile = - Path.Combine(unique, "FlushLeavesExpectedTraces.xml") - - try - let visits = - new Dictionary>() - - use stdout = new StringWriter() - Console.SetOut stdout - Directory.CreateDirectory(unique) |> ignore - Directory.SetCurrentDirectory(unique) - - Counter.measureTime <- - DateTime.ParseExact("2017-12-29T16:33:40.9564026+00:00", "o", null) - - use stream = - Assembly - .GetExecutingAssembly() - .GetManifestResourceStream(resource) - - let size = int stream.Length - let buffer = Array.create size 0uy - Assert.That(stream.Read(buffer, 0, size), Is.EqualTo size) - - do - use worker = - new FileStream(reportFile, FileMode.CreateNew) - - worker.Write(buffer, 0, size) - () - - let payload = Dictionary() - - [ 0..9 ] - |> Seq.iter (fun i -> payload.[i] <- init (int64 (i + 1)) []) - - visits.["f6e3edb3-fb20-44b3-817d-f69d1a22fc2f"] <- payload - - do - use coverageFile = - new FileStream( - reportFile, - FileMode.Open, - FileAccess.ReadWrite, - FileShare.None, - 4096, - FileOptions.SequentialScan - ) - - Counter.doFlushStream - ignore - (fun _ _ -> ()) - true - visits - AltCover.ReportFormat.NCover - coverageFile - None - |> ignore - - use worker' = - new FileStream(reportFile, FileMode.Open) - - let after = XmlDocument() - after.Load worker' - - Assert.That( - after.SelectNodes("//seqpnt") - |> Seq.cast - |> Seq.map _.GetAttribute("visitcount"), - Is.EquivalentTo - [ "11" - "10" - "9" - "8" - "7" - "6" - "4" - "3" - "2" - "1" ] - ) - finally - maybeDeleteFile reportFile - Console.SetOut saved - Directory.SetCurrentDirectory(here) - maybeIOException (fun () -> Directory.Delete(unique)) - - [] - let FlushLeavesExpectedTracesWhenDiverted () = - Runner.init () - let saved = Console.Out - let here = Directory.GetCurrentDirectory() - - let where = - Assembly.GetExecutingAssembly().Location - |> Path.GetDirectoryName - - let unique = - Path.Combine(where, Guid.NewGuid().ToString()) - - let reportFile = - Path.Combine(unique, "FlushLeavesExpectedTraces.xml") - - let outputFile = - Path.Combine(unique, "FlushLeavesExpectedTracesWhenDiverted.xml") - - try - let visits = - new Dictionary>() - - use stdout = new StringWriter() - Console.SetOut stdout - Directory.CreateDirectory(unique) |> ignore - Directory.SetCurrentDirectory(unique) - - Counter.measureTime <- - DateTime.ParseExact("2017-12-29T16:33:40.9564026+00:00", "o", null) - - use stream = - Assembly - .GetExecutingAssembly() - .GetManifestResourceStream(resource) - - let size = int stream.Length - let buffer = Array.create size 0uy - Assert.That(stream.Read(buffer, 0, size), Is.EqualTo size) - - do - use worker = - new FileStream(reportFile, FileMode.CreateNew) - - worker.Write(buffer, 0, size) - () - - let payload = Dictionary() - - [ 0..9 ] - |> Seq.iter (fun i -> payload.[i] <- init (int64 (i + 1)) []) - - visits.["f6e3edb3-fb20-44b3-817d-f69d1a22fc2f"] <- payload - - use coverageFile = - new FileStream( - reportFile, - FileMode.Open, - FileAccess.ReadWrite, - FileShare.None, - 4096, - FileOptions.SequentialScan - ) - - Counter.doFlushStream - ignore - (fun _ _ -> ()) - true - visits - AltCover.ReportFormat.NCover - coverageFile - (Some outputFile) - |> ignore - - use worker' = - new FileStream(outputFile, FileMode.Open) - - let after = XmlDocument() - after.Load worker' - - Assert.That( - after.SelectNodes("//seqpnt") - |> Seq.cast - |> Seq.map _.GetAttribute("visitcount"), - Is.EquivalentTo - [ "11" - "10" - "9" - "8" - "7" - "6" - "4" - "3" - "2" - "1" ] - ) - finally - maybeDeleteFile reportFile - Console.SetOut saved - Directory.SetCurrentDirectory(here) - maybeIOException (fun () -> Directory.Delete(unique)) - //Json.fs [] let NCoverShouldGeneratePlausibleJson () = @@ -3383,11 +3181,11 @@ module AltCoverRunnerTests = Runner.J.doReport counts AltCover.ReportFormat.NCover reportFile (Some outputFile) // DivertedWriteLeavesExpectedTraces |> ignore - use worker' = + use worker2 = new FileStream(outputFile, FileMode.Open) let after = XmlDocument() - after.Load worker' + after.Load worker2 Assert.That( after.SelectNodes("//seqpnt")