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();
        }
예제 #4
0
        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");
        }
예제 #6
0
        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);
        }
예제 #7
0
        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
        }
예제 #12
0
        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();
        }
예제 #18
0
        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");
        }
예제 #21
0
        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");
        }
예제 #24
0
        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());
            }
        }
예제 #26
0
        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);
 }