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

Enable AOT compatibility for all libraries #4871

Merged
merged 4 commits into from
Jan 12, 2024

Conversation

eerhardt
Copy link
Member

@eerhardt eerhardt commented Jan 9, 2024

Port #4625 to main now that the Configuration.Binder bugs are fixed in 8.0.1.

Enable AOT compatibility for all libraries and fix AOT warnings.

Explicitly reference Microsoft.Extensions.Configuration.Binder in projects that use the source generator to ensure we get the latest version (8.0.1).

Microsoft Reviewers: Open in CodeFlow

* Enable AOT compatibility for all libraries. Fix warnings.

- Enable configuration binder source generator
- The only library that can't use the ConfigBinder SG is the HeaderParsing library.
  - Blocked by dotnet/runtime#94547

* Fix Compliance Redaction.

* Address PR feedback
For all libraries that use the Configuration.Binder source generator, explicitly reference the NuGet package. This ensures we get the latest version (8.0.1), which has all the source generator fixes.
@dotnet-comment-bot

This comment was marked as resolved.

@@ -8,6 +8,7 @@

<PropertyGroup>
<TargetFrameworks>$(NetCoreTargetFrameworks)</TargetFrameworks>
<EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator>
Copy link
Member

Choose a reason for hiding this comment

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

NIT: Does it hurt to set this property to true when a project is not referencing the configuration binder package? If not, then we might want to consider defaulting this to true in directory.build.props to avoid having to add it in most places. And to that same line, should we consider adding the generator by default to all projects too? I'm assuming libraries not using configuration will simply no-op for this generator (which may include a slight perf regresion in build time) but this may be beneficial for new libraries in the future.

Copy link
Member Author

Choose a reason for hiding this comment

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

(Totally my opinion, I'm curious to hear others')

Since this source generator is off by default, I thought it would be better to continue to keep it off by default. It isn't really "most places". It is 12 libraries. By comparison, UseLoggingGenerator is used in 13 libraries, and it isn't defaulted to be "on by default".

Copy link
Member

@joperezr joperezr left a comment

Choose a reason for hiding this comment

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

Left minor comments, but looks good overall. Thanks Eric!

@joperezr
Copy link
Member

joperezr commented Jan 9, 2024

🎉 Good job! The coverage increased 🎉 Update MinCodeCoverage in the project files.

Project Expected Actual
Microsoft.Extensions.Http.Diagnostics 91 94
Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=520582&view=codecoverage-tab

This is being addressed via #4870

@dotnet-comment-bot
Copy link
Collaborator

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.AspNetCore.Diagnostics.Middleware Line 100 99.17 🔻

Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=523076&view=codecoverage-tab

@joperezr
Copy link
Member

‼️ Found issues ‼️

Project Coverage Type Expected Actual
Microsoft.AspNetCore.Diagnostics.Middleware Line 100 99.17 🔻
Full code coverage report: https://dev.azure.com/dnceng-public/public/_build/results?buildId=523076&view=codecoverage-tab

hrm... Looking at the reprot it is complaining about this line:

internal string DebuggerToString() => $"{Value} @ {Timestamp.ToString("HH:mm:ss.ffff", CultureInfo.InvariantCulture)}";

Not sure why the changes in this PR are triggering it, but sounds like we should be able to just exclude from code coverage given that it looks like that is only for debugging purposes?

@eerhardt
Copy link
Member Author

eerhardt commented Jan 11, 2024

hrm... Looking at the reprot it is complaining about this line:

I dug deeper and it is complaining about these 3 setters:

#pragma warning disable CA2227 // Collection properties should be read only
public IDictionary<string, DataClassification> RouteParameterDataClasses { get; set; } = new Dictionary<string, DataClassification>(StringComparer.OrdinalIgnoreCase);
#pragma warning restore CA2227 // Collection properties should be read only
/// <summary>
/// Gets or sets a map between request headers to be logged and their data classification.
/// </summary>
/// <value>
/// The default value is an empty dictionary, which means that no request header is logged by default.
/// </value>
[Required]
#pragma warning disable CA2227 // Collection properties should be read only
public IDictionary<string, DataClassification> RequestHeadersDataClasses { get; set; } = new Dictionary<string, DataClassification>(StringComparer.OrdinalIgnoreCase);
#pragma warning restore CA2227 // Collection properties should be read only
/// <summary>
/// Gets or sets a map between response headers to be logged and their data classification.
/// </summary>
/// <value>
/// The default value is an empty dictionary, which means that no response header is logged by default.
/// </value>
[Required]
#pragma warning disable CA2227 // Collection properties should be read only
public IDictionary<string, DataClassification> ResponseHeadersDataClasses { get; set; } = new Dictionary<string, DataClassification>(StringComparer.OrdinalIgnoreCase);
#pragma warning restore CA2227 // Collection properties should be read only

However, when I look back at other CI runs and dig into their merged.cobertura.xml files, I'm seeing some weirdness.

I downloaded the merged xml file from https://dev.azure.com/dnceng-public/public/_build/results?buildId=522132, and that one has 100% for the class/package.

But then I download it from https://dev.azure.com/dnceng-public/public/_build/results?buildId=524014, and that one has
<package line-rate="0.9916666666666667" branch-rate="1" complexity="168" name="Microsoft.AspNetCore.Diagnostics.Middleware">, but the code coverage task passed in CI. So I'm at a loss at what is going wrong here, or why my change would cause this.

I verified that the source generator sets these properties, so I have no idea why this change is causing this to pop up now.

I looked at the buildId=524014 was against the dev branch, which already has this change. So now I believe it is the source generator change that isn't causing these setters to be hit.

@eerhardt
Copy link
Member Author

I've traced down the code coverage issue to dotnet/runtime#96873.

It looks like the only test we have in this area is

public void AddHttpLogging_WhenConfiguredUsingConfigurationSection_IsCorrect()
{
var services = new ServiceCollection();
var builder = new ConfigurationBuilder().AddInMemoryCollection(new[]
{
new KeyValuePair<string, string?>("HttpLogging:RequestPathLoggingMode", "Structured"),
new KeyValuePair<string, string?>("HttpLogging:RequestPathParameterRedactionMode","None"),
new KeyValuePair<string, string?>("HttpLogging:ExcludePathStartsWith:[0]","/path0toexclude"),
new KeyValuePair<string, string?>("HttpLogging:ExcludePathStartsWith:[1]","/path1toexclude"),
});

Which isn't setting these properties. I'll add to this test to ensure the properties get set so we can keep code coverage at 100%.

- Change ArgumentNullException to normal ArgumentException
- Add tests to LoggingRedactionOptions collection setters to keep 100% code coverage. dotnet/runtime#96873 causes these setters to no longer be called in the existing tests.
@eerhardt eerhardt enabled auto-merge (squash) January 11, 2024 23:40
@eerhardt eerhardt merged commit d58517b into dotnet:main Jan 12, 2024
6 checks passed
@ghost ghost added this to the 8.1 milestone Jan 12, 2024
@eerhardt eerhardt deleted the AotCompatibility branch January 12, 2024 15:12
@github-actions github-actions bot locked and limited conversation to collaborators Feb 12, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants