internal override string GetExpectedOutputForAnalyzerDiagnosticsWithSuppression(MockCSharpCompiler cmd, string justification) { string expectedOutput = @"{{ ""$schema"": ""http://json.schemastore.org/sarif-2.1.0"", ""version"": ""2.1.0"", ""runs"": [ {{ {5}, ""tool"": {{ ""driver"": {{ ""name"": ""{0}"", ""version"": ""{1}"", ""dottedQuadFileVersion"": ""{2}"", ""semanticVersion"": ""{3}"", ""language"": ""{4}"", {6} }} }}, ""columnKind"": ""utf16CodeUnits"" }} ] }}"; return(FormatOutputText( expectedOutput, cmd, AnalyzerForErrorLogTest.GetExpectedV2ErrorLogWithSuppressionResultsText(cmd.Compilation, justification), AnalyzerForErrorLogTest.GetExpectedV2ErrorLogRulesText())); }
public void AnalyzerDiagnosticsWithAndWithoutLocation() { var source = @" public class C { }"; var sourceFile = Temp.CreateFile().WriteAllText(source).Path; var outputDir = Temp.CreateDirectory(); var errorLogFile = Path.Combine(outputDir.Path, "ErrorLog.txt"); var outputFilePath = Path.Combine(outputDir.Path, "test.dll"); var cmd = new MockCSharpCompiler(null, _baseDirectory, new[] { "/nologo", "/t:library", $"/out:{outputFilePath}", sourceFile, "/preferreduilang:en", $"/errorlog:{errorLogFile}" }, analyzers: ImmutableArray.Create<DiagnosticAnalyzer>(new AnalyzerForErrorLogTest())); var outWriter = new StringWriter(CultureInfo.InvariantCulture); var exitCode = cmd.Run(outWriter); var actualConsoleOutput = outWriter.ToString().Trim(); Assert.Contains(AnalyzerForErrorLogTest.Descriptor1.Id, actualConsoleOutput); Assert.Contains(AnalyzerForErrorLogTest.Descriptor2.Id, actualConsoleOutput); Assert.NotEqual(0, exitCode); var actualOutput = File.ReadAllText(errorLogFile).Trim(); var expectedHeader = GetExpectedErrorLogHeader(actualOutput, cmd); var expectedIssues = AnalyzerForErrorLogTest.GetExpectedErrorLogResultsText(cmd.Compilation); var expectedText = expectedHeader + expectedIssues; Assert.Equal(expectedText, actualOutput); CleanupAllGeneratedFiles(sourceFile); CleanupAllGeneratedFiles(outputFilePath); CleanupAllGeneratedFiles(errorLogFile); }
internal override string GetExpectedOutputForAnalyzerDiagnosticsWithAndWithoutLocation(MockCSharpCompiler cmd) { var expectedHeader = GetExpectedErrorLogHeader(cmd); var expectedIssues = AnalyzerForErrorLogTest.GetExpectedV1ErrorLogResultsAndRulesText(cmd.Compilation); return(expectedHeader + expectedIssues); }
public void SimpleCompilerDiagnostics() { var source = @" public class C { private int x; }"; var sourceFile = Temp.CreateFile().WriteAllText(source).Path; var errorLogDir = Temp.CreateDirectory(); var errorLogFile = Path.Combine(errorLogDir.Path, "ErrorLog.txt"); var cmd = new MockCSharpCompiler(null, _baseDirectory, new[] { "/nologo", sourceFile, "/preferreduilang:en", $"/errorlog:{errorLogFile}" }); var outWriter = new StringWriter(CultureInfo.InvariantCulture); var exitCode = cmd.Run(outWriter); var actualConsoleOutput = outWriter.ToString().Trim(); Assert.Contains("CS0169", actualConsoleOutput); Assert.Contains("CS5001", actualConsoleOutput); Assert.NotEqual(0, exitCode); var actualOutput = File.ReadAllText(errorLogFile).Trim(); var expectedHeader = GetExpectedErrorLogHeader(actualOutput, cmd); var expectedIssues = string.Format(@" ""results"": [ {{ ""ruleId"": ""CS0169"", ""level"": ""warning"", ""message"": ""The field 'C.x' is never used"", ""locations"": [ {{ ""resultFile"": {{ ""uri"": ""{0}"", ""region"": {{ ""startLine"": 4, ""startColumn"": 17, ""endLine"": 4, ""endColumn"": 18 }} }} }} ], ""properties"": {{ ""warningLevel"": 3 }} }}, {{ ""ruleId"": ""CS5001"", ""level"": ""error"", ""message"": ""Program does not contain a static 'Main' method suitable for an entry point"" }} ], ""rules"": {{ ""CS0169"": {{ ""id"": ""CS0169"", ""shortDescription"": ""Field is never used"", ""defaultLevel"": ""warning"", ""properties"": {{ ""category"": ""Compiler"", ""isEnabledByDefault"": true, ""tags"": [ ""Compiler"", ""Telemetry"" ] }} }}, ""CS5001"": {{ ""id"": ""CS5001"", ""defaultLevel"": ""error"", ""properties"": {{ ""category"": ""Compiler"", ""isEnabledByDefault"": true, ""tags"": [ ""Compiler"", ""Telemetry"", ""NotConfigurable"" ] }} }} }} }} ] }}", AnalyzerForErrorLogTest.GetUriForPath(sourceFile)); var expectedText = expectedHeader + expectedIssues; Assert.Equal(expectedText, actualOutput); CleanupAllGeneratedFiles(sourceFile); CleanupAllGeneratedFiles(errorLogFile); }
internal override string GetExpectedOutputForSimpleCompilerDiagnostics(CommonCompiler cmd, string sourceFile) { string expectedOutput = @"{{ ""$schema"": ""http://json.schemastore.org/sarif-2.1.0"", ""version"": ""2.1.0"", ""runs"": [ {{ ""results"": [ {{ ""ruleId"": ""CS5001"", ""ruleIndex"": 0, ""level"": ""error"", ""message"": {{ ""text"": ""Program does not contain a static 'Main' method suitable for an entry point"" }} }}, {{ ""ruleId"": ""CS0169"", ""ruleIndex"": 1, ""level"": ""warning"", ""message"": {{ ""text"": ""The field 'C.x' is never used"" }}, ""locations"": [ {{ ""physicalLocation"": {{ ""artifactLocation"": {{ ""uri"": ""{5}"" }}, ""region"": {{ ""startLine"": 4, ""startColumn"": 17, ""endLine"": 4, ""endColumn"": 18 }} }} }} ], ""properties"": {{ ""warningLevel"": 3 }} }} ], ""tool"": {{ ""driver"": {{ ""name"": ""{0}"", ""version"": ""{1}"", ""dottedQuadFileVersion"": ""{2}"", ""semanticVersion"": ""{3}"", ""language"": ""{4}"", ""rules"": [ {{ ""id"": ""CS5001"", ""defaultConfiguration"": {{ ""level"": ""error"" }}, ""helpUri"": ""https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS5001)"", ""properties"": {{ ""category"": ""Compiler"", ""tags"": [ ""Compiler"", ""Telemetry"", ""NotConfigurable"" ] }} }}, {{ ""id"": ""CS0169"", ""shortDescription"": {{ ""text"": ""Field is never used"" }}, ""helpUri"": ""https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0169)"", ""properties"": {{ ""category"": ""Compiler"", ""tags"": [ ""Compiler"", ""Telemetry"" ] }} }} ] }} }}, ""columnKind"": ""utf16CodeUnits"" }} ] }}"; return(FormatOutputText( expectedOutput, cmd, AnalyzerForErrorLogTest.GetUriForPath(sourceFile))); }
public void SimpleCompilerDiagnostics_Suppressed() { var source = @" public class C { #pragma warning disable CS0169 private int x; #pragma warning restore CS0169 }"; var sourceFile = Temp.CreateFile().WriteAllText(source).Path; var errorLogDir = Temp.CreateDirectory(); var errorLogFile = Path.Combine(errorLogDir.Path, "ErrorLog.txt"); var cmd = new MockCSharpCompiler(null, _baseDirectory, new[] { "/nologo", sourceFile, "/preferreduilang:en", $"/errorlog:{errorLogFile}" }); var outWriter = new StringWriter(CultureInfo.InvariantCulture); var exitCode = cmd.Run(outWriter); var actualConsoleOutput = outWriter.ToString().Trim(); // Suppressed diagnostics are only report in the error log, not the console output. Assert.DoesNotContain("CS0169", actualConsoleOutput); Assert.Contains("CS5001", actualConsoleOutput); Assert.NotEqual(0, exitCode); var actualOutput = File.ReadAllText(errorLogFile).Trim(); var expectedHeader = GetExpectedErrorLogHeader(actualOutput, cmd); var expectedIssues = string.Format(@" ""issues"": [ {{ ""ruleId"": ""CS0169"", ""locations"": [ {{ ""analysisTarget"": [ {{ ""uri"": ""{0}"", ""region"": {{ ""startLine"": 5, ""startColumn"": 17, ""endLine"": 5, ""endColumn"": 18 }} }} ] }} ], ""fullMessage"": ""The field 'C.x' is never used"", ""properties"": {{ ""severity"": ""Warning"", ""warningLevel"": ""3"", ""defaultSeverity"": ""Warning"", ""title"": ""Field is never used"", ""category"": ""Compiler"", ""isEnabledByDefault"": ""True"", ""isSuppressedInSource"": ""True"", ""customTags"": ""Compiler;Telemetry"" }} }}, {{ ""ruleId"": ""CS5001"", ""locations"": [ ], ""fullMessage"": ""Program does not contain a static 'Main' method suitable for an entry point"", ""properties"": {{ ""severity"": ""Error"", ""defaultSeverity"": ""Error"", ""category"": ""Compiler"", ""isEnabledByDefault"": ""True"", ""isSuppressedInSource"": ""False"", ""customTags"": ""Compiler;Telemetry;NotConfigurable"" }} }} ] }} ] }}", AnalyzerForErrorLogTest.GetEscapedUriForPath(sourceFile)); var expectedText = expectedHeader + expectedIssues; Assert.Equal(expectedText, actualOutput); CleanupAllGeneratedFiles(sourceFile); CleanupAllGeneratedFiles(errorLogFile); }
internal override string GetExpectedOutputForSimpleCompilerDiagnostics(CommonCompiler cmd, string sourceFile) { var expectedHeader = GetExpectedErrorLogHeader(cmd); var expectedIssues = string.Format(@" ""results"": [ {{ ""ruleId"": ""CS5001"", ""level"": ""error"", ""message"": ""Program does not contain a static 'Main' method suitable for an entry point"" }}, {{ ""ruleId"": ""CS0169"", ""level"": ""warning"", ""message"": ""The field 'C.x' is never used"", ""locations"": [ {{ ""resultFile"": {{ ""uri"": ""{0}"", ""region"": {{ ""startLine"": 4, ""startColumn"": 17, ""endLine"": 4, ""endColumn"": 18 }} }} }} ], ""properties"": {{ ""warningLevel"": 3 }} }} ], ""rules"": {{ ""CS0169"": {{ ""id"": ""CS0169"", ""shortDescription"": ""Field is never used"", ""defaultLevel"": ""warning"", ""helpUri"": ""https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0169)"", ""properties"": {{ ""category"": ""Compiler"", ""isEnabledByDefault"": true, ""tags"": [ ""Compiler"", ""Telemetry"" ] }} }}, ""CS5001"": {{ ""id"": ""CS5001"", ""defaultLevel"": ""error"", ""helpUri"": ""https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS5001)"", ""properties"": {{ ""category"": ""Compiler"", ""isEnabledByDefault"": true, ""tags"": [ ""Compiler"", ""Telemetry"", ""NotConfigurable"" ] }} }} }} }} ] }}", AnalyzerForErrorLogTest.GetUriForPath(sourceFile)); return(expectedHeader + expectedIssues); }