示例#1
0
        public void AllRules_SonarWayTagPresenceMatchesIsEnabledByDefault()
        {
            var allAnalyzers = new RuleFinder().AllAnalyzerTypes
                               .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                               .SelectMany(analyzer => analyzer.SupportedDiagnostics)
                               .ToList();

            var parameterizedAnalyzers = new RuleFinder().AllAnalyzerTypes
                                         .Where(RuleFinder.IsParameterized)
                                         .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                                         .SelectMany(analyzer => analyzer.SupportedDiagnostics)
                                         .ToHashSet();

            foreach (var analyzer in allAnalyzers)
            {
                var isInSonarWay = analyzer.CustomTags.Contains(DiagnosticDescriptorBuilder.SonarWayTag);

                if (parameterizedAnalyzers.Contains(analyzer))
                {
                    analyzer.IsEnabledByDefault.Should().BeFalse();
                }
                else if (isInSonarWay)
                {
                    analyzer.IsEnabledByDefault.Should().BeTrue();
                }
                else
                {
                    analyzer.IsEnabledByDefault.Should().BeFalse();
                }
            }
        }
示例#2
0
        public void RulesDoNotThrow_VB()
        {
            var analyzers = RuleFinder.GetAnalyzers(AnalyzerLanguage.VisualBasic).ToList();

            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\InvalidSyntax.vb", analyzers, CompilationErrorBehavior.Ignore);
            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\SpecialCases.vb", analyzers, CompilationErrorBehavior.Ignore);
        }
 public void CheckNumberOfBHIAnalyzers()
 {
     var ruleFinder = new RuleFinder();
     var analyzers = ruleFinder.GetAllAnalyzerTypes();
     var bhiAnalyzers = analyzers.Where( c  => c.Assembly.FullName.Contains("BHI"));
     Assert.AreEqual(12, bhiAnalyzers.Count(), "Should have number of analyzers");
 }
示例#4
0
        private void AddMissingEntries(AnalysisOutput output, AnalyzerLanguage language)
        {
            var foundKeys = output.Issues.Select(i => i.RuleId).ToList();

            var notFoundKeys = RuleFinder.GetAnalyzerTypes(language)
                               .Select(t =>
                                       new
            {
                Type          = t,
                RuleAttribute = t.GetCustomAttribute <RuleAttribute>()
            })
                               .Select(rule =>
                                       RuleFinder.IsRuleTemplate(rule.Type)
                        ? string.Format(TemplateRuleIdPattern, rule.RuleAttribute.Key)
                        : rule.RuleAttribute.Key)
                               .Where(s => !foundKeys.Contains(s));

            foreach (var notFoundKey in notFoundKeys)
            {
                output.Issues.Add(new Issue
                {
                    RuleId = notFoundKey
                });
            }
        }
示例#5
0
 public static IEnumerable <DiagnosticAnalyzer> GetNonTemplateAnalyzers(AnalyzerLanguage language)
 {
     return
         (new RuleFinder().GetAnalyzerTypes(language)
          .Where(type => !RuleFinder.IsRuleTemplate(type))
          .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type)));
 }
示例#6
0
        public void GetAllAnalyzerTypes()
        {
            var finder             = new RuleFinder();
            var countParameterless = finder.GetParameterlessAnalyzerTypes().Count();

            finder.GetAllAnalyzerTypes().Count().Should().BeGreaterThan(countParameterless);
        }
