< Summary

Information
Class: DotnetFuzzing.Fuzzers.AssemblyNameInfoFuzzer
Assembly: DotnetFuzzing
File(s): D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\AssemblyNameInfoFuzzer.cs
Line coverage
64%
Covered lines: 43
Uncovered lines: 24
Coverable lines: 67
Total lines: 118
Line coverage: 64.1%
Branch coverage
50%
Covered branches: 4
Total branches: 8
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
FuzzTarget(...)100%11100%
Test(...)50%8862.5%

File(s)

D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\AssemblyNameInfoFuzzer.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Buffers;
 5using System.Globalization;
 6using System.Reflection.Metadata;
 7using System.Runtime.InteropServices;
 8using System.Text;
 9
 10namespace DotnetFuzzing.Fuzzers
 11{
 12    internal sealed class AssemblyNameInfoFuzzer : IFuzzer
 13    {
 014        public string[] TargetAssemblies => ["System.Reflection.Metadata"];
 15
 016        public string[] TargetCoreLibPrefixes => [];
 17
 018        public string Dictionary => "assemblynameinfo.dict";
 19
 20        public void FuzzTarget(ReadOnlySpan<byte> bytes)
 253521        {
 253522            Span<char> chars = new char[Encoding.UTF8.GetCharCount(bytes)];
 253523            Encoding.UTF8.GetChars(bytes, chars);
 24
 253525            using PooledBoundedMemory<char> inputPoisonedBefore = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlacem
 253526            using PooledBoundedMemory<char> inputPoisonedAfter = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlaceme
 27
 253528            Test(inputPoisonedBefore.Span);
 253529            Test(inputPoisonedAfter.Span);
 507030        }
 31
 32        private static void Test(Span<char> span)
 507033        {
 507034            if (AssemblyNameInfo.TryParse(span, out AssemblyNameInfo? fromTryParse))
 235235            {
 235236                AssemblyNameInfo fromParse = AssemblyNameInfo.Parse(span);
 37
 235238                Assert.Equal(fromTryParse.Name, fromParse.Name);
 235239                Assert.Equal(fromTryParse.FullName, fromParse.FullName);
 235240                Assert.Equal(fromTryParse.CultureName, fromParse.CultureName);
 235241                Assert.Equal(fromTryParse.Flags, fromParse.Flags);
 235242                Assert.Equal(fromTryParse.Version, fromParse.Version);
 235243                Assert.SequenceEqual(fromTryParse.PublicKeyOrToken.AsSpan(), fromParse.PublicKeyOrToken.AsSpan());
 44
 235245                if (!string.IsNullOrEmpty(fromParse.CultureName))
 046                {
 47                    try
 048                    {
 049                        _ = CultureInfo.GetCultureInfo(fromParse.CultureName);
 050                    }
 051                    catch (CultureNotFoundException)
 052                    {
 53                        // ToAssemblyName would try to create such a culture and fail.
 054                        return;
 55                    }
 056                }
 57
 235258                Assert.Equal(fromTryParse.ToAssemblyName().Name, fromParse.ToAssemblyName().Name);
 235259                Assert.Equal(fromTryParse.ToAssemblyName().Version, fromParse.ToAssemblyName().Version);
 235260                Assert.Equal(fromTryParse.ToAssemblyName().ContentType, fromParse.ToAssemblyName().ContentType);
 235261                Assert.Equal(fromTryParse.ToAssemblyName().CultureName, fromParse.ToAssemblyName().CultureName);
 62
 235263                Assert.Equal(fromTryParse.Name, fromParse.ToAssemblyName().Name);
 235264                Assert.Equal(fromTryParse.Version, fromParse.ToAssemblyName().Version);
 65
 235266                if (fromTryParse.CultureName is not null)
 067                {
 68                    // When converting to AssemblyName, the culture name is lower-cased
 69                    // by the CultureInfo ctor that calls CultureData.GetCultureData
 70                    // which lowers the name for caching and normalization purposes.
 71                    // It lowers only the part before the `-` character, but we lower
 72                    // the whole string for the sake of simplicity of this test.
 73
 074                    string lowerCase = fromTryParse.CultureName.ToLower();
 075                    if (lowerCase != "c")
 076                    {
 077                        Assert.Equal(lowerCase, fromParse.ToAssemblyName().CultureName!.ToLower());
 078                    }
 79                    else
 080                    {
 81                        // Cultures "c" and "C" get mapped to Invariant Culture.
 082                        Assert.Equal("", fromParse.ToAssemblyName().CultureName);
 083                        Assert.Equal(CultureInfo.InvariantCulture, fromParse.ToAssemblyName().CultureInfo);
 084                    }
 085                }
 86                else
 235287                {
 235288                    Assert.True(fromParse.ToAssemblyName().CultureName is null);
 235289                }
 90
 91                // AssemblyNameInfo.FullName can be different than AssemblyName.FullName:
 92                // AssemblyNameInfo includes public key, AssemblyName only its Token.
 93
 94                try
 235295                {
 235296                    Assert.Equal(fromTryParse.ToAssemblyName().FullName, fromParse.ToAssemblyName().FullName);
 216097                }
 19298                catch (System.Security.SecurityException)
 19299                {
 100                    // AssemblyName.FullName performs public key validation, AssemblyNameInfo does not (on purpose).
 192101                }
 2352102            }
 103            else
 2718104            {
 105                try
 2718106                {
 2718107                    _ = AssemblyNameInfo.Parse(span);
 0108                }
 2718109                catch (ArgumentException)
 2718110                {
 2718111                    return;
 112                }
 113
 0114                throw new Exception("Parsing was supposed to fail!");
 115            }
 5070116        }
 117    }
 118}