From f850a35d2262279b2d99b642d362b12e37d2b9c3 Mon Sep 17 00:00:00 2001 From: John Salem Date: Wed, 2 Oct 2019 13:42:45 -0700 Subject: [PATCH] Initial batch of dotnet trace provider tests (#514) --- .gitignore | 1 + diagnostics.sln | 46 +++++ src/Tools/dotnet-trace/dotnet-trace.csproj | 4 + .../dotnet-trace/DotnetTrace.UnitTests.csproj | 11 ++ src/tests/dotnet-trace/ProviderParsing.cs | 182 ++++++++++++++++++ 5 files changed, 244 insertions(+) create mode 100644 src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj create mode 100644 src/tests/dotnet-trace/ProviderParsing.cs diff --git a/.gitignore b/.gitignore index 353fb0d27..83a2d8a5e 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,4 @@ StressLog.txt *.etlx *.netperf *.nettrace +*.speedscope.json diff --git a/diagnostics.sln b/diagnostics.sln index de60049a9..4f5d472bb 100644 --- a/diagnostics.sln +++ b/diagnostics.sln @@ -47,6 +47,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Debug EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Symbol.Package", "src\SOS\SOS.Package\SOS.Symbol.Package.csproj", "{410394E0-7F4F-42D5-B5FA-30956F44ACBC}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{03479E19-3F18-49A6-910A-F5041E27E7C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotnetTrace.UnitTests", "src\tests\dotnet-trace\DotnetTrace.UnitTests.csproj", "{AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Checked|Any CPU = Checked|Any CPU @@ -760,6 +764,46 @@ Global {410394E0-7F4F-42D5-B5FA-30956F44ACBC}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {410394E0-7F4F-42D5-B5FA-30956F44ACBC}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {410394E0-7F4F-42D5-B5FA-30956F44ACBC}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|Any CPU.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|ARM.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|ARM.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|ARM64.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|x64.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|x64.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|x86.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Checked|x86.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|ARM.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|ARM.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|ARM64.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|x64.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|x64.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|x86.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Debug|x86.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|Any CPU.Build.0 = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|ARM.ActiveCfg = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|ARM.Build.0 = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|ARM64.ActiveCfg = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|ARM64.Build.0 = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|x64.ActiveCfg = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|x64.Build.0 = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|x86.ActiveCfg = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.Release|x86.Build.0 = Release|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|ARM.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|ARM.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|ARM64.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|ARM64.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -786,6 +830,8 @@ Global {234416E9-EA5F-4018-AC34-67682C5D3E04} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} {A1CE682A-12C4-4FF9-B864-A9A15A8726D2} = {19FAB78C-3351-4911-8F0C-8C6056401740} {410394E0-7F4F-42D5-B5FA-30956F44ACBC} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} + {03479E19-3F18-49A6-910A-F5041E27E7C0} = {19FAB78C-3351-4911-8F0C-8C6056401740} + {AEDCCF5B-5AD0-4D64-BF73-5CF468E07D22} = {03479E19-3F18-49A6-910A-F5041E27E7C0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0} diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index e015c662a..7c0ba2456 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -19,4 +19,8 @@ + + + + diff --git a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj new file mode 100644 index 000000000..5efb417a6 --- /dev/null +++ b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj @@ -0,0 +1,11 @@ + + + + netcoreapp3.0 + + + + + + + diff --git a/src/tests/dotnet-trace/ProviderParsing.cs b/src/tests/dotnet-trace/ProviderParsing.cs new file mode 100644 index 000000000..9b84140b5 --- /dev/null +++ b/src/tests/dotnet-trace/ProviderParsing.cs @@ -0,0 +1,182 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Xunit; +using Microsoft.Diagnostics.Tools.RuntimeClient; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Diagnostics.Tools.Trace +{ + public class ProviderParsingTests + { + [Theory] + [InlineData("VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\"")] + [InlineData("VeryCoolProvider:1:5:FilterAndPayloadSpecs=\"QuotedValue\"")] + public void ValidProvider_CorrectlyParses(string providerToParse) + { + List parsedProviders = Extensions.ToProviders(providerToParse); + Assert.True(parsedProviders.Count == 1); + Provider provider = parsedProviders.First(); + Assert.True(provider.Name == "VeryCoolProvider"); + Assert.True(provider.Keywords == 1); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); + Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + } + + [Theory] + [InlineData("VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value\"")] + public void ValidProviderFilter_CorrectlyParses(string providerToParse) + { + List parsedProviders = Extensions.ToProviders(providerToParse); + Assert.True(parsedProviders.Count == 1); + Provider provider = parsedProviders.First(); + Assert.True(provider.Name == "VeryCoolProvider"); + Assert.True(provider.Keywords == 1); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); + Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value\""); + } + + [Theory] + [InlineData(null)] + [InlineData(",")] + public void EmptyProvider_CorrectlyThrows(string providerToParse) + { + Assert.Throws(() => Extensions.ToProviders(providerToParse)); + } + + [Theory] + [InlineData(":::")] + [InlineData(":1:1")] + public void InvalidProvider_CorrectlyThrows(string providerToParse) + { + Assert.Throws(() => Extensions.ToProviders(providerToParse)); + } + + [Theory] + [InlineData("VeryCoolProvider:0xFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"")] + [InlineData("VeryCoolProvider::5:FilterAndPayloadSpecs=\"QuotedValue\"")] + public void ValidProviderKeyword_CorrectlyParses(string providerToParse) + { + List parsedProviders = Extensions.ToProviders(providerToParse); + Assert.True(parsedProviders.Count == 1); + Provider provider = parsedProviders.First(); + Assert.True(provider.Name == "VeryCoolProvider"); + Assert.True(provider.Keywords == ulong.MaxValue); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); + Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + } + + [Theory] + [InlineData("VeryCoolProvider::5:FilterAndPayloadSpecs=\"QuotedValue\"")] + [InlineData("VeryCoolProvider:::FilterAndPayloadSpecs=\"QuotedValue\"")] + public void ValidProviderEventLevel_CorrectlyParses(string providerToParse) + { + List parsedProviders = Extensions.ToProviders(providerToParse); + Assert.True(parsedProviders.Count == 1); + Provider provider = parsedProviders.First(); + Assert.True(provider.Name == "VeryCoolProvider"); + Assert.True(provider.Keywords == ulong.MaxValue); + Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); + Assert.True(provider.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + } + + [Theory] + [InlineData("VeryCoolProvider:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"")] + [InlineData("VeryCoolProvider:0x10000000000000000::FilterAndPayloadSpecs=\"QuotedValue\"")] + public void OutOfRangekeyword_CorrectlyThrows(string providerToParse) + { + Assert.Throws(() => Extensions.ToProviders(providerToParse)); + } + + [Theory] + [InlineData("VeryCoolProvider:__:5:FilterAndPayloadSpecs=\"QuotedValue\"")] + [InlineData("VeryCoolProvider:gh::FilterAndPayloadSpecs=\"QuotedValue\"")] + public void Invalidkeyword_CorrectlyThrows(string providerToParse) + { + Assert.Throws(() => Extensions.ToProviders(providerToParse)); + } + + [Theory] + [InlineData("ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:2:2:key=value,ProviderThree:3:3:key=value")] + [InlineData("ProviderOne:1:1:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x2:2:key=value,ProviderThree:0x3:3:key=value")] + public void MultipleValidProviders_CorrectlyParses(string providersToParse) + { + List parsedProviders = Extensions.ToProviders(providersToParse); + Assert.True(parsedProviders.Count == 3); + Provider providerOne = parsedProviders[0]; + Provider providerTwo = parsedProviders[1]; + Provider providerThree = parsedProviders[2]; + + Assert.True(providerOne.Name == "ProviderOne"); + Assert.True(providerOne.Keywords == 1); + Assert.True(providerOne.EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); + Assert.True(providerOne.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + + Assert.True(providerTwo.Name == "ProviderTwo"); + Assert.True(providerTwo.Keywords == 2); + Assert.True(providerTwo.EventLevel == System.Diagnostics.Tracing.EventLevel.Error); + Assert.True(providerTwo.FilterData == "key=value"); + + Assert.True(providerThree.Name == "ProviderThree"); + Assert.True(providerThree.Keywords == 3); + Assert.True(providerThree.EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); + Assert.True(providerThree.FilterData == "key=value"); + } + + [Theory] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value")] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:2:2:key=value,:3:3:key=value")] + [InlineData("ProviderOne:0x1:5:key=value,key=FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value")] + public void MultipleValidProvidersWithOneInvalidProvider_CorrectlyThrows(string providersToParse) + { + Assert.Throws(() => Extensions.ToProviders(providersToParse)); + } + + [Theory] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x10000000000000000:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:18446744073709551615:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] + public void MultipleValidProvidersWithOneOutOfRangeKeyword_CorrectlyThrows(string providersToParse) + { + Assert.Throws(() => Extensions.ToProviders(providersToParse)); + } + + [Theory] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:__:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:gh:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] + [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:$:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] + public void MultipleValidProvidersWithOneInvalidKeyword_CorrectlyThrows(string providersToParse) + { + Assert.Throws(() => Extensions.ToProviders(providersToParse)); + } + + [Theory] + [InlineData("ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\",ProviderTwo:2:2:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\"")] + public void MultipleProvidersWithComplexFilters_CorrectlyParse(string providersToParse) + { + List parsedProviders = Extensions.ToProviders(providersToParse); + Assert.True(parsedProviders.Count == 3); + Provider providerOne = parsedProviders[0]; + Provider providerTwo = parsedProviders[1]; + Provider providerThree = parsedProviders[2]; + + Assert.True(providerOne.Name == "ProviderOne"); + Assert.True(providerOne.Keywords == 1); + Assert.True(providerOne.EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); + Assert.True(providerOne.FilterData == "FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\""); + + Assert.True(providerTwo.Name == "ProviderTwo"); + Assert.True(providerTwo.Keywords == 2); + Assert.True(providerTwo.EventLevel == System.Diagnostics.Tracing.EventLevel.Error); + Assert.True(providerTwo.FilterData == "FilterAndPayloadSpecs=\"QuotedValue\""); + + Assert.True(providerThree.Name == "ProviderThree"); + Assert.True(providerThree.Keywords == 3); + Assert.True(providerThree.EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); + Assert.True(providerThree.FilterData == "FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\""); + } + } +} \ No newline at end of file -- 2.34.1