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
{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
{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}
--- /dev/null
+// 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