Fix parse dotnet trace providers option (#2730)
authorYusuke Ito <skitoy4321@gmail.com>
Mon, 22 Nov 2021 07:02:33 +0000 (16:02 +0900)
committerGitHub <noreply@github.com>
Mon, 22 Nov 2021 07:02:33 +0000 (23:02 -0800)
* 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 <itn3000@gmail.com>
Co-authored-by: Juan Sebastian Hoyos Ayala <juhoyosa@microsoft.com>
src/Tools/dotnet-trace/Extensions.cs
src/tests/dotnet-trace/ProviderParsing.cs

index 0766ae56856cfed6cbc0ce715e8b01d379e8490a..aef932e99512d3884532b470df9063077d4ba9de 100644 (file)
@@ -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<string, string> 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);
index 9fba018a7d77d81588be06b962bf18102aebce02..110cd2839f6c15a7d01228d64b7feb8304b778a7 100644 (file)
@@ -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<EventPipeProvider> 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")]