Initial batch of dotnet trace provider tests (#514)
authorJohn Salem <josalem@microsoft.com>
Wed, 2 Oct 2019 20:42:45 +0000 (13:42 -0700)
committerGitHub <noreply@github.com>
Wed, 2 Oct 2019 20:42:45 +0000 (13:42 -0700)
.gitignore
diagnostics.sln
src/Tools/dotnet-trace/dotnet-trace.csproj
src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj [new file with mode: 0644]
src/tests/dotnet-trace/ProviderParsing.cs [new file with mode: 0644]

index 353fb0d276b459a7bfbcdd1906661015083ab162..83a2d8a5ec56d6623c6ab78faaf36a20e815bea9 100644 (file)
@@ -119,3 +119,4 @@ StressLog.txt
 *.etlx
 *.netperf
 *.nettrace
+*.speedscope.json
index de60049a94db401e578df11ac761c43c61503b98..4f5d472bba46919ca60b0a858d76691b6c21eae3 100644 (file)
@@ -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}
index e015c662a417dccbaad9b7660349259276c60bca..7c0ba2456250e16653718a70f36b529f90b0ea20 100644 (file)
@@ -19,4 +19,8 @@
     <ProjectReference Include="$(MSBuildThisFileDirectory)..\..\Microsoft.Diagnostics.Tools.RuntimeClient\Microsoft.Diagnostics.Tools.RuntimeClient.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <InternalsVisibleTo Include="DotnetTrace.UnitTests" />
+  </ItemGroup>
+
 </Project>
diff --git a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj
new file mode 100644 (file)
index 0000000..5efb417
--- /dev/null
@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="../../Tools/dotnet-trace/dotnet-trace.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/tests/dotnet-trace/ProviderParsing.cs b/src/tests/dotnet-trace/ProviderParsing.cs
new file mode 100644 (file)
index 0000000..9b84140
--- /dev/null
@@ -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<Provider> 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<Provider> 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<ArgumentNullException>(() => Extensions.ToProviders(providerToParse));
+        }
+
+        [Theory]
+        [InlineData(":::")]
+        [InlineData(":1:1")]
+        public void InvalidProvider_CorrectlyThrows(string providerToParse)
+        {
+            Assert.Throws<ArgumentException>(() => Extensions.ToProviders(providerToParse));
+        }
+
+        [Theory]
+        [InlineData("VeryCoolProvider:0xFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"")]
+        [InlineData("VeryCoolProvider::5:FilterAndPayloadSpecs=\"QuotedValue\"")]
+        public void ValidProviderKeyword_CorrectlyParses(string providerToParse)
+        {
+            List<Provider> 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<Provider> 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<OverflowException>(() => Extensions.ToProviders(providerToParse));
+        }
+
+        [Theory]
+        [InlineData("VeryCoolProvider:__:5:FilterAndPayloadSpecs=\"QuotedValue\"")]
+        [InlineData("VeryCoolProvider:gh::FilterAndPayloadSpecs=\"QuotedValue\"")]
+        public void Invalidkeyword_CorrectlyThrows(string providerToParse)
+        {
+            Assert.Throws<FormatException>(() => 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<Provider> 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<ArgumentException>(() => 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<OverflowException>(() => 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<FormatException>(() => 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<Provider> 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