示例#7
0
        public void Rules_DoNot_Throw()
        {
            var analyzers = RuleFinder.GetAnalyzers().ToList();

            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\InvalidSyntax.cs", analyzers, CompilationErrorBehavior.Ignore);
            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\SpecialCases.cs", analyzers, CompilationErrorBehavior.Ignore);
        }
        public void SqaleSubCharacteristicAttribute()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers)
            {
                var noSqaleCount = analyzer.GetCustomAttributes <NoSqaleRemediationAttribute>().Count();

                var subCharacteristicCount = analyzer.GetCustomAttributes <SqaleSubCharacteristicAttribute>().Count();

                if (noSqaleCount > 0)
                {
                    if (subCharacteristicCount > 0)
                    {
                        Assert.Fail(
                            "SqaleSubCharacteristicAttribute can only be assigned to DiagnosticAnalyzers that have a SQALE " +
                            "remediation function, '{0}' has NoSqaleRemediationAttribute",
                            analyzer.Name);
                    }
                }
                else
                {
                    if (subCharacteristicCount != 1)
                    {
                        Assert.Fail(
                            "Only one SqaleSubCharacteristicAttribute can be assigned to DiagnosticAnalyzers, '{0}' has {1}",
                            analyzer.Name, subCharacteristicCount);
                    }
                }
            }
        }
示例#9
0
        public void Rules_DoNot_Throw()
        {
            var analyzers = new RuleFinder().GetAnalyzerTypes(AnalyzerLanguage.CSharp)
                            .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                            .ToList();

            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\InvalidSyntax.cs", analyzers);
            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\SpecialCases.cs", analyzers);
        }
示例#10
0
        public void VisualStudio_NoRuleTemplates()
        {
            var analyzers = GetDiagnosticAnalyzerTypes(new[] { RuleFinder.GetPackagedRuleAssembly() });

            foreach (var analyzer in analyzers.Where(RuleFinder.IsRuleTemplate))
            {
                Assert.Fail("Visual Studio rules cannot be templates, remove DiagnosticAnalyzer '{0}'.", analyzer.Name);
            }
        }
示例#11
0
        public void DiagnosticAnalyzerHasRuleAttribute()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers)
            {
                var ruleDescriptors = analyzer.GetCustomAttributes <RuleAttribute>();

                ruleDescriptors.Should().NotBeEmpty("RuleAttribute is missing from DiagnosticAnalyzer '{0}'", analyzer.Name);
            }
        }
示例#12
0
        private void CheckIntegrationTestCount(AnalyzerLanguage language)
        {
            ValidateLanguageInput(language);
            CreateMissingExpectedDirectory(language);

            Assert.AreEqual(
                RuleFinder.GetAnalyzerTypes(language).Count(),
                ExpectedDirectory
                .GetDirectories(language.GetDirectoryName()).First()
                .GetFiles("S*.json").Count());
        }
示例#13
0
        public void GetAllAnalyzerTypes()
        {
            var finder = new RuleFinder();

            var countParameterless = finder.GetParameterlessAnalyzerTypes(AnalyzerLanguage.CSharp).Count();

            finder.AllAnalyzerTypes.Should().HaveCountGreaterThan(countParameterless);

            countParameterless = finder.GetParameterlessAnalyzerTypes(AnalyzerLanguage.VisualBasic).Count();
            finder.AllAnalyzerTypes.Should().HaveCountGreaterThan(countParameterless);
        }
        public void CheckBHIAnalyzers()
        {
            var ruleFinder = new RuleFinder();
            var analyzers = ruleFinder.GetAllAnalyzerTypes();
            var bhiAnalyzers = analyzers.Where(c => c.Assembly.FullName.Contains("BHI"));
            foreach(var analyzer in bhiAnalyzers)
            {
                MemberInfo[] info = analyzer.GetMember("Rule", BindingFlags.NonPublic | BindingFlags.Instance);
                Assert.IsNotNull(info, "getting analyzer " + analyzer.Name);

            }
        }
示例#15
0
 public void Setup()
 {
     ItSourcesRootDirectory = GetItSourcesFolder();
     CodeFiles = ItSourcesRootDirectory
                 .EnumerateFiles("*.*", SearchOption.AllDirectories)
                 .Where(file =>
                        SupportedExtensions.Contains(file.Extension, StringComparer.OrdinalIgnoreCase));
     RuleFinder        = new RuleFinder();
     XmlInputPattern   = GenerateAnalysisInputFilePattern();
     ExpectedDirectory = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Expected"));
     CreateOrClearMissingActualDirectory();
 }
