< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
FuzzTarget(...)100%110%
Test(...)0%880%

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)
 021        {
 022            Span<char> chars = new char[Encoding.UTF8.GetCharCount(bytes)];
 023            Encoding.UTF8.GetChars(bytes, chars);
 24
 025            using PooledBoundedMemory<char> inputPoisonedBefore = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlacem
 026            using PooledBoundedMemory<char> inputPoisonedAfter = PooledBoundedMemory<char>.Rent(chars, PoisonPagePlaceme
 27
 028            Test(inputPoisonedBefore.Span);
 029            Test(inputPoisonedAfter.Span);
 030        }
 31
 32        private static void Test(Span<char> span)
 033        {
 034            if (AssemblyNameInfo.TryParse(span, out AssemblyNameInfo? fromTryParse))
 035            {
 036                AssemblyNameInfo fromParse = AssemblyNameInfo.Parse(span);
 37
 038                Assert.Equal(fromTryParse.Name, fromParse.Name);
 039                Assert.Equal(fromTryParse.FullName, fromParse.FullName);
 040                Assert.Equal(fromTryParse.CultureName, fromParse.CultureName);
 041                Assert.Equal(fromTryParse.Flags, fromParse.Flags);
 042                Assert.Equal(fromTryParse.Version, fromParse.Version);
 043                Assert.SequenceEqual(fromTryParse.PublicKeyOrToken.AsSpan(), fromParse.PublicKeyOrToken.AsSpan());
 44
 045                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
 058                Assert.Equal(fromTryParse.ToAssemblyName().Name, fromParse.ToAssemblyName().Name);
 059                Assert.Equal(fromTryParse.ToAssemblyName().Version, fromParse.ToAssemblyName().Version);
 060                Assert.Equal(fromTryParse.ToAssemblyName().ContentType, fromParse.ToAssemblyName().ContentType);
 061                Assert.Equal(fromTryParse.ToAssemblyName().CultureName, fromParse.ToAssemblyName().CultureName);
 62
 063                Assert.Equal(fromTryParse.Name, fromParse.ToAssemblyName().Name);
 064                Assert.Equal(fromTryParse.Version, fromParse.ToAssemblyName().Version);
 65
 066                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
 087                {
 088                    Assert.True(fromParse.ToAssemblyName().CultureName is null);
 089                }
 90
 91                // AssemblyNameInfo.FullName can be different than AssemblyName.FullName:
 92                // AssemblyNameInfo includes public key, AssemblyName only its Token.
 93
 94                try
 095                {
 096                    Assert.Equal(fromTryParse.ToAssemblyName().FullName, fromParse.ToAssemblyName().FullName);
 097                }
 098                catch (System.Security.SecurityException)
 099                {
 100                    // AssemblyName.FullName performs public key validation, AssemblyNameInfo does not (on purpose).
 0101                }
 0102            }
 103            else
 0104            {
 105                try
 0106                {
 0107                    _ = AssemblyNameInfo.Parse(span);
 0108                }
 0109                catch (ArgumentException)
 0110                {
 0111                    return;
 112                }
 113
 0114                throw new Exception("Parsing was supposed to fail!");
 115            }
 0116        }
 117    }
 118}