< Summary

Information
Class: DotnetFuzzing.Fuzzers.TypeNameFuzzer
Assembly: DotnetFuzzing
File(s): D:\runner\runtime\src\libraries\Fuzzing\DotnetFuzzing\Fuzzers\TypeNameFuzzer.cs
Line coverage
2%
Covered lines: 1
Uncovered lines: 40
Coverable lines: 41
Total lines: 63
Line coverage: 2.4%
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\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)
 017        {
 018            Span<char> charSpan = new char[Encoding.UTF8.GetCharCount(bytes)];
 019            Encoding.UTF8.GetChars(bytes, charSpan);
 020            using var poisonAfter = PooledBoundedMemory<char>.Rent(charSpan, PoisonPagePlacement.After);
 021            using var poisonBefore = PooledBoundedMemory<char>.Rent(charSpan, PoisonPagePlacement.Before);
 22
 023            Test(poisonAfter.Span);
 024            Test(poisonBefore.Span);
 025        }
 26
 27        private static void Test(Span<char> testSpan)
 028        {
 029            if (TypeName.TryParse(testSpan, out TypeName? result1))
 030            {
 031                TypeName result2 = TypeName.Parse(testSpan);
 032                Assert.Equal(result1.Name, result2.Name);
 033                Assert.Equal(result1.FullName, result2.FullName);
 034                Assert.Equal(result1.AssemblyQualifiedName, result2.AssemblyQualifiedName);
 035                Assert.Equal(result1.IsSimple, result2.IsSimple);
 036                Assert.Equal(result1.IsNested, result2.IsNested);
 037                Assert.Equal(result1.IsArray, result2.IsArray);
 038                Assert.Equal(result1.GetNodeCount(), result2.GetNodeCount());
 039                if (result1.AssemblyName != null)
 040                {
 041                    Assert.Equal(result1.AssemblyName.Name, result2.AssemblyName!.Name);
 042                    Assert.Equal(result1.AssemblyName.FullName, result2.AssemblyName.FullName);
 043                    Assert.Equal(result1.AssemblyName.CultureName, result2.AssemblyName.CultureName);
 044                    Assert.Equal(result1.AssemblyName.Version?.ToString(), result2.AssemblyName.Version?.ToString());
 045                }
 46                else
 047                {
 048                    Assert.Equal(result1.AssemblyName, result2.AssemblyName);
 049                }
 050            }
 51            else
 052            {
 53                try
 054                {
 055                    TypeName.Parse(testSpan);
 056                    throw new Exception("Parsing was supposed to fail!");
 57                }
 058                catch (ArgumentException) { }
 059                catch (InvalidOperationException) { }
 060            }
 061        }
 62    }
 63}