示例#16
0
        protected virtual async Task ApplyEntityRuleAsync(IEntity entity)
        {
            Type entityType = ProxyHelper.GetUnProxiedType(entity);
            // 加载规则列表
            var groups = await RuleFinder.GetRuleGroupsAsync(entityType);

            if (groups.Any())
            {
                // 应用规则
                await EntityRuleContributor.ApplyAsync(new EntityRuleContext(groups, entity));
            }
        }
 public void Setup()
 {
     ItSourcesRootDirectory = GetItSourcesFolder();
     CodeFiles = ItSourcesRootDirectory
         .EnumerateFiles("*.*", SearchOption.AllDirectories)
         .Where(file =>
         SupportedExtensions.Contains(file.Extension, StringComparer.OrdinalIgnoreCase));
     RuleFinder = new RuleFinder();
     XmlInputPattern = GenerateAnalysisInputFilePattern();
     ExpectedDirectory = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Expected"));
     CreateOrClearMissingActualDirectory();
 }
示例#18
0
 public void GetAllAnalyzerTypes()
 {
     var finder = new RuleFinder();
     {
         var countParameterless = finder.GetParameterlessAnalyzerTypes(AnalyzerLanguage.CSharp).Count();
         finder.GetAllAnalyzerTypes().Count().Should().BeGreaterThan(countParameterless);
     }
     {
         var countParameterless = finder.GetParameterlessAnalyzerTypes(AnalyzerLanguage.VisualBasic).Count();
         finder.GetAllAnalyzerTypes().Count().Should().BeGreaterThan(countParameterless);
     }
 }
        public void DiagnosticAnalyzerHasRuleAttribute()
        {
            var analyzers = GetDiagnosticAnalyzerTypes(RuleFinder.GetRuleAssemblies());

            foreach (var analyzer in analyzers)
            {
                var ruleDescriptor = analyzer.GetCustomAttributes <RuleAttribute>().SingleOrDefault();
                if (ruleDescriptor == null)
                {
                    throw new Exception(string.Format("RuleAttribute is missing from DiagnosticAnalyzer '{0}'", analyzer.Name));
                }
            }
        }
示例#20
0
        public void DiagnosticAnalyzerHasRuleAttribute()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers)
            {
                var ruleDescriptor = analyzer.GetCustomAttributes<RuleAttribute>().SingleOrDefault();
                if (ruleDescriptor == null)
                {
                    Assert.Fail("RuleAttribute is missing from DiagnosticAnalyzer '{0}'", analyzer.Name);
                }
            }
        }
示例#21
0
        public void VisualStudio_OnlyParameterlessRules()
        {
            var analyzers = GetDiagnosticAnalyzerTypes(new[] { RuleFinder.GetPackagedRuleAssembly() });

            foreach (var analyzer in analyzers)
            {
                var hasParameter = analyzer.GetProperties().Any(p => p.GetCustomAttributes <RuleParameterAttribute>().Any());
                if (hasParameter)
                {
                    Assert.Fail("Visual Studio rules cannot have parameters, remove DiagnosticAnalyzer '{0}'.", analyzer.Name);
                }
            }
        }
示例#22
0
        public void DiagnosticAnalyzerHasRuleAttribute()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers)
            {
                var ruleDescriptor = analyzer.GetCustomAttributes <RuleAttribute>().SingleOrDefault();
                if (ruleDescriptor == null)
                {
                    Assert.Fail("RuleAttribute is missing from DiagnosticAnalyzer '{0}'", analyzer.Name);
                }
            }
        }
        public void SingleSqaleRemediationAttribute()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers)
            {
                var count = analyzer.GetCustomAttributes <SqaleRemediationAttribute>().Count();
                if (count != 1)
                {
                    Assert.Fail("Only one SqaleRemediationAttribute can be assigned to DiagnosticAnalyzers, '{0}' has {1}",
                                analyzer.Name, count);
                }
            }
        }
