Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Safer formatting of assertion messages #159

Merged
merged 8 commits into from
Jan 6, 2025

Conversation

milang
Copy link
Contributor

@milang milang commented Jan 4, 2025

Fixes #156.

Changes

While switching to NUnit v4 in #136, we used a naive approach to formatting the assertion message, where both the message and arguments specified by the caller are forwarded to string.Format. This caused assertions to fail when messages contained special characters recognized by string.Format, even when the caller did not intend any formatting to take place (only message string was specified, no arguments) - see discussion in #156, thanks @busraozis for reporting.

The surprising aspect of this issue, as reported by @UrsMetz, was that using the same message with NUnit's "classic assert" succeeded, despite presence of special characters in the assertion message. Looking at NUnit's implementation I realized this is because NUnit does not pass the message and arguments directly to string.Format. Instead, they define a method NUnit.Framework.AssertBase.ConvertMessageWithArgs:

image

This method does not call string.Format when no arguments are specified by the caller, i.e. it uses the assertion message as-is. This allows the caller to use any characters in the assertion message, as long as they don't specify any format arguments (which is most commonly the case, including the @busraozis issue).

This pull request updates Akka.TestKit.NUnit to use NUnit's ConvertMessageWithArgs method for formatting the assertion message, and adds a test that verifies that all ITestKitAssertions methods can be called with assertion message that contains special string.Format sequences (like "{0}"), as long as no format arguments are specified.

Other changes

  • I included pending dependabot commits bumping:
    • NUnit from 4.2.2 to 4.3.2
    • NUnit.Analyzers from 4.4.0 to 4.5.0
    • Akka.TestKit from 1.5.32 to 1.5.33
  • I changed .NET SDK used to build this project from .NET SDK 6 (which is no longer supported by Microsoft) to the latest .NET SDK 9 and updated C# to the latest version 13 (we still target .NET Framework 4.6.2 and .NET 6, just with the help of the latest compiler and build tools).

Checklist

For significant changes, please ensure that the following have been completed (delete if not relevant):

dependabot bot and others added 8 commits December 23, 2024 11:59
Bumps [NUnit.Analyzers](https://github.com/nunit/nunit.analyzers) from 4.4.0 to 4.5.0.
- [Release notes](https://github.com/nunit/nunit.analyzers/releases)
- [Changelog](https://github.com/nunit/nunit.analyzers/blob/master/CHANGES.md)
- [Commits](nunit/nunit.analyzers@4.4.0...4.5.0)

---
updated-dependencies:
- dependency-name: NUnit.Analyzers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [Akka.TestKit](https://github.com/akkadotnet/akka.net) from 1.5.32 to 1.5.33.
- [Release notes](https://github.com/akkadotnet/akka.net/releases)
- [Changelog](https://github.com/akkadotnet/akka.net/blob/dev/RELEASE_NOTES.md)
- [Commits](akkadotnet/akka.net@1.5.32...1.5.33)

---
updated-dependencies:
- dependency-name: Akka.TestKit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [NUnit](https://github.com/nunit/nunit) from 4.2.2 to 4.3.2.
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/main/CHANGES.md)
- [Commits](nunit/nunit@4.2.2...4.3.2)

---
updated-dependencies:
- dependency-name: NUnit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@milang milang force-pushed the safer-message-format branch from 9106a37 to 1ff63fd Compare January 4, 2025 23:27
@milang
Copy link
Contributor Author

milang commented Jan 6, 2025

@Aaronontheweb @Arkatufus ready for review.

Copy link
Member

@Aaronontheweb Aaronontheweb left a comment

Choose a reason for hiding this comment

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

LGTM

@Aaronontheweb Aaronontheweb merged commit 6a295a5 into akkadotnet:dev Jan 6, 2025
2 checks passed
@milang milang deleted the safer-message-format branch January 6, 2025 19:53
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.

Akka TestKit NUnit v1.5.32 - Format exception in ExpectMsgFromAsync
2 participants