public void IsHeaderFile_NotDotHExtension_ReturnsFalse() { // Act and Assert CFamilyHelper.IsHeaderFile("c:\\aaa\\bbbb\\file.hh").Should().Be(false); CFamilyHelper.IsHeaderFile("c:\\aaa\\bbbb\\FILE.cpp").Should().Be(false); CFamilyHelper.IsHeaderFile("c:\\aaa\\bbbb\\noextension").Should().Be(false); }
public void GetKeyValueOptionsList_WithKnownConfig() { var rulesConfig = GetDummyRulesConfiguration(); var options = CFamilyHelper.GetKeyValueOptionsList(rulesConfig); // QP option CheckHasExactOption("internal.qualityProfile=rule2,rule3"); // only active rules // Check a few known rules with parameters CheckHasExactOption("rule1.rule1 Param1=rule1 Value1"); CheckHasExactOption("rule1.rule1 Param2=rule1 Value2"); CheckHasExactOption("rule2.rule2 Param1=rule2 Value1"); CheckHasExactOption("rule2.rule2 Param2=rule2 Value2"); CheckHasExactOption("rule3.rule3 Param1=rule3 Value1"); CheckHasExactOption("rule3.rule3 Param2=rule3 Value2"); options.Count().Should().Be(7); string CheckHasExactOption(string expected) { var matches = options.Where(x => string.Equals(x, expected, StringComparison.InvariantCulture)); matches.Count().Should().Be(1); return(matches.First()); } }
public void IsFileInSolution_NullItem_ReturnsFalse() { // Arrange and Act var result = CFamilyHelper.IsFileInSolution(null); // Assert result.Should().BeFalse(); }
private static List <Message> GetResponse(DummyProcessRunner dummyProcessRunner, Request request, ILogger logger, CancellationToken cancellationToken) { var messages = new List <Message>(); CFamilyHelper.CallClangAnalyzer(messages.Add, request, dummyProcessRunner, logger, cancellationToken); return(messages); }
public void ConvertFromIssueType() { CFamilyHelper.Convert(IssueType.Bug).Should().Be(Sonarlint.Issue.Types.Type.Bug); CFamilyHelper.Convert(IssueType.CodeSmell).Should().Be(Sonarlint.Issue.Types.Type.CodeSmell); CFamilyHelper.Convert(IssueType.Vulnerability).Should().Be(Sonarlint.Issue.Types.Type.Vulnerability); Action act = () => CFamilyHelper.Convert((IssueType)(-1)); act.Should().ThrowExactly <ArgumentOutOfRangeException>().And.ParamName.Should().Be("issueType"); }
private static List <Message> InvokeAnalyzer(Request request) { var testLogger = new TestLogger(true); var processRunner = new ProcessRunner(new ConfigurableSonarLintSettings(), testLogger); var messages = new List <Message>(); CFamilyHelper.CallClangAnalyzer(messages.Add, request, processRunner, testLogger, CancellationToken.None); return(messages); }
public void CallAnalyzer_BadResponse_Fails() { // Arrange var dummyProcessRunner = new DummyProcessRunner(MockBadEndResponse(), true); Action act = () => CFamilyHelper.CallClangAnalyzer(new Request(), dummyProcessRunner, new TestLogger()); // Act and Assert act.Should().ThrowExactly <InvalidDataException>(); dummyProcessRunner.ExecuteCalled.Should().BeTrue(); File.Exists(dummyProcessRunner.ExchangeFileName).Should().BeFalse(); }
public void ConvertFromIssueSeverity() { CFamilyHelper.Convert(IssueSeverity.Blocker).Should().Be(Severity.Blocker); CFamilyHelper.Convert(IssueSeverity.Critical).Should().Be(Severity.Critical); CFamilyHelper.Convert(IssueSeverity.Info).Should().Be(Severity.Info); CFamilyHelper.Convert(IssueSeverity.Major).Should().Be(Severity.Major); CFamilyHelper.Convert(IssueSeverity.Minor).Should().Be(Severity.Minor); Action act = () => CFamilyHelper.Convert((IssueSeverity)(-1)); act.Should().ThrowExactly <ArgumentOutOfRangeException>().And.ParamName.Should().Be("issueSeverity"); }
public void IsFileInSolution_SingleFileIntelliSense_ReturnsFalse() { // Arrange var projectItemMock = CreateProjectItemWithProject("c:\\foo\\SingleFileISense\\xxx.vcxproj"); // Act var result = CFamilyHelper.IsFileInSolution(projectItemMock.Object); // Assert result.Should().BeFalse(); projectItemMock.Verify(x => x.ContainingProject, Times.Once); // check the test hit the expected path }
public void CallAnalyzer_BadResponse_FailsSilentlyAndReturnsNull() { // Arrange var logger = new TestLogger(); var dummyProcessRunner = new DummyProcessRunner(MockBadEndResponse(), true); var result = CFamilyHelper.CallClangAnalyzer(new Request(), dummyProcessRunner, logger, CancellationToken.None); // Act and Assert result.Should().BeNull(); logger.AssertPartialOutputStrings("Failed to execute analysis"); dummyProcessRunner.ExecuteCalled.Should().BeTrue(); File.Exists(dummyProcessRunner.ExchangeFileName).Should().BeFalse(); }
public void IsFileInSolution_ExceptionThrown_ReturnsFalse() { // Arrange var projectItemMock = new Mock <ProjectItem>(); projectItemMock.Setup(i => i.ContainingProject).Throws <System.Runtime.InteropServices.COMException>(); // Act var result = CFamilyHelper.IsFileInSolution(projectItemMock.Object); // Assert result.Should().BeFalse(); projectItemMock.Verify(x => x.ContainingProject, Times.Once); // check the test hit the expected path }
public void CallAnalyzer_Fails() { // Arrange var dummyProcessRunner = new DummyProcessRunner(MockEmptyResponse(), false); // Act var response = CFamilyHelper.CallClangAnalyzer(new Request(), dummyProcessRunner, new TestLogger()); // Assert dummyProcessRunner.ExecuteCalled.Should().BeTrue(); File.Exists(dummyProcessRunner.ExchangeFileName).Should().BeFalse(); response.Should().BeNull(); }
public void CallAnalyzer_RequestWithReproducer_ReturnsNull() { // Arrange var request = new Request { Flags = Request.CreateReproducer }; var dummyProcessRunner = new DummyProcessRunner(MockBadEndResponse(), true); var result = CFamilyHelper.CallClangAnalyzer(request, dummyProcessRunner, new TestLogger(), CancellationToken.None); // Act and Assert result.Should().BeNull(); dummyProcessRunner.ExecuteCalled.Should().BeTrue(); File.Exists(dummyProcessRunner.ExchangeFileName).Should().BeFalse(); }
public void CreateRequest_HeaderFile_IsNotProcessed() { // Arrange var loggerMock = new Mock <ILogger>(); var projectItemMock = new Mock <ProjectItem>(); var rulesConfigProviderMock = new Mock <ICFamilyRulesConfigProvider>(); // Act var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\dummy\\file.h", rulesConfigProviderMock.Object); // Assert AssertMessageLogged(loggerMock, "Cannot analyze header files. File: 'c:\\dummy\\file.h'"); request.Should().BeNull(); }
public void CreateRequest_ErrorGetting_IsHandled() { // Arrange var loggerMock = new Mock <ILogger>(); var projectItemMock = CreateProjectItemWithProject("c:\\foo\\xxx.vcxproj"); var rulesConfigProviderMock = new Mock <ICFamilyRulesConfigProvider>(); // Act var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\dummy\\file.cpp", rulesConfigProviderMock.Object); // Assert AssertPartialMessageLogged(loggerMock, "Unable to collect C/C++ configuration for c:\\dummy\\file.cpp: "); request.Should().BeNull(); }
public void TryGetConfig_ErrorsAreLogged() { // Arrange var loggerMock = new Mock <ILogger>(); // Act using (new AssertIgnoreScope()) { var request = CFamilyHelper.TryGetConfig(loggerMock.Object, null, "c:\\dummy"); // Assert AssertPartialMessageLogged(loggerMock, "Unable to collect C/C++ configuration for c:\\dummy: "); request.Should().BeNull(); } }
public void CreateRequest_FileOutsideSolution_IsNotProcessed() { // Arrange var loggerMock = new Mock <ILogger>(); var projectItemMock = CreateProjectItemWithProject("c:\\foo\\SingleFileISense\\xxx.vcxproj"); var rulesConfigProviderMock = new Mock <ICFamilyRulesConfigProvider>(); // Act var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\dummy\\file.cpp", rulesConfigProviderMock.Object); // Assert AssertMessageLogged(loggerMock, "Unable to retrieve the configuration for file 'c:\\dummy\\file.cpp'. Check the file is part of a project in the current solution."); request.Should().BeNull(); }
public void CallAnalyzer_Succeeds() { // Arrange var dummyProcessRunner = new DummyProcessRunner(MockResponse(), true); // Act var response = CFamilyHelper.CallClangAnalyzer(new Request(), dummyProcessRunner, new TestLogger()); // Assert dummyProcessRunner.ExecuteCalled.Should().BeTrue(); File.Exists(dummyProcessRunner.ExchangeFileName).Should().BeFalse(); response.Should().NotBeNull(); response.Messages.Count().Should().Be(1); response.Messages[0].Filename.Should().Be("file.cpp"); }
private Request GetSuccessfulRequest(IAnalyzerOptions analyzerOptions) { var loggerMock = new Mock <ILogger>(); var rulesConfig = GetDummyRulesConfiguration(); var rulesConfigProviderMock = new Mock <ICFamilyRulesConfigProvider>(); rulesConfigProviderMock .Setup(x => x.GetRulesConfiguration(It.IsAny <string>())) .Returns(rulesConfig); var projectItemMock = CreateProjectItemWithProject("c:\\foo\\file.cpp"); var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\foo\\file.cpp", rulesConfigProviderMock.Object, analyzerOptions); return(request); }
public void ToSonarLintIssue_EndLineIsNotZero() { var ruleConfig = GetDummyRulesConfiguration(); var message = new Message("rule2", "file", 4, 3, 2, 1, "test endline is not zero", false, null); // Act var issue = CFamilyHelper.ToSonarLintIssue(message, "lang1", ruleConfig); //Assert issue.StartLine.Should().Be(4); issue.StartLineOffset.Should().Be(3 - 1); issue.EndLine.Should().Be(2); issue.EndLineOffset.Should().Be(1 - 1); issue.RuleKey.Should().Be("lang1:rule2"); issue.FilePath.Should().Be("file"); issue.Message.Should().Be("test endline is not zero"); }
public void CreateRequest_PCHRequestDoesntLog() { // Arrange var loggerMock = new Mock <ILogger>(); var projectItemConfig = new ProjectItemConfig { IsVCCLCompilerTool = false }; var projectItemMock = CreateMockProjectItem("c:\\foo\\xxx.vcxproj", projectItemConfig); var analyzerOption = new CFamilyAnalyzerOptions { CreatePreCompiledHeaders = true }; // Act var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\dummy\\file.cpp", null, analyzerOption); // Assert loggerMock.Verify(x => x.WriteLine(It.IsAny <string>()), Times.Never); request.Should().BeNull(); }
public void ToSonarLintIssue_SeverityAndTypeLookup() { var ruleConfig = GetDummyRulesConfiguration(); // 1. Check rule2 var message = new Message("rule2", "any", 4, 3, 2, 1, "message", false, null); var issue = CFamilyHelper.ToSonarLintIssue(message, "lang1", ruleConfig); issue.RuleKey.Should().Be("lang1:rule2"); issue.Severity.Should().Be(Severity.Info); issue.Type.Should().Be(Sonarlint.Issue.Types.Type.CodeSmell); // 2. Check rule3 message = new Message("rule3", "any", 4, 3, 2, 1, "message", false, null); issue = CFamilyHelper.ToSonarLintIssue(message, "lang1", ruleConfig); issue.RuleKey.Should().Be("lang1:rule3"); issue.Severity.Should().Be(Severity.Critical); issue.Type.Should().Be(Sonarlint.Issue.Types.Type.Vulnerability); }
public void ToSonarLintIssue_EndLineIsZero() { // Special case: ignore column offsets if EndLine is zero var ruleConfig = GetDummyRulesConfiguration(); var message = new Message("rule3", "ff", 101, 1, 0, 3, "test endline is zero", true, null); // Act var issue = CFamilyHelper.ToSonarLintIssue(message, "cpp", ruleConfig); //Assert issue.StartLine.Should().Be(101); issue.EndLine.Should().Be(0); issue.StartLineOffset.Should().Be(0); issue.EndLineOffset.Should().Be(0); issue.RuleKey.Should().Be("cpp:rule3"); issue.FilePath.Should().Be("ff"); issue.Message.Should().Be("test endline is zero"); }
public void CreateRequest_ErrorInFileConfigTryGet_IsHandled() { // Arrange var loggerMock = new Mock <ILogger>(); var projectItemMock = CreateMockProjectItem("c:\\foo\\xxx.vcxproj"); // Note: we want the exception to be thrown from inside the FileConfig::TryGet projectItemMock.Setup(x => x.Object).Throws(new InvalidOperationException("xxx")); var rulesConfigProviderMock = new Mock <ICFamilyRulesConfigProvider>(); // Act var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\dummy\\file.cpp", rulesConfigProviderMock.Object, null); // Assert AssertPartialMessageLogged(loggerMock, "Unable to collect C/C++ configuration for c:\\dummy\\file.cpp: "); request.Should().BeNull(); }
public void GetKeyValueOptionsList_UsingRealEmbeddedRulesJson() { var sonarWayProvider = new CFamilySonarWayRulesConfigProvider(CFamilyShared.CFamilyFilesDirectory); var options = CFamilyHelper.GetKeyValueOptionsList(sonarWayProvider.GetRulesConfiguration("cpp")); // QP option CheckHasOption("internal.qualityProfile="); // Check a few known rules with parameters CheckHasOption("ClassComplexity.maximumClassComplexityThreshold=80"); CheckHasOption("S1142.max=3"); CheckHasOption("S1578.format=^[A-Za-z_-][A-Za-z0-9_-]+\\.(c|m|cpp|cc|cxx)$"); options.Count().Should().Be(38); string CheckHasOption(string optionName) { var matches = options.Where(x => x.StartsWith(optionName, StringComparison.InvariantCulture)); matches.Count().Should().Be(1); return(matches.First()); } }
public void CreateRequest_HeaderFile_IsSupported() { // Arrange var loggerMock = new Mock <ILogger>(); var projectItemConfig = new ProjectItemConfig { ItemType = "ClInclude" }; var rulesConfig = GetDummyRulesConfiguration(); var rulesConfigProviderMock = new Mock <ICFamilyRulesConfigProvider>(); rulesConfigProviderMock .Setup(x => x.GetRulesConfiguration(It.IsAny <string>())) .Returns(rulesConfig); var projectItemMock = CreateMockProjectItem("c:\\foo\\xxx.vcxproj", projectItemConfig); // Act var request = CFamilyHelper.CreateRequest(loggerMock.Object, projectItemMock.Object, "c:\\dummy\\file.h", rulesConfigProviderMock.Object, null); // Assert request.Should().NotBeNull(); (request.Flags & Request.MainFileIsHeader).Should().NotBe(0); }
public void SubProcessTimeout() { SetTimeoutAndCheckCalculatedTimeout("", 10000); // not set -> default SetTimeoutAndCheckCalculatedTimeout("222", 222); // valid -> used SetTimeoutAndCheckCalculatedTimeout("200000", 200000); // valid -> used SetTimeoutAndCheckCalculatedTimeout("-111", 10000); // invalid -> default SetTimeoutAndCheckCalculatedTimeout("not an integer", 10000); SetTimeoutAndCheckCalculatedTimeout("1.23", 10000); SetTimeoutAndCheckCalculatedTimeout("2,000", 10000); SetTimeoutAndCheckCalculatedTimeout("2.001", 10000); void SetTimeoutAndCheckCalculatedTimeout(string valueToSet, int expectedTimeout) { using (new EnvironmentVariableScope()) { Environment.SetEnvironmentVariable("SONAR_INTERNAL_CFAMILY_ANALYSIS_TIMEOUT_MS", valueToSet); CFamilyHelper.GetTimeoutInMs().Should().Be(expectedTimeout); } } }
public void IsHeaderFile_DotHExtension_ReturnsTrue() { // Act and Assert CFamilyHelper.IsHeaderFile("c:\\aaa\\bbbb\\file.h").Should().Be(true); CFamilyHelper.IsHeaderFile("c:\\aaa\\bbbb\\FILE.H").Should().Be(true); }