示例#24
0
        public void VisualStudio_AllParameterlessRulesNotRuleTemplate()
        {
            var analyzers = GetDiagnosticAnalyzerTypes(new[] { RuleFinder.GetExtraRuleAssembly() });

            foreach (var analyzer in analyzers.Where(type => !RuleFinder.IsRuleTemplate(type)))
            {
                var hasParameter = analyzer.GetProperties().Any(p => p.GetCustomAttributes <RuleParameterAttribute>().Any());
                if (!hasParameter)
                {
                    Assert.Fail(
                        "DiagnosticAnalyzer '{0}' should be moved to the assembly that implements Visual Studio rules.",
                        analyzer.Name);
                }
            }
        }
示例#25
0
        public void AllRulesEnabledByDefault_ContainSonarWayCustomTag()
        {
            var descriptors = new RuleFinder().AllAnalyzerTypes.SelectMany(SupportedDiagnostics)
                              // Security hotspots are enabled by default, but they will report issues only
                              // when their ID is contained in SonarLint.xml
                              .Where(descriptor => !IsSecurityHotspot(descriptor));

            foreach (var descriptor in descriptors)
            {
                if (descriptor.IsEnabledByDefault)
                {
                    descriptor.CustomTags.Should().Contain(DiagnosticDescriptorBuilder.SonarWayTag, $"{descriptor.Id} should be in SonarWay");
                }
            }
        }
示例#26
0
        public void AllRulesEnabledByDefault_ContainSonarWayCustomTag()
        {
            var analyzers = new RuleFinder().AllAnalyzerTypes
                            .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                            .SelectMany(analyzer => analyzer.SupportedDiagnostics)
                            .ToList();

            foreach (var analyzer in analyzers)
            {
                if (analyzer.IsEnabledByDefault)
                {
                    analyzer.CustomTags.Should().Contain(DiagnosticDescriptorBuilder.SonarWayTag);
                }
            }
        }
示例#27
0
        public void TemplateRule_With_Direct_Parameters()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers.Where(RuleFinder.IsRuleTemplate))
            {
                var hasParameter = analyzer.GetProperties().Any(p => p.GetCustomAttributes<RuleParameterAttribute>().Any());
                if (hasParameter)
                {
                    Assert.Fail(
                        "DiagnosticAnalyzer '{0}' has parameters that are defined outside of IRuleTemplateInstance.",
                        analyzer.Name);
                }
            }
        }
示例#28
0
        public void CodeFixProviders_Named_Properly()
        {
            var codeFixProviders = GetCodeFixProviderTypes(RuleFinder.GetPackagedRuleAssemblies());

            foreach (var codeFixProvider in codeFixProviders)
            {
                var analyzerName = codeFixProvider.FullName.Replace(RuleDetailBuilder.CodeFixProviderSuffix, "");
                if (codeFixProvider.Assembly.GetType(analyzerName) == null)
                {
                    Assert.Fail(
                        "CodeFixProvider '{0}' has no matching DiagnosticAnalyzer.",
                        codeFixProvider.Name);
                }
            }
        }
示例#29
0
        public void TemplateRule_With_Direct_Parameters()
        {
            var analyzers = new RuleFinder().GetAllAnalyzerTypes();

            foreach (var analyzer in analyzers.Where(RuleFinder.IsRuleTemplate))
            {
                var hasParameter = analyzer.GetProperties().Any(p => p.GetCustomAttributes <RuleParameterAttribute>().Any());
                if (hasParameter)
                {
                    Assert.Fail(
                        "DiagnosticAnalyzer '{0}' has parameters that are defined outside of IRuleTemplateInstance.",
                        analyzer.Name);
                }
            }
        }
示例#30
0
        public void CodeFixProviders_Have_Title()
        {
            var codeFixProviders = GetCodeFixProviderTypes(RuleFinder.GetPackagedRuleAssemblies());

            foreach (var codeFixProvider in codeFixProviders)
            {
                var titles = RuleDetailBuilder.GetCodeFixTitles(codeFixProvider);
                if (!titles.Any())
                {
                    Assert.Fail(
                        "CodeFixProvider '{0}' has no title field.",
                        codeFixProvider.Name);
                }
            }
        }
示例#31
0
        public void SecurityHotspots_Rules_Not_Configurable()
        {
            var hotspotDiagnosticDescriptors = new RuleFinder()
                                               .GetAnalyzerTypes(AnalyzerLanguage.CSharp)
                                               .Select(t => (SonarDiagnosticAnalyzer)Activator.CreateInstance(t))
                                               .SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics)
                                               .Where(IsSecurityHotspot)
                                               .ToList();

            foreach (var descriptor in hotspotDiagnosticDescriptors)
            {
                descriptor.CustomTags.Should().Contain(
                    WellKnownDiagnosticTags.NotConfigurable,
                    because: $"{descriptor.Id} is hotspot and should not be configurable");
            }
        }
        public ImmutableArray <DiagnosticAnalyzer> GetUtilityAnalyzers()
        {
            var builder = ImmutableArray.CreateBuilder <DiagnosticAnalyzer>();

            var utilityAnalyzerTypes = RuleFinder.GetUtilityAnalyzerTypes(language)
                                       .Where(t => !t.IsAbstract)
                                       .ToList();

            foreach (var analyzer in utilityAnalyzerTypes
                     .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type)))
            {
                builder.Add(analyzer);
            }

            return(builder.ToImmutable());
        }
示例#33
0
        public void AbstractDiagnosticAnalyzer_Should_Have_No_RuleAttribute()
        {
            var analyzers = RuleFinder.GetPackagedRuleAssemblies()
                            .SelectMany(assembly => assembly.GetTypes())
                            .Where(t =>
                                   t.IsSubclassOf(typeof(DiagnosticAnalyzer)) &&
                                   t.IsAbstract)
                            .ToList();

            foreach (var analyzer in analyzers)
            {
                var ruleDescriptor = analyzer.GetCustomAttributes <RuleAttribute>().SingleOrDefault();
                if (ruleDescriptor != null)
                {
                    Assert.Fail("RuleAttribute is added to abstract DiagnosticAnalyzer '{0}'", analyzer.Name);
                }
            }
        }
示例#34
0
        public ImmutableArray <DiagnosticAnalyzer> GetAnalyzers()
        {
            var builder = ImmutableArray.CreateBuilder <DiagnosticAnalyzer>();

            foreach (var analyzer in nonTemplateAnalyzers
                     .Where(analyzer => AnalyzerIds.Contains(analyzer.SupportedDiagnostics.Single().Id)))
            {
                if (RuleFinder.IsParametered(analyzer.GetType()))
                {
                    SetParameterValues(analyzer);
                }
                builder.Add(analyzer);
            }

            if (language == AnalyzerLanguage.CSharp)
            {
                AddAnalyzerCommentRegularExpression(builder);
            }

            return(builder.ToImmutable());
        }
        public void RuleHasResourceHtml()
        {
            var assemblies = RuleFinder.GetRuleAssemblies();
            var analyzers  = GetDiagnosticAnalyzerTypes(assemblies);

            var resources = new Dictionary <Assembly, string[]>();

            foreach (var assembly in assemblies)
            {
                resources[assembly] = assembly.GetManifestResourceNames();
            }

            var missingDescriptors = new List <string>();

            foreach (var analyzer in analyzers)
            {
                var ruleDescriptor = analyzer.GetCustomAttributes <RuleAttribute>().First();
                var resource       = resources[analyzer.Assembly].SingleOrDefault(r => r.EndsWith(
                                                                                      string.Format(CultureInfo.InvariantCulture, RuleFinder.RuleDescriptionPathPattern,
                                                                                                    ruleDescriptor.Key), StringComparison.OrdinalIgnoreCase));

                if (resource != null)
                {
                    using (var stream = analyzer.Assembly.GetManifestResourceStream(resource))
                        using (var reader = new StreamReader(stream))
                        {
                            var content = reader.ReadToEnd();
                        }
                }
                else
                {
                    missingDescriptors.Add(string.Format("'{0}' ({1})", analyzer.Name, ruleDescriptor.Key));
                }
            }

            if (missingDescriptors.Any())
            {
                throw new Exception(string.Format("Missing HTML description for rule {0}", string.Join(",", missingDescriptors)));
            }
        }
示例#36
0
        public void AllRules_SonarWayTagPresenceMatchesIsEnabledByDefault()
        {
            var allAnalyzers = new RuleFinder().AllAnalyzerTypes
                               .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                               .SelectMany(analyzer => analyzer.SupportedDiagnostics)
                               .ToList();

            var parameterizedAnalyzers = new RuleFinder().AllAnalyzerTypes
                                         .Where(RuleFinder.IsParameterized)
                                         .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                                         .SelectMany(analyzer => analyzer.SupportedDiagnostics)
                                         .ToHashSet();

            foreach (var analyzer in allAnalyzers)
            {
                var isInSonarWay = analyzer.CustomTags.Contains(DiagnosticDescriptorBuilder.SonarWayTag);

                if (IsSecurityHotspot(analyzer))
                {
                    // Security hotspots are enabled by default, but they will report issues only
                    // when their ID is contained in SonarLint.xml
                    analyzer.IsEnabledByDefault.Should().BeTrue($"{analyzer.Id} should be enabled by default");
                }
                else if (parameterizedAnalyzers.Contains(analyzer))
                {
                    // Even if a a parametrized rule is in Sonar way profile, it is still disabled by default.
                    // See https://github.com/SonarSource/sonar-dotnet/issues/1274
                    analyzer.IsEnabledByDefault.Should().BeFalse($"{analyzer.Id} has parameters and should be disabled by default");
                }
                else if (isInSonarWay)
                {
                    analyzer.IsEnabledByDefault.Should().BeTrue($"{analyzer.Id} is in SonarWay");
                }
                else
                {
                    analyzer.IsEnabledByDefault.Should().BeFalse($"{analyzer.Id} is not in SonarWay");
                }
            }
        }
 public void CheckNumberOfParameterAnalyzers()
 {
     var ruleFinder = new RuleFinder();
     var count=ruleFinder.GetParameterlessAnalyzerTypes().Count();
     Assert.AreEqual(98, count, "Should have number of analyzers");
 }
示例#38
0
 public void GetAnalyzerTypes()
 {
     var analyzers = new RuleFinder().GetAnalyzerTypes(AnalyzerLanguage.CSharp);
     analyzers.Should().Contain(typeof(EmptyStatement));
 }
示例#39
0
 public void GetAllAnalyzerTypes()
 {
     var finder = new RuleFinder();
     var countParameterless = finder.GetParameterlessAnalyzerTypes().Count();
     finder.GetAllAnalyzerTypes().Count().Should().BeGreaterThan(countParameterless);
 }
 public void CheckNumberOfAnalyzers()
 {
     var ruleFinder = new RuleFinder();
     var count = ruleFinder.GetAllAnalyzerTypes().Count();
     Assert.AreEqual(111, count, "Should have number of analyzers");
 }
示例#41
0
        public void Rules_DoNot_Throw()
        {
            var analyzers = new RuleFinder().GetAnalyzerTypes(AnalyzerLanguage.CSharp)
                .Select(type => (DiagnosticAnalyzer)Activator.CreateInstance(type))
                .ToList();

            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\InvalidSyntax.cs", analyzers);
            Verifier.VerifyNoExceptionThrown(@"TestCasesForRuleFailure\SpecialCases.cs", analyzers);
        }