From 4d049d1cf59489902318f0a0b59d543ecd8f04df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 14:37:59 +0000 Subject: [PATCH 1/4] chore: Bump coverlet.collector from 6.0.4 to 8.0.1 --- updated-dependencies: - dependency-name: coverlet.collector dependency-version: 8.0.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj b/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj index a398292..43b462f 100644 --- a/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj +++ b/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj @@ -16,7 +16,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + From 78343a5f904e2085a9289949630d45c8b83164df Mon Sep 17 00:00:00 2001 From: Tyler Kron Date: Fri, 3 Apr 2026 21:53:50 -0600 Subject: [PATCH 2/4] fix: replace async Progress with synchronous IProgress in tests Progress posts callbacks via the thread pool, causing race conditions where assertions run before callbacks complete. This manifests as flaky failures on .NET 9.0 (e.g. Expected: 250, Actual: 200). Co-Authored-By: Claude Opus 4.6 --- .../Device/SdCard/SdCardCsvFileParserTests.cs | 2 +- .../Device/SdCard/SdCardFileParserTests.cs | 5 +---- .../Device/SdCard/SdCardFileReceiverTests.cs | 5 +---- .../Device/SdCard/SdCardJsonFileParserTests.cs | 3 +-- .../Device/SdCard/SynchronousProgress.cs | 13 +++++++++++++ 5 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 src/Daqifi.Core.Tests/Device/SdCard/SynchronousProgress.cs diff --git a/src/Daqifi.Core.Tests/Device/SdCard/SdCardCsvFileParserTests.cs b/src/Daqifi.Core.Tests/Device/SdCard/SdCardCsvFileParserTests.cs index 5bbf24a..246dd20 100644 --- a/src/Daqifi.Core.Tests/Device/SdCard/SdCardCsvFileParserTests.cs +++ b/src/Daqifi.Core.Tests/Device/SdCard/SdCardCsvFileParserTests.cs @@ -447,7 +447,7 @@ public async Task ParseAsync_ProgressReporting_CallsCallback() var parser = new global::Daqifi.Core.Device.SdCard.SdCardCsvFileParser(); var options = new global::Daqifi.Core.Device.SdCard.SdCardParseOptions { - Progress = new Progress(p => + Progress = new SynchronousProgress(p => { progressCalls++; lastProgress = p; diff --git a/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileParserTests.cs b/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileParserTests.cs index 2f3c946..2600f39 100644 --- a/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileParserTests.cs +++ b/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileParserTests.cs @@ -485,7 +485,7 @@ public async Task ParseAsync_ReportsProgressMonotonically() var progressReports = new List(); var options = new SdCardParseOptions { - Progress = new Progress(p => progressReports.Add(p)) + Progress = new SynchronousProgress(p => progressReports.Add(p)) }; // Act @@ -493,9 +493,6 @@ public async Task ParseAsync_ReportsProgressMonotonically() // Enumerate samples to force full parse await ToListAsync(session.Samples); - // Allow progress handler to execute (Progress posts to SynchronizationContext) - await Task.Delay(100); - // Assert — at least one progress report Assert.NotEmpty(progressReports); diff --git a/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileReceiverTests.cs b/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileReceiverTests.cs index 1d479f7..516a703 100644 --- a/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileReceiverTests.cs +++ b/src/Daqifi.Core.Tests/Device/SdCard/SdCardFileReceiverTests.cs @@ -115,14 +115,11 @@ public async Task ReceiveAsync_ProgressReporting_BytesReceivedIncreases() var receiver = new SdCardFileReceiver(sourceStream, bufferSize: 100); var progressReports = new System.Collections.Generic.List(); - var progress = new Progress(p => progressReports.Add(p)); + var progress = new SynchronousProgress(p => progressReports.Add(p)); // Act await receiver.ReceiveAsync(destinationStream, "test.bin", progress); - // Allow progress callbacks to fire (they're posted to the sync context) - await Task.Delay(100); - // Assert — we should have received at least one progress report Assert.NotEmpty(progressReports); Assert.All(progressReports, p => diff --git a/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs b/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs index 3dedca8..7e96502 100644 --- a/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs +++ b/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs @@ -257,11 +257,10 @@ public async Task ParseAsync_ProgressReporting_CallsCallback() var options = new global::Daqifi.Core.Device.SdCard.SdCardParseOptions { FallbackTimestampFrequency = 100, - Progress = new Progress(p => + Progress = new SynchronousProgress(p => { progressCalls++; Assert.True(p.BytesRead >= 0); - Assert.Equal(250, p.MessagesRead); }) }; diff --git a/src/Daqifi.Core.Tests/Device/SdCard/SynchronousProgress.cs b/src/Daqifi.Core.Tests/Device/SdCard/SynchronousProgress.cs new file mode 100644 index 0000000..9a4245e --- /dev/null +++ b/src/Daqifi.Core.Tests/Device/SdCard/SynchronousProgress.cs @@ -0,0 +1,13 @@ +using System; + +namespace Daqifi.Core.Tests.Device.SdCard; + +/// +/// A synchronous implementation for tests. +/// Unlike , this invokes the callback inline on the +/// calling thread, avoiding race conditions in assertions. +/// +internal sealed class SynchronousProgress(Action handler) : IProgress +{ + public void Report(T value) => handler(value); +} From 29323fa7ffd8d1b9276a9f5694a424cec71f393c Mon Sep 17 00:00:00 2001 From: Tyler Kron Date: Fri, 3 Apr 2026 21:54:58 -0600 Subject: [PATCH 3/4] fix: restore MessagesRead assertion in JSON parser progress test Move the assertion from inside the callback (where it incorrectly ran on every intermediate report) to after enumeration completes, validating only the final progress value. Co-Authored-By: Claude Opus 4.6 --- .../Device/SdCard/SdCardJsonFileParserTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs b/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs index 7e96502..d3ec598 100644 --- a/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs +++ b/src/Daqifi.Core.Tests/Device/SdCard/SdCardJsonFileParserTests.cs @@ -253,6 +253,7 @@ public async Task ParseAsync_ProgressReporting_CallsCallback() ); var progressCalls = 0; + var lastProgress = default(global::Daqifi.Core.Device.SdCard.SdCardParseProgress); var parser = new global::Daqifi.Core.Device.SdCard.SdCardJsonFileParser(); var options = new global::Daqifi.Core.Device.SdCard.SdCardParseOptions { @@ -260,6 +261,7 @@ public async Task ParseAsync_ProgressReporting_CallsCallback() Progress = new SynchronousProgress(p => { progressCalls++; + lastProgress = p; Assert.True(p.BytesRead >= 0); }) }; @@ -271,6 +273,7 @@ public async Task ParseAsync_ProgressReporting_CallsCallback() // Assert Assert.Equal(250, samples.Count); Assert.True(progressCalls >= 2); // At least 2 progress updates (100-line batches + final) + Assert.Equal(250, lastProgress.MessagesRead); } [Fact] From beab91a312f2f449bd4f4ff85456f3172fd2521a Mon Sep 17 00:00:00 2001 From: Tyler Kron Date: Fri, 3 Apr 2026 21:57:25 -0600 Subject: [PATCH 4/4] chore: also bump coverlet.msbuild from 6.0.4 to 8.0.1 Consolidate both coverlet package updates into a single PR. Supersedes #156. Co-Authored-By: Claude Opus 4.6 --- src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj b/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj index 43b462f..5d29885 100644 --- a/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj +++ b/src/Daqifi.Core.Tests/Daqifi.Core.Tests.csproj @@ -12,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive