Skip to content

feat: add mutation testing and increased test coverage#75

Merged
woutervanranst merged 28 commits into
masterfrom
stryker
Apr 29, 2026
Merged

feat: add mutation testing and increased test coverage#75
woutervanranst merged 28 commits into
masterfrom
stryker

Conversation

@woutervanranst

@woutervanranst woutervanranst commented Apr 29, 2026

Copy link
Copy Markdown
Owner

Summary

  • strengthen mutation-focused tests for local file enumeration and chunk storage upload/read behavior
  • add Stryker.NET setup and documentation for the Core test project using the preview MTP runner
  • merge latest origin/master into this branch while keeping the mutation coverage work green

Test Plan

  • dotnet test --project src/Arius.Core.Tests/Arius.Core.Tests.csproj
  • dotnet stryker --config-file stryker-config.json

Summary by CodeRabbit

  • Tests

    • Expanded coverage for uploads, retries, downloads, and pointer-only file enumeration; added supporting test utilities and fakes.
  • Bug Fixes

    • Ensured progress reporting is strictly increasing.
    • Simplified download stream disposal to avoid double-disposal.
  • Documentation

    • Added mutation testing setup and config; included an ADR describing scoped mutation-testing workflow and guidance.
  • Benchmarks

    • Added updated benchmark results and generated reports.

@coderabbitai

coderabbitai Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 33adc491-f2e6-4de5-a6ea-ea70d6c91491

📥 Commits

Reviewing files that changed from the base of the PR and between d374269 and ba2a249.

⛔ Files ignored due to path filters (3)
  • src/Arius.Benchmarks/raw/20260429T123311.207Z/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-20260429-123311.log is excluded by !**/*.log
  • src/Arius.Benchmarks/raw/20260429T123311.207Z/benchmark-output.log is excluded by !**/*.log
  • src/Arius.Benchmarks/raw/20260429T123311.207Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.csv is excluded by !**/*.csv
📒 Files selected for processing (3)
  • src/Arius.Benchmarks/benchmark-tail.md
  • src/Arius.Benchmarks/raw/20260429T123311.207Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md
  • src/Arius.Benchmarks/raw/20260429T123311.207Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html

📝 Walkthrough

Walkthrough

Adds Stryker.NET mutation testing configuration and docs; introduces multiple chunk-storage test fakes and new tests (Tar, Large, pointer-only enumeration); changes ChunkStorageService upload progress gating and download stream ownership; updates LocalFileEnumerator to emit logical binary paths for pointer files.

Changes

Cohort / File(s) Summary
Configuration & Documentation
README.md, stryker-config.json, docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md
Add Stryker.NET config and README instructions; add ADR documenting scoped, local/manual mutation testing for Arius.Core.
ChunkStorage Core Logic
src/Arius.Core/Shared/ChunkStorage/ChunkStorageService.cs
Gate progress callbacks to ensure monotonically increasing reported bytes in UploadChunkAsync; consolidate download stream ownership/disposal in DownloadCoreAsync and simplify ChunkDownloadStream.
ChunkStorage Tests (uploads & reads)
src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs, src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceReadTests.cs
Add 3 upload tests (Tar content-type/metadata, Large upload retry with metadata-conflict and chunk-boundary progress assertions) and minor whitespace/formatting normalization in read tests.
ChunkStorage Test Fakes
src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/BlobAlreadyExistsOnSetMetadataOnceBlobContainerService.cs, src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ChunkedReadMemoryStream.cs, src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ContentTypeCapturingBlobContainerService.cs
Add fakes: one that fails SetMetadataAsync once to simulate metadata-race, a chunk-limited read stream to enforce read-size boundaries, and a content-type-capturing blob container wrapper.
Test Fake docs / minor edits
src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/BlockingDeleteBlobContainerService.cs, src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/NonSeekableReadStream.cs
Add XML documentation comments clarifying existing test fakes' intent (no behavioral changes).
LocalFile enumeration & tests
src/Arius.Core/Shared/LocalFile/LocalFileEnumerator.cs, src/Arius.Core.Tests/Shared/LocalFile/LocalFileEnumeratorTests.cs
Compute a single normalized relative name; infer binary relative path for .pointer.arius files and emit that as FilePair.RelativePath; add pointer-only enumeration test.
Benchmarks artifacts
src/Arius.Benchmarks/benchmark-tail.md, src/Arius.Benchmarks/raw/.../results/*
Update benchmark tail entry and add new static BenchmarkDotNet report files (Markdown + HTML) for a new run.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant ChunkStorageService
    participant BlobContainer as BlobContainerService
    participant Progress as IProgress<long>

    Client->>ChunkStorageService: UploadChunkAsync(chunk, progressCallback)
    ChunkStorageService->>Progress: wrap callback (CallbackProgress)
    loop read loop (multiple reads)
        ChunkStorageService->>BlobContainer: OpenWriteAsync(blobName, contentType)
        BlobContainer-->>ChunkStorageService: write stream
        ChunkStorageService->>BlobContainer: Write(chunkSegment)
        ChunkStorageService->>Progress: report bytesRead (if > lastReported)
    end
    ChunkStorageService->>BlobContainer: SetMetadataAsync(blobName, metadata)
    alt metadata race (first time)
        BlobContainer-->>ChunkStorageService: throw BlobAlreadyExistsException
        ChunkStorageService->>BlobContainer: DeleteAsync(blobName)
        ChunkStorageService->>BlobContainer: OpenWriteAsync(...) (retry)
        ChunkStorageService->>Progress: report resumed bytes (monotonic)
        ChunkStorageService->>BlobContainer: SetMetadataAsync(blobName, metadata) 
    else metadata success
        BlobContainer-->>ChunkStorageService: metadata set
    end
    ChunkStorageService-->>Client: Upload complete
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.16% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: adding mutation testing infrastructure and expanding test coverage for the Arius.Core project.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch stryker

Review rate limit: 4/5 reviews remaining, refill in 12 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@woutervanranst woutervanranst changed the title test: strengthen mutation coverage in core services feat: add mutation testing and increased test coverage Apr 29, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/Arius.Core/Shared/ChunkStorage/ChunkStorageService.cs (1)

319-322: Unused constructor parameters — consider removing them.

The constructor accepts decryptStream, progressStream, and downloadStream but only uses inner. Since disposal now relies on the stream chain cascading through _inner, these parameters are dead code.

🔧 Suggested simplification
-public ChunkDownloadStream(Stream inner, Stream decryptStream, Stream progressStream, Stream downloadStream)
+public ChunkDownloadStream(Stream inner)
 {
     _inner = inner;
 }

And update the call site at line 216:

-return new ChunkDownloadStream(gzipStream, decryptStream, progressOrRawStream, downloadStream);
+return new ChunkDownloadStream(gzipStream);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Arius.Core/Shared/ChunkStorage/ChunkStorageService.cs` around lines 319 -
322, The ChunkDownloadStream constructor currently declares parameters
decryptStream, progressStream, and downloadStream but only assigns _inner;
remove the unused parameters from the ChunkDownloadStream(Stream inner, ...)
signature and delete any unused private fields or assignments related to
decryptStream/progressStream/downloadStream; then update all call sites that
construct ChunkDownloadStream to pass only the inner Stream (or stop supplying
the removed arguments). Ensure no other code references the removed fields so
compilation remains clean.
src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs (1)

316-476: Move inline test doubles to a Fakes/ folder beside these tests.

From Line 316 onward, the helper doubles are embedded in the test file. Extracting them into a local Fakes/ subfolder keeps the test class focused and aligns with the repo’s test-structure rules.

As per coding guidelines: “Test projects should mirror the structure of the project they exercise. Put reusable test doubles in Fakes/ directory. Put scenario-specific test doubles in a local Fakes/ subfolder beside the tests that use them.”

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs`
around lines 316 - 476, The test helper doubles
(BlobAlreadyExistsOnSetMetadataOnceBlobContainerService,
ThinMetadataRecordingBlobContainerService,
ContentTypeCapturingBlobContainerService, EncryptedPassthroughService,
ChunkedReadMemoryStream) are embedded inline and should be extracted to separate
files in a local Fakes/ folder beside these tests; create one file per class in
that Fakes/ folder, give them the same namespace as the test project (or adjust
namespace and add appropriate using in the test file), preserve their
sealed/internal accessibility so tests can access them, and update the test file
to remove the inline definitions and reference the moved types; ensure
constructors/signatures remain identical (e.g., ChunkedReadMemoryStream(byte[]
buffer, int maxChunkSize)) so no test code changes are required.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/superpowers/plans/2026-04-29-stryker-core.md`:
- Around line 77-95: The outer fenced block around the "Mutation Testing"
section uses ```markdown while it contains inner ```bash fences, which can break
rendering; update the outer fence to use a longer fence (e.g., ````markdown) and
close it with the matching longer fence so the inner ```bash blocks remain
intact—apply this change to the Markdown block that starts with "### Mutation
Testing" and contains the `dotnet tool install --global dotnet-stryker` and
`dotnet stryker --config-file stryker-config.json` examples.

---

Nitpick comments:
In `@src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs`:
- Around line 316-476: The test helper doubles
(BlobAlreadyExistsOnSetMetadataOnceBlobContainerService,
ThinMetadataRecordingBlobContainerService,
ContentTypeCapturingBlobContainerService, EncryptedPassthroughService,
ChunkedReadMemoryStream) are embedded inline and should be extracted to separate
files in a local Fakes/ folder beside these tests; create one file per class in
that Fakes/ folder, give them the same namespace as the test project (or adjust
namespace and add appropriate using in the test file), preserve their
sealed/internal accessibility so tests can access them, and update the test file
to remove the inline definitions and reference the moved types; ensure
constructors/signatures remain identical (e.g., ChunkedReadMemoryStream(byte[]
buffer, int maxChunkSize)) so no test code changes are required.

In `@src/Arius.Core/Shared/ChunkStorage/ChunkStorageService.cs`:
- Around line 319-322: The ChunkDownloadStream constructor currently declares
parameters decryptStream, progressStream, and downloadStream but only assigns
_inner; remove the unused parameters from the ChunkDownloadStream(Stream inner,
...) signature and delete any unused private fields or assignments related to
decryptStream/progressStream/downloadStream; then update all call sites that
construct ChunkDownloadStream to pass only the inner Stream (or stop supplying
the removed arguments). Ensure no other code references the removed fields so
compilation remains clean.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a9cf6d43-0002-4f69-9600-876fc2988680

📥 Commits

Reviewing files that changed from the base of the PR and between a972702 and 81e426d.

📒 Files selected for processing (10)
  • README.md
  • docs/superpowers/plans/2026-04-29-stryker-core.md
  • docs/superpowers/specs/2026-04-29-stryker-core-design.md
  • docs/superpowers/specs/2026-04-29-stryker-coverage-improvement-design.md
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceReadTests.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs
  • src/Arius.Core.Tests/Shared/LocalFile/LocalFileEnumeratorTests.cs
  • src/Arius.Core/Shared/ChunkStorage/ChunkStorageService.cs
  • src/Arius.Core/Shared/LocalFile/LocalFileEnumerator.cs
  • stryker-config.json

Comment thread docs/superpowers/plans/2026-04-29-stryker-core.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md (2)

9-10: Consider increasing iteration count and adding warmup for more reliable benchmark results.

The current configuration uses WarmupCount=0 and only IterationCount=3, which may produce unstable measurements with high variance. BenchmarkDotNet typically recommends at least 1 warmup iteration for JIT stabilization and 15+ iterations for statistical reliability. The current high StdDev (1.261s on a 40.03s mean, ~3%) suggests some measurement instability.

If this minimal configuration is intentional for CI speed, consider documenting that tradeoff or running more thorough benchmarks periodically.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md`
around lines 9 - 10, The benchmark config uses WarmupCount=0 and
IterationCount=3 which can yield unstable results; update the benchmark
configuration to set WarmupCount to at least 1 and increase IterationCount to
15+ (or document the CI-speed tradeoff) so JIT warms up and measurements gain
statistical reliability—modify the place where WarmupCount and IterationCount
are defined/used (search for the WarmupCount and IterationCount settings in the
benchmark run/config) to apply these new values or add a comment explaining why
the lower counts are intentional.

1-2: Minor markdown formatting issues flagged by static analysis.

The static analysis tool flagged:

  • Line 1: Fenced code block missing language specifier (MD040)
  • Line 13: Table not surrounded by blank lines (MD058)

Since this is a BenchmarkDotNet-generated file, these issues would need to be addressed either in the BenchmarkDotNet output template or via post-processing. For a historical CI artifact, these formatting issues are cosmetic and can be safely ignored unless the file needs to be consumed by strict markdown parsers.

Also applies to: 13-13

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md`
around lines 1 - 2, The Markdown output has minor style issues: a fenced code
block at the top is missing a language specifier and a table at line ~13 isn’t
surrounded by blank lines; update the generated markdown (or post-process the
BenchmarkDotNet output) to add a language tag to the opening triple-backtick
fence and insert a blank line before and after the table so it conforms to MD040
and MD058; change the template or post-processing step that produces the top
fenced code block and the table region to emit the corrected delimiters.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md`:
- Around line 9-10: The benchmark config uses WarmupCount=0 and IterationCount=3
which can yield unstable results; update the benchmark configuration to set
WarmupCount to at least 1 and increase IterationCount to 15+ (or document the
CI-speed tradeoff) so JIT warms up and measurements gain statistical
reliability—modify the place where WarmupCount and IterationCount are
defined/used (search for the WarmupCount and IterationCount settings in the
benchmark run/config) to apply these new values or add a comment explaining why
the lower counts are intentional.
- Around line 1-2: The Markdown output has minor style issues: a fenced code
block at the top is missing a language specifier and a table at line ~13 isn’t
surrounded by blank lines; update the generated markdown (or post-process the
BenchmarkDotNet output) to add a language tag to the opening triple-backtick
fence and insert a blank line before and after the table so it conforms to MD040
and MD058; change the template or post-processing step that produces the top
fenced code block and the table region to emit the corrected delimiters.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 28252f4e-9eb8-4b08-aa56-9b402aa929db

📥 Commits

Reviewing files that changed from the base of the PR and between 81e426d and 9d907fe.

⛔ Files ignored due to path filters (3)
  • src/Arius.Benchmarks/raw/20260429T111639.696Z/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-20260429-111639.log is excluded by !**/*.log
  • src/Arius.Benchmarks/raw/20260429T111639.696Z/benchmark-output.log is excluded by !**/*.log
  • src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.csv is excluded by !**/*.csv
📒 Files selected for processing (3)
  • src/Arius.Benchmarks/benchmark-tail.md
  • src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md
  • src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html
✅ Files skipped from review due to trivial changes (2)
  • src/Arius.Benchmarks/raw/20260429T111639.696Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html
  • src/Arius.Benchmarks/benchmark-tail.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md (1)

43-49: Reduce repeated bullet phrasing for readability.

Lines 43-49 and Lines 81-84 repeat the same opening pattern, which makes scanning harder. Consider varying phrasing while keeping meaning unchanged.

✍️ Suggested wording cleanup
-* Good, because Arius can use mutation testing immediately in the core archive, restore, list, snapshot, chunk, and tree behavior that matters most.
-* Good, because the chosen scope keeps runtime and debugging costs bounded while the team learns where mutation testing pays off.
-* Good, because the ADR reflects the repository's real TUnit/MTP setup instead of assuming a standard VSTest-only world.
-* Good, because fluctuating scores are treated as diagnostic evidence instead of falsely precise pass/fail gates.
-* Bad, because mutation testing is not yet a whole-repository signal.
-* Bad, because developers must interpret score movement carefully when the preview MTP runner produces unstable results.
-* Bad, because future CI enforcement requires a separate decision once score stability and runtime are better understood.
+* Benefit: Arius can apply mutation testing immediately to high-value core archive, restore, list, snapshot, chunk, and tree behavior.
+* Benefit: The scoped rollout keeps runtime and debugging costs bounded while the team learns where mutation testing is most effective.
+* Benefit: The ADR matches the repository’s actual TUnit/MTP setup instead of assuming a VSTest-only path.
+* Benefit: Score fluctuation is treated as diagnostic evidence rather than a brittle pass/fail gate.
+* Tradeoff: Mutation testing is not yet a whole-repository signal.
+* Tradeoff: Developers must interpret score movement carefully while the preview MTP runner remains unstable.
+* Tradeoff: CI enforcement needs a future decision after stability and runtime improve.

Also applies to: 81-84

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md` around
lines 43 - 49, The repeated bullet openings "Good, because" and "Bad, because"
in the ADR bullets make scanning harder; edit the bullets in
adr-0005-adopt-scoped-stryker-mutation-testing.md (the "Good" and "Bad" lists)
to vary phrasing while preserving meaning—e.g., change some "Good, because..."
to "Benefits: ..." or "This enables..." and some "Bad, because..." to
"Limitations: ..." or "Drawback: ..." so the list reads more varied and
scannable without altering the substantive content.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ChunkedReadMemoryStream.cs`:
- Around line 3-15: ChunkedReadMemoryStream currently accepts any maxChunkSize
which can be zero or negative causing silent EOFs or exceptions; validate the
constructor parameter maxChunkSize in ChunkedReadMemoryStream(byte[] buffer, int
maxChunkSize) and throw an ArgumentOutOfRangeException (or similar) when
maxChunkSize <= 0 with a clear message so tests fail fast and indicate the bad
argument.

---

Nitpick comments:
In `@docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md`:
- Around line 43-49: The repeated bullet openings "Good, because" and "Bad,
because" in the ADR bullets make scanning harder; edit the bullets in
adr-0005-adopt-scoped-stryker-mutation-testing.md (the "Good" and "Bad" lists)
to vary phrasing while preserving meaning—e.g., change some "Good, because..."
to "Benefits: ..." or "This enables..." and some "Bad, because..." to
"Limitations: ..." or "Drawback: ..." so the list reads more varied and
scannable without altering the substantive content.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8449ada8-bfeb-4957-bc6e-ea79adaf4b25

📥 Commits

Reviewing files that changed from the base of the PR and between 9d907fe and 73b8895.

📒 Files selected for processing (8)
  • docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/BlobAlreadyExistsOnSetMetadataOnceBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ChunkedReadMemoryStream.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ContentTypeCapturingBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/EncryptedPassthroughService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ThinMetadataRecordingBlobContainerService.cs
  • src/Arius.Core/Shared/ChunkStorage/ChunkStorageService.cs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@src/Arius.Benchmarks/raw/20260429T113931.866Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md`:
- Around line 1-15: The markdown report starts with an unlabeled fenced code
block and the results table immediately follows without a blank line; update the
opening fence to a labeled block (use ```text) and insert a blank line before
the table so the table is separated from the code block, ensuring the fenced
block ends with ``` and the table (the line beginning with "| Method") is
preceded by an empty line to satisfy markdownlint rules.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: dd0f9874-e4c8-4112-8ad9-4d9c15390862

📥 Commits

Reviewing files that changed from the base of the PR and between 73b8895 and 8b8a38b.

⛔ Files ignored due to path filters (3)
  • src/Arius.Benchmarks/raw/20260429T113931.866Z/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-20260429-113932.log is excluded by !**/*.log
  • src/Arius.Benchmarks/raw/20260429T113931.866Z/benchmark-output.log is excluded by !**/*.log
  • src/Arius.Benchmarks/raw/20260429T113931.866Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.csv is excluded by !**/*.csv
📒 Files selected for processing (3)
  • src/Arius.Benchmarks/benchmark-tail.md
  • src/Arius.Benchmarks/raw/20260429T113931.866Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md
  • src/Arius.Benchmarks/raw/20260429T113931.866Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html
✅ Files skipped from review due to trivial changes (1)
  • src/Arius.Benchmarks/raw/20260429T113931.866Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Arius.Benchmarks/benchmark-tail.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md (2)

12-16: Fix Markdownlint fence formatting (add language + verify closing fence).

The benchmark report includes a fenced block (opening around Line 12) without a language tag, which triggers MD040 (“Fenced code blocks should have a language specified”). Also, the snippet shows the closing backticks may be inconsistent (ends with ````), which can cause the table to be parsed incorrectly and trigger MD058.

✅ Proposed fix
-```
+```text

 | Method                                                                   | Mean    | Error   | StdDev  | Completed Work Items | Lock Contentions | Gen0       | Gen1      | Allocated |
 |------------------------------------------------------------------------- |--------:|--------:|--------:|---------------------:|-----------------:|-----------:|----------:|----------:|
 | &#39;Canonical_Representative_Workflow_Runs_On_Supported_Backends (Azurite)&#39; | 39.09 s | 0.566 s | 0.031 s |           71650.0000 |           4.0000 | 36000.0000 | 6000.0000 | 613.09 MB |
-
-````
+
+```

This should satisfy the linter and avoid accidental Markdown table parsing outside the fence.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md`
around lines 12 - 16, Add a language tag to the opening fenced code block and
fix the closing fence so it uses three backticks; specifically, update the block
that begins with ``` (the benchmark table block including the header row "|
Method | Mean | ...") to start with ```text (or ```md) and ensure the closing
delimiter is exactly ``` (not four backticks or mismatched), so the table is
correctly rendered and MD040/MD058 are resolved.

13-15: Add blank line(s) around the table if it’s parsed as Markdown (MD058).

static_analysis_hints report MD058 at Line 13 (“Tables should be surrounded by blank lines”). If the linter is treating the table as real Markdown (e.g., due to a fence parsing issue), adding a blank line immediately before and after the table will make the formatting robust.

✅ Proposed fix
 ```text
+
 | Method                                                                   | Mean    | Error   | StdDev  | Completed Work Items | Lock Contentions | Gen0       | Gen1      | Allocated |
 |------------------------------------------------------------------------- |--------:|--------:|--------:|---------------------:|-----------------:|-----------:|----------:|----------:|
 | &#39;Canonical_Representative_Workflow_Runs_On_Supported_Backends (Azurite)&#39; | 39.09 s | 0.566 s | 0.031 s |           71650.0000 |           4.0000 | 36000.0000 | 6000.0000 | 613.09 MB |
+

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In
@src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md
around lines 13 - 15, The Markdown table starting with the header row containing
"Method | Mean | Error ..." and the row for
'Canonical_Representative_Workflow_Runs_On_Supported_Backends (Azurite)' needs
blank lines immediately before and after it to satisfy MD058; edit the report so
there is an empty line above the table header and an empty line after the last
table row to ensure the linter treats it as a proper fenced table.


</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
@src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md:

  • Around line 12-16: Add a language tag to the opening fenced code block and fix
    the closing fence so it uses three backticks; specifically, update the block
    that begins with (the benchmark table block including the header row "| Method | Mean | ...") to start withtext (or md) and ensure the closing delimiter is exactly (not four backticks or mismatched), so the table is
    correctly rendered and MD040/MD058 are resolved.
  • Around line 13-15: The Markdown table starting with the header row containing
    "Method | Mean | Error ..." and the row for
    'Canonical_Representative_Workflow_Runs_On_Supported_Backends (Azurite)' needs
    blank lines immediately before and after it to satisfy MD058; edit the report so
    there is an empty line above the table header and an empty line after the last
    table row to ensure the linter treats it as a proper fenced table.

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: Path: .coderabbit.yaml

**Review profile**: CHILL

**Plan**: Pro

**Run ID**: `6024b083-93b5-4cca-ac50-047cc87b7cf3`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8b8a38bc385ebb6e72171a5bd402ff8ee8621e90 and 82db171cb9534839536763d23f3e8881ef434663.

</details>

<details>
<summary>⛔ Files ignored due to path filters (3)</summary>

* `src/Arius.Benchmarks/raw/20260429T114827.731Z/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-20260429-114827.log` is excluded by `!**/*.log`
* `src/Arius.Benchmarks/raw/20260429T114827.731Z/benchmark-output.log` is excluded by `!**/*.log`
* `src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.csv` is excluded by `!**/*.csv`

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `src/Arius.Benchmarks/benchmark-tail.md`
* `src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report-github.md`
* `src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html`

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* src/Arius.Benchmarks/raw/20260429T114827.731Z/results/Arius.Benchmarks.RepresentativeWorkflowBenchmarks-report.html

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* src/Arius.Benchmarks/benchmark-tail.md

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md (1)

38-43: Optional readability polish: vary repeated bullet openings.

Several consecutive bullets start with identical phrasing (“Good, because …” / “Bad, because …”). Rewording a few openings will improve readability without changing meaning.

Also applies to: 74-77

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md` around
lines 38 - 43, The repeated bullet openings ("Good, because …" / "Bad, because
…") reduce readability; edit the bullet list in
adr-0005-adopt-scoped-stryker-mutation-testing.md to vary the leading phrasing
(e.g., replace some "Good, because…" with "Pros:" / "Positive:" / "Works well
because…" and some "Bad, because…" with "Concerns:" / "Downside:" / "Needs
caution because…") while keeping the original meanings intact; apply the same
variation to the later block referenced (the bullets at 74-77).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md`:
- Line 17: Remove the duplicated word "to" in the decision driver sentence that
currently reads "due to to preview Microsoft Testing Platform runner" so it
becomes "due to preview Microsoft Testing Platform runner"; edit the sentence in
adr-0005-adopt-scoped-stryker-mutation-testing.md (the line containing the
decision driver bullet) to remove the extra "to".

---

Nitpick comments:
In `@docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md`:
- Around line 38-43: The repeated bullet openings ("Good, because …" / "Bad,
because …") reduce readability; edit the bullet list in
adr-0005-adopt-scoped-stryker-mutation-testing.md to vary the leading phrasing
(e.g., replace some "Good, because…" with "Pros:" / "Positive:" / "Works well
because…" and some "Bad, because…" with "Concerns:" / "Downside:" / "Needs
caution because…") while keeping the original meanings intact; apply the same
variation to the later block referenced (the bullets at 74-77).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 56ca8ac6-4911-4693-a375-e858b824f8e6

📥 Commits

Reviewing files that changed from the base of the PR and between 8b8a38b and d374269.

📒 Files selected for processing (10)
  • README.md
  • docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceReadTests.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/BlobAlreadyExistsOnSetMetadataOnceBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/BlockingDeleteBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ChunkedReadMemoryStream.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ContentTypeCapturingBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/NonSeekableReadStream.cs
  • src/Arius.Core/Shared/LocalFile/LocalFileEnumerator.cs
✅ Files skipped from review due to trivial changes (3)
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/NonSeekableReadStream.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/BlockingDeleteBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceReadTests.cs
🚧 Files skipped from review as they are similar to previous changes (5)
  • README.md
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ChunkedReadMemoryStream.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/Fakes/ContentTypeCapturingBlobContainerService.cs
  • src/Arius.Core.Tests/Shared/ChunkStorage/ChunkStorageServiceUploadTests.cs
  • src/Arius.Core/Shared/LocalFile/LocalFileEnumerator.cs


* mutation testing should help identify weak behavior-level tests in core repository logic
* mutation runs are significantly slower than the normal unit test suite
* fluctuating mutation scores (due to to preview Microsoft Testing Platform runner) should not become a noisy CI gate before their stability is understood

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix duplicated word in the decision driver sentence.

Line 17 has a typo: “due to to preview Microsoft Testing Platform runner”. Please remove the duplicate “to”.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/decisions/adr-0005-adopt-scoped-stryker-mutation-testing.md` at line 17,
Remove the duplicated word "to" in the decision driver sentence that currently
reads "due to to preview Microsoft Testing Platform runner" so it becomes "due
to preview Microsoft Testing Platform runner"; edit the sentence in
adr-0005-adopt-scoped-stryker-mutation-testing.md (the line containing the
decision driver bullet) to remove the extra "to".

@woutervanranst woutervanranst merged commit b925260 into master Apr 29, 2026
3 checks passed
@woutervanranst woutervanranst deleted the stryker branch May 2, 2026 06:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant