From: Yusuke Ito Date: Mon, 22 Nov 2021 07:02:33 +0000 (+0900) Subject: Fix parse dotnet trace providers option (#2730) X-Git-Tag: submit/tizen/20220302.040122~18^2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7ebf1c10010e1a505914573535b20d8a6f85cc29;p=platform%2Fcore%2Fdotnet%2Fdiagnostics.git Fix parse dotnet trace providers option (#2730) * fix parsing dotnet-trace collect providers(#2691) * fix the case if quote is in middle of value * Add test and fix trailing semicolon case in filter parsing Co-authored-by: itn3000 Co-authored-by: Juan Sebastian Hoyos Ayala --- diff --git a/src/Tools/dotnet-trace/Extensions.cs b/src/Tools/dotnet-trace/Extensions.cs index 0766ae568..aef932e99 100644 --- a/src/Tools/dotnet-trace/Extensions.cs +++ b/src/Tools/dotnet-trace/Extensions.cs @@ -201,14 +201,21 @@ namespace Microsoft.Diagnostics.Tools.Trace } curIdx += 1; } - AddKeyValueToArgumentDict(argumentDict, argument, keyStart, keyEnd, valStart, valEnd); + if(valStart > valEnd) + { + valEnd = curIdx; + } + if (keyStart < keyEnd) + { + AddKeyValueToArgumentDict(argumentDict, argument, keyStart, keyEnd, valStart, valEnd); + } return argumentDict; } private static void AddKeyValueToArgumentDict(Dictionary argumentDict, string argument, int keyStart, int keyEnd, int valStart, int valEnd) { string key = argument.Substring(keyStart, keyEnd - keyStart); - string val = argument.Substring(valStart); + string val = argument.Substring(valStart, valEnd - valStart); if (val.StartsWith("\"") && val.EndsWith("\"")) { val = val.Substring(1, val.Length - 2); diff --git a/src/tests/dotnet-trace/ProviderParsing.cs b/src/tests/dotnet-trace/ProviderParsing.cs index 9fba018a7..110cd2839 100644 --- a/src/tests/dotnet-trace/ProviderParsing.cs +++ b/src/tests/dotnet-trace/ProviderParsing.cs @@ -188,6 +188,47 @@ namespace Microsoft.Diagnostics.Tools.Trace Assert.True(providerThree.Arguments["FilterAndPayloadSpecs"] == "QuotedValue:-\r\nQuoted/Value:-A=B;C=D;"); } + [Fact] + public void ProvidersWithComplexFilters_CorrectlyParse() + { + string providersToParse = @"MyProvider:::A=B;C=D"; + List parsedProviders = Extensions.ToProviders(providersToParse); + Assert.Single(parsedProviders); + EventPipeProvider providerOne = parsedProviders[0]; + Assert.Equal("MyProvider", providerOne.Name); + Assert.Equal(2, providerOne.Arguments.Count); + Assert.Equal("B", providerOne.Arguments["A"]); + Assert.Equal("D", providerOne.Arguments["C"]); + + providersToParse = @"MyProvider:::A=B;C=""D"",MyProvider2:::A=1;B=2;"; + parsedProviders = Extensions.ToProviders(providersToParse); + Assert.Equal(2, parsedProviders.Count); + providerOne = parsedProviders[0]; + EventPipeProvider providerTwo = parsedProviders[1]; + Assert.Equal("MyProvider", providerOne.Name); + Assert.Equal("MyProvider2", providerTwo.Name); + Assert.Equal(2, providerOne.Arguments.Count); + Assert.Equal("B", providerOne.Arguments["A"]); + Assert.Equal("D", providerOne.Arguments["C"]); + Assert.Equal(2, providerTwo.Arguments.Count); + Assert.Equal("1", providerTwo.Arguments["A"]); + Assert.Equal("2", providerTwo.Arguments["B"]); + + providersToParse = @"MyProvider:::A=""B;C=D"",MyProvider2:::A=""spaced words"";C=1285;D=Spaced Words 2"; + parsedProviders = Extensions.ToProviders(providersToParse); + Assert.Equal(2, parsedProviders.Count); + providerOne = parsedProviders[0]; + providerTwo = parsedProviders[1]; + Assert.Equal("MyProvider", providerOne.Name); + Assert.Equal("MyProvider2", providerTwo.Name); + Assert.Equal(1, providerOne.Arguments.Count); + Assert.Equal(3, providerTwo.Arguments.Count); + Assert.Equal("B;C=D", providerOne.Arguments["A"]); + Assert.Equal("spaced words", providerTwo.Arguments["A"]); + Assert.Equal("Spaced Words 2", providerTwo.Arguments["D"]); + Assert.Equal("1285", providerTwo.Arguments["C"]); + } + [Theory] [InlineData("ProviderOne:0x1:Verbose")] [InlineData("ProviderOne:0x1:verbose")]