< Summary

Information
Class: DotnetFuzzing.Fuzzers.TypeNameFuzzer
Assembly: DotnetFuzzing
File(s): D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\TypeNameFuzzer.cs
Line coverage
92%
Covered lines: 38
Uncovered lines: 3
Coverable lines: 41
Total lines: 63
Line coverage: 92.6%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
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(...)75%8896.66%

File(s)

D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\TypeNameFuzzer.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.Reflection.Metadata;
 6using System.Text;
 7
 8namespace DotnetFuzzing.Fuzzers
 9{
 10    internal sealed class TypeNameFuzzer : IFuzzer
 11    {
 112        public string[] TargetAssemblies { get; } = ["System.Reflection.Metadata"];
 013        public string[] TargetCoreLibPrefixes => [];
 014        public string Dictionary => "typename.dict";
 15
 16        public void FuzzTarget(ReadOnlySpan<byte> bytes)
 363117        {
 363118            Span<char> charSpan = new char[Encoding.UTF8.GetCharCount(bytes)];
 363119            Encoding.UTF8.GetChars(bytes, charSpan);
 363120            using var poisonAfter = PooledBoundedMemory<char>.Rent(charSpan, PoisonPagePlacement.After);
 363121            using var poisonBefore = PooledBoundedMemory<char>.Rent(charSpan, PoisonPagePlacement.Before);
 22
 363123            Test(poisonAfter.Span);
 363124            Test(poisonBefore.Span);
 726225        }
 26
 27        private static void Test(Span<char> testSpan)
 726228        {
 726229            if (TypeName.TryParse(testSpan, out TypeName? result1))
 351430            {
 351431                TypeName result2 = TypeName.Parse(testSpan);
 351432                Assert.Equal(result1.Name, result2.Name);
 351433                Assert.Equal(result1.FullName, result2.FullName);
 351434                Assert.Equal(result1.AssemblyQualifiedName, result2.AssemblyQualifiedName);
 351435                Assert.Equal(result1.IsSimple, result2.IsSimple);
 351436                Assert.Equal(result1.IsNested, result2.IsNested);
 351437                Assert.Equal(result1.IsArray, result2.IsArray);
 351438                Assert.Equal(result1.GetNodeCount(), result2.GetNodeCount());
 351439                if (result1.AssemblyName != null)
 174040                {
 174041                    Assert.Equal(result1.AssemblyName.Name, result2.AssemblyName!.Name);
 174042                    Assert.Equal(result1.AssemblyName.FullName, result2.AssemblyName.FullName);
 174043                    Assert.Equal(result1.AssemblyName.CultureName, result2.AssemblyName.CultureName);
 174044                    Assert.Equal(result1.AssemblyName.Version?.ToString(), result2.AssemblyName.Version?.ToString());
 174045                }
 46                else
 177447                {
 177448                    Assert.Equal(result1.AssemblyName, result2.AssemblyName);
 177449                }
 351450            }
 51            else
 374852            {
 53                try
 374854                {
 374855                    TypeName.Parse(testSpan);
 056                    throw new Exception("Parsing was supposed to fail!");
 57                }
 1075858                catch (ArgumentException) { }
 48659                catch (InvalidOperationException) { }
 374860            }
 726261        }
 62    }
 63}