From 687a6f8a96cebdc2647c39161b4e4560fea2f7a3 Mon Sep 17 00:00:00 2001 From: Gregory Paidis Date: Wed, 28 Feb 2024 17:40:16 +0100 Subject: [PATCH] Review 3 --- .../MessageTemplateExtractor.cs | 2 +- .../MessageTemplatesShouldBeCorrect.cs | 1 + .../MessageTemplatesShouldBeCorrectTest.cs | 87 ++++++++++++------- 3 files changed, 58 insertions(+), 32 deletions(-) rename analyzers/src/SonarAnalyzer.CSharp/{Helpers => Rules/MessageTemplates}/MessageTemplateExtractor.cs (98%) rename analyzers/src/SonarAnalyzer.CSharp/Rules/{ => MessageTemplates}/MessageTemplatesShouldBeCorrect.cs (99%) diff --git a/analyzers/src/SonarAnalyzer.CSharp/Helpers/MessageTemplateExtractor.cs b/analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplates/MessageTemplateExtractor.cs similarity index 98% rename from analyzers/src/SonarAnalyzer.CSharp/Helpers/MessageTemplateExtractor.cs rename to analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplates/MessageTemplateExtractor.cs index 9eaa4ce288b..fbe92a17e50 100644 --- a/analyzers/src/SonarAnalyzer.CSharp/Helpers/MessageTemplateExtractor.cs +++ b/analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplates/MessageTemplateExtractor.cs @@ -20,7 +20,7 @@ using static Roslyn.Utilities.SonarAnalyzer.Shared.LoggingFrameworkMethods; -namespace SonarAnalyzer.Helpers; +namespace SonarAnalyzer.Rules.MessageTemplates; internal static class MessageTemplateExtractor { diff --git a/analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplatesShouldBeCorrect.cs b/analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplates/MessageTemplatesShouldBeCorrect.cs similarity index 99% rename from analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplatesShouldBeCorrect.cs rename to analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplates/MessageTemplatesShouldBeCorrect.cs index e5b15fe0442..fcd34fc9402 100644 --- a/analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplatesShouldBeCorrect.cs +++ b/analyzers/src/SonarAnalyzer.CSharp/Rules/MessageTemplates/MessageTemplatesShouldBeCorrect.cs @@ -19,6 +19,7 @@ */ using System.Text.RegularExpressions; +using SonarAnalyzer.Rules.MessageTemplates; namespace SonarAnalyzer.Rules.CSharp; diff --git a/analyzers/tests/SonarAnalyzer.Test/Rules/MessageTemplatesShouldBeCorrectTest.cs b/analyzers/tests/SonarAnalyzer.Test/Rules/MessageTemplatesShouldBeCorrectTest.cs index b3709d465d9..868d89455e6 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Rules/MessageTemplatesShouldBeCorrectTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Rules/MessageTemplatesShouldBeCorrectTest.cs @@ -35,13 +35,14 @@ public void MessageTemplatesShouldBeCorrect_CS() => .Verify(); [DataTestMethod] - [DataRow("LogCritical")] - [DataRow("LogDebug")] - [DataRow("LogError")] - [DataRow("LogInformation")] - [DataRow("LogTrace")] - [DataRow("LogWarning")] - public void MessageTemplatesShouldBeCorrect_MicrosoftExtensionsLogging_CS(string methodName) => + [DataRow("LogCritical", "")] + [DataRow("LogDebug", "")] + [DataRow("LogError", "")] + [DataRow("LogInformation", "")] + [DataRow("LogTrace", "")] + [DataRow("LogWarning", "")] + [DataRow("Log", "LogLevel.Information,")] + public void MessageTemplatesShouldBeCorrect_MicrosoftExtensionsLogging_CS(string methodName, string logLevel) => Builder .AddReferences(NuGetMetadataReference.MicrosoftExtensionsLoggingAbstractions()) .AddSnippet($$$""" @@ -50,26 +51,27 @@ public void MessageTemplatesShouldBeCorrect_MicrosoftExtensionsLogging_CS(string public class Program { - public void Method(ILogger logger, string user, int count) + public void Method(ILogger logger, string user) { - Console.WriteLine("Login failed for {User", user); // Compliant - logger.{{{methodName}}}("Login failed for {User}", user); // Compliant + Console.WriteLine("Login failed for {User", user); // Compliant + logger.{{{methodName}}}({{{logLevel}}} "Login failed for {User}", user); // Compliant - logger.{{{methodName}}}("{", user); // Noncompliant - logger.Log(LogLevel.Information, "{", user); // Noncompliant - LoggerExtensions.{{{methodName}}}(logger, "{", user); // Noncompliant + logger.{{{methodName}}}({{{logLevel}}} "{", user); // Noncompliant + LoggerExtensions.{{{methodName}}}(logger, {{{logLevel}}} "{", user); // Noncompliant } } - """).Verify(); + """) + .Verify(); [DataTestMethod] - [DataRow("Debug")] - [DataRow("Error")] - [DataRow("Information")] - [DataRow("Fatal")] - [DataRow("Warning")] - [DataRow("Verbose")] - public void MessageTemplatesShouldBeCorrect_Serilog_CS(string methodName) => + [DataRow("Debug", "")] + [DataRow("Error", "")] + [DataRow("Information", "")] + [DataRow("Fatal", "")] + [DataRow("Warning", "")] + [DataRow("Verbose", "")] + [DataRow("Write", "LogEventLevel.Verbose,")] + public void MessageTemplatesShouldBeCorrect_Serilog_CS(string methodName, string logEventLevel) => Builder .AddReferences(NuGetMetadataReference.Serilog(Constants.NuGetLatestVersion)) .AddSnippet($$$""" @@ -79,17 +81,17 @@ public void MessageTemplatesShouldBeCorrect_Serilog_CS(string methodName) => public class Program { - public void Method(ILogger logger, string user, int count) + public void Method(ILogger logger, string user) { - Console.WriteLine("Login failed for {User", user); // Compliant - logger.{{{methodName}}}("Login failed for {User}", user); // Compliant + Console.WriteLine("Login failed for {User", user); // Compliant + logger.{{{methodName}}}({{{logEventLevel}}} "Login failed for {User}", user); // Compliant - logger.{{{methodName}}}("{", user); // Noncompliant - Log.{{{methodName}}}("{", user); // Noncompliant - Log.Write(LogEventLevel.Verbose, "{", user); // Noncompliant + logger.{{{methodName}}}({{{logEventLevel}}} "{", user); // Noncompliant + Log.{{{methodName}}}({{{logEventLevel}}} "{", user); // Noncompliant } } - """).Verify(); + """) + .Verify(); [DataTestMethod] [DataRow("Debug")] @@ -109,7 +111,7 @@ public void MessageTemplatesShouldBeCorrect_NLog_CS(string methodName) => public class Program { - public void Method(ILogger iLogger, Logger logger, MyLogger myLogger, string user, int count) + public void Method(ILogger iLogger, Logger logger, MyLogger myLogger, string user) { Console.WriteLine("Login failed for {User", user); // Compliant logger.{{{methodName}}}("Login failed for {User}", user); // Compliant @@ -117,9 +119,32 @@ public void Method(ILogger iLogger, Logger logger, MyLogger myLogger, string use iLogger.{{{methodName}}}("{", user); // Noncompliant logger.{{{methodName}}}("{", user); // Noncompliant myLogger.{{{methodName}}}("{", user); // Noncompliant - ILoggerExtensions.ConditionalDebug(iLogger, "{", user); // Noncompliant } } public class MyLogger : Logger { } - """).Verify(); + """) + .Verify(); + + [DataTestMethod] + [DataRow("ConditionalDebug")] + [DataRow("ConditionalTrace")] + public void MessageTemplatesShouldBeCorrect_NLog_ConditionalExtensions_CS(string methodName) => + Builder + .AddReferences(NuGetMetadataReference.NLog(Constants.NuGetLatestVersion)) + .AddSnippet($$$""" + using System; + using NLog; + + public class Program + { + public void Method(ILogger iLogger, string user) + { + Console.WriteLine("Login failed for {User", user); // Compliant + + ILoggerExtensions.{{{methodName}}}(iLogger, "{", user); // Noncompliant + } + } + public class MyLogger : Logger { } + """) + .Verify(); }