From daf55c4229f0a0ade193b78449dddb4a1f39cd3e Mon Sep 17 00:00:00 2001 From: Rolf Kristensen Date: Wed, 12 Jun 2019 00:42:53 +0200 Subject: [PATCH 1/4] FilteringTargetWrapper - Fix XSD for Filter-property --- tools/MakeNLogXSD/XsdFileGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/MakeNLogXSD/XsdFileGenerator.cs b/tools/MakeNLogXSD/XsdFileGenerator.cs index f9069e47e5..9fe84eeb34 100644 --- a/tools/MakeNLogXSD/XsdFileGenerator.cs +++ b/tools/MakeNLogXSD/XsdFileGenerator.cs @@ -313,7 +313,7 @@ private static string GetXsdType(string apiTypeName, bool attribute) return attribute ? "SimpleLayoutAttribute" : "Layout"; case "NLog.Filters.Filter": - return "Filter"; + return attribute ? "xs:string" : "Filter"; case "Condition": return "Condition"; From d70554d2b773bc2c091fbede49a0190eea2c3448 Mon Sep 17 00:00:00 2001 From: Rolf Kristensen Date: Wed, 12 Jun 2019 17:41:38 +0200 Subject: [PATCH 2/4] FilteringTargetWrapper - Fix XSD for Filter-property (never as attribute) --- tools/MakeNLogXSD/XsdFileGenerator.cs | 30 +++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/tools/MakeNLogXSD/XsdFileGenerator.cs b/tools/MakeNLogXSD/XsdFileGenerator.cs index 9fe84eeb34..fbef5ebf03 100644 --- a/tools/MakeNLogXSD/XsdFileGenerator.cs +++ b/tools/MakeNLogXSD/XsdFileGenerator.cs @@ -206,13 +206,13 @@ private static XElement GetAttributeElement(XElement propertyElement) result.Add(new XAttribute("type", enumType)); } - else if (IgnoreTypes.Contains(propertyType)) + else { - return null; - } - else - { - result.Add(new XAttribute("type", GetXsdType(propertyType, true))); + string xsdType = GetXsdType(propertyType, false); + if (xsdType == null) + return null; + + result.Add(new XAttribute("type", xsdType)); } var doc = propertyElement.Element("doc"); @@ -284,14 +284,14 @@ private static XElement GetPropertyElement(XElement propertyElement) result.Add(new XAttribute("maxOccurs", "1")); result.Add(new XAttribute("type", enumType)); } - else if (IgnoreTypes.Contains(propertyType)) - { - return null; - } else { + string xsdType = GetXsdType(propertyType, false); + if (xsdType == null) + return null; + result.Add(new XAttribute("maxOccurs", "1")); - result.Add(new XAttribute("type", GetXsdType(propertyType, false))); + result.Add(new XAttribute("type", xsdType)); } return result; @@ -301,19 +301,23 @@ private static XElement GetPropertyElement(XElement propertyElement) private static string GetXsdType(string apiTypeName, bool attribute) { - if (string.IsNullOrWhiteSpace(apiTypeName)) { throw new NotSupportedException("Unknown API type '" + apiTypeName + "'."); } + if (IgnoreTypes.Contains(apiTypeName)) + { + return null; + } + switch (apiTypeName) { case "Layout": return attribute ? "SimpleLayoutAttribute" : "Layout"; case "NLog.Filters.Filter": - return attribute ? "xs:string" : "Filter"; + return attribute ? null : "Filter"; case "Condition": return "Condition"; From 42c78481714ae50da1a651f2ff2daf6c427f7435 Mon Sep 17 00:00:00 2001 From: Rolf Kristensen Date: Wed, 12 Jun 2019 19:58:20 +0200 Subject: [PATCH 3/4] FilteringTargetWrapper - Updated unit-test to fail when adding unwanted attribute --- .../Targets/Wrappers/FilteringTargetWrapperTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs b/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs index ec36acf28f..e845583b02 100644 --- a/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs +++ b/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs @@ -273,10 +273,11 @@ public void FilteringTargetWrapperWhenRepeatedFilter() { LogManager.Configuration = XmlLoggingConfiguration.CreateFromXmlString(@" + - + From 4f1067ac722334f7373a5b7b73f9d40224288f90 Mon Sep 17 00:00:00 2001 From: Julian Verdurmen <304NotModified@users.noreply.github.com> Date: Wed, 12 Jun 2019 14:08:29 +0200 Subject: [PATCH 4/4] Added tests --- .../Wrappers/FilteringTargetWrapperTests.cs | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs b/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs index e845583b02..5931bf1184 100644 --- a/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs +++ b/tests/NLog.UnitTests/Targets/Wrappers/FilteringTargetWrapperTests.cs @@ -31,6 +31,8 @@ // THE POSSIBILITY OF SUCH DAMAGE. // +using NLog.Filters; + namespace NLog.UnitTests.Targets.Wrappers { using System; @@ -43,7 +45,7 @@ namespace NLog.UnitTests.Targets.Wrappers using Xunit; public class FilteringTargetWrapperTests : NLogTestBase - { + { [Fact] public void FilteringTargetWrapperSyncTest1() { @@ -302,6 +304,57 @@ public void FilteringTargetWrapperWhenRepeatedFilter() Assert.Equal(5, myTarget.Logs.Count); } + [Fact] + public void FilteringTargetWrapperWithConditionAttribute_correctBehavior() + { + // Arrange + LogManager.Configuration = CreateConfigWithCondition(); + var myTarget = LogManager.Configuration.FindTargetByName("memory"); + + // Act + var logger = LogManager.GetLogger(nameof(FilteringTargetWrapperWhenRepeatedFilter)); + logger.Info("Hello World"); + logger.Info("2"); // Will be ignored + logger.Info("3"); // Will be ignored + LogManager.Flush(); + + // Assert + Assert.Equal(1, myTarget.Logs.Count); + } + + [Fact] + public void FilteringTargetWrapperWithConditionAttribute_validCondition() + { + // Arrange + var expectedCondition = "(length(message) > 2)"; + + // Act + var config = CreateConfigWithCondition(); + + // Assert + var myTarget = config.FindTargetByName("target1"); + + Assert.Equal(expectedCondition, myTarget.Condition?.ToString()); + var conditionBasedFilter = Assert.IsType(myTarget.Filter); + Assert.Equal(expectedCondition, conditionBasedFilter.Condition?.ToString()); + } + + private static XmlLoggingConfiguration CreateConfigWithCondition() + { + return XmlLoggingConfiguration.CreateFromXmlString(@" + + + + + + + + + + "); + } + + class MyAsyncTarget : Target { public int WriteCount { get; private set; }