From 9e2c9f519d00b28eb241b9896b2b7e8fd74b5006 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 3 Apr 2025 19:56:17 +0200 Subject: [PATCH 1/3] add a test with comment that explains the unexpected behavior --- .../tests/Metadata/AssemblyNameInfoTests.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs index c766e6bd4d5593..0d0b96d05b2d4b 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs @@ -105,6 +105,17 @@ public void EmptyInputIsInvalid() Assert.Throws(() => AssemblyNameInfo.Parse("".AsSpan())); } + [Fact] + public void CultureNameGetLoweredByToAssemblyName() + { + AssemblyNameInfo assemblyNameInfo = AssemblyNameInfo.Parse("test,culture=aA".AsSpan()); + Assert.Equal("aA", assemblyNameInfo.CultureName); + // When converting to AssemblyName, the culture name is lower-cased + // by the CultureInfo ctor that calls CultureData.GetCultureData + // which lowers the name for caching purposes. + Assert.Equal("aa", assemblyNameInfo.ToAssemblyName().CultureName); + } + static void Roundtrip(AssemblyName source) { AssemblyNameInfo parsed = AssemblyNameInfo.Parse(source.FullName.AsSpan()); From 0f401bb9ea659e85af644f44adc0b92d7d5ffd20 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 3 Apr 2025 20:11:50 +0200 Subject: [PATCH 2/3] adjust the AssemblyNameInfoFuzzer --- .../Fuzzers/AssemblyNameInfoFuzzer.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs b/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs index 2e8d3fc102f76a..2454803cb54753 100644 --- a/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs +++ b/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs @@ -61,9 +61,21 @@ private static void Test(Span span) Assert.Equal(fromTryParse.ToAssemblyName().CultureName, fromParse.ToAssemblyName().CultureName); Assert.Equal(fromTryParse.Name, fromParse.ToAssemblyName().Name); - Assert.Equal(fromTryParse.CultureName, fromParse.ToAssemblyName().CultureName); Assert.Equal(fromTryParse.Version, fromParse.ToAssemblyName().Version); + if (fromTryParse.CultureName is not null) + { + // When converting to AssemblyName, the culture name is lower-cased + // by the CultureInfo ctor that calls CultureData.GetCultureData + // which lowers the name for caching purposes. + Assert.Equal(fromTryParse.CultureName.ToLower(), fromParse.ToAssemblyName().CultureName); + } + else + { + Assert.True(fromParse.ToAssemblyName().CultureName is null); + } + + // AssemblyNameInfo.FullName can be different than AssemblyName.FullName: // AssemblyNameInfo includes public key, AssemblyName only its Token. From de4a12615b54685aedc47409e37d0de2dc2ea424 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 3 Apr 2025 20:22:41 +0200 Subject: [PATCH 3/3] mention normalization as well --- .../Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs | 2 +- .../tests/Metadata/AssemblyNameInfoTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs b/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs index 2454803cb54753..4dd81c01864a46 100644 --- a/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs +++ b/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs @@ -67,7 +67,7 @@ private static void Test(Span span) { // When converting to AssemblyName, the culture name is lower-cased // by the CultureInfo ctor that calls CultureData.GetCultureData - // which lowers the name for caching purposes. + // which lowers the name for caching and normalization purposes. Assert.Equal(fromTryParse.CultureName.ToLower(), fromParse.ToAssemblyName().CultureName); } else diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs index 0d0b96d05b2d4b..76448ee80a3565 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs @@ -112,7 +112,7 @@ public void CultureNameGetLoweredByToAssemblyName() Assert.Equal("aA", assemblyNameInfo.CultureName); // When converting to AssemblyName, the culture name is lower-cased // by the CultureInfo ctor that calls CultureData.GetCultureData - // which lowers the name for caching purposes. + // which lowers the name for caching and normalization purposes. Assert.Equal("aa", assemblyNameInfo.ToAssemblyName().CultureName); }