Example #1
0
        public void ResourceStaticAnalysisExecutorCanBeConfiguredAndExecutesRules()
        {
            try
            {
                ResourceStaticAnalysisApplication ResourceStaticAnalysisApplication = ResourceStaticAnalysisApplication.Instance;
                List <Exception> exceptions;
                ResourceStaticAnalysisApplication.Initialize(new List <string>()
                {
                    TestContext.DeploymentDirectory
                });                                                                                                       // TestContext.DeploymentDirectory will pick UnitTests.dll
                // which contains the two rules defined here.
                // RuleThatAccessesAllLocResourceProperties and AdjectivePlusPlaceholder rules

                ResourceStaticAnalysisApplication.Execute("Sample.resx", true, out exceptions);

                Assert.IsFalse(exceptions != null, "Engine reported some execution errors.");
            }
            catch (OperationCanceledException ex)
            {
                Assert.Fail("ResourceStaticAnalysis engine failed because {0}", ex.Message);
            }
            catch (ResourceStaticAnalysisEngineInitializationException ex)//Thrown when there are no rules to run on the input set.
            {
                Assert.Fail("ResourceStaticAnalysis engine failed because {0}", ex.Message);
            }
        }
Example #2
0
        public void ResourceStaticAnalysisCanHandleFilteringExpressions()
        {
            var tupleResults = TestHelpers.RunEngine("Sample.resx", TestContext.DeploymentDirectory);
            ResourceStaticAnalysisApplication resourceStaticAnalysisApplication = tupleResults.Item1;
            List <Exception> exceptions = tupleResults.Item2;

            Assert.IsFalse(exceptions != null, "Engine reported some execution errors.");
            Assert.IsTrue(resourceStaticAnalysisApplication.RulesConfiguration.First().Value.FilteringExpressions.Count == 1, "Engine did not process the filtering expression defined in config file.");
        }
Example #3
0
        /// <summary>
        /// Execute the engine that is configured through ResourceStaticAnalysisExecutor project. <see cref="ResourceStaticAnalysisApplication"/>
        /// </summary>
        /// <param name="resourceFile">Resource File used to run the engine.</param>
        /// <param name="checksFolder">Unit Test folder where we have the dll dependencies with the rules built and config file.</param>
        /// <returns></returns>
        internal static Tuple <ResourceStaticAnalysisApplication, List <Exception> > RunEngine(string resourceFile, string checksFolder)
        {
            ResourceStaticAnalysisApplication resourceStaticAnalysisApplication = ResourceStaticAnalysisApplication.Instance;
            List <Exception> exceptions = new List <Exception>();

            resourceStaticAnalysisApplication.Initialize(new List <string>()
            {
                checksFolder
            });
            resourceStaticAnalysisApplication.Execute(resourceFile, false, out exceptions);

            return(new Tuple <ResourceStaticAnalysisApplication, List <Exception> >(resourceStaticAnalysisApplication, exceptions));
        }
        static void Main(string[] args)
        {
            if (args.Length == 0 || args.Length > 4)
            {
                Console.WriteLine("Usage is: BatchModeExecutor.exe <Rules Path directory> <directory to scan> <optional include subdirectories? (true|false)> <optional path to output directory>");
                return;
            }

            string checksDirectory = args[0];
            string directory       = args[1];

            // Validate input directory
            if (!Directory.Exists(directory))
            {
                Console.WriteLine("Directory {0} does not exist", directory);
                return;
            }

            bool subDirectories = false;

            string           output                       = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"BatchModeExecutorOutput");
            List <string>    allDirectories               = new List <string>();
            int              directoriesScanned           = 0;
            int              filesScanned                 = 0;
            int              filesWithErrors              = 0;
            List <Exception> reportedExceptions           = new List <Exception>();
            List <string>    keywordsToExcludeDirectories = new List <string>();

            if (args.Length >= 3)
            {
                bool checkArgument;
                subDirectories = Boolean.TryParse(args[2], out checkArgument);
                if (!checkArgument)
                {
                    Console.WriteLine("Usage is: BatchModeExecutor.exe <directory to scan> <optional include subdirectories? (true|false)> <optional path to output directory>");
                    return;
                }
            }

            if (args.Length == 4)
            {
                output = args[3];
            }

            string[] parsedExclusionFile = File.ReadAllLines("ExcludedPaths.txt");
            foreach (string line in parsedExclusionFile)
            {
                if (!line.StartsWith("#") && !string.IsNullOrWhiteSpace(line))
                {
                    keywordsToExcludeDirectories.Add(line);
                }
            }

            Console.WriteLine("Directory to be scanned is {0}", directory);
            Console.WriteLine("Include Subdirectories is set to {0}", subDirectories.ToString());
            Console.WriteLine("Output directory is {0}", output);

            if (!Directory.Exists(output))
            {
                try
                {
                    Directory.CreateDirectory(output);
                }
                catch (Exception ex)
                {
                    throw new IOException("Failed to create output directory", ex);
                }
            }

            try
            {
                allDirectories.Add(directory);

                if (subDirectories == true)
                {
                    foreach (
                        string singleDirectory in Directory.GetDirectories(directory, "*", SearchOption.AllDirectories))
                    {
                        if (
                            !keywordsToExcludeDirectories.Any(
                                kw => singleDirectory.IndexOf(kw, StringComparison.OrdinalIgnoreCase) >= 0))
                        {
                            allDirectories.Add(singleDirectory);
                        }
                    }
                }

                try
                {
                    if (!Directory.GetFiles(checksDirectory).Any(checksFile => checksFile.EndsWith(".dll") || checksFile.EndsWith(".exe") || checksFile.EndsWith(".cs")))
                    {
                        Console.WriteLine("Error: Checks directory does not contain a rules source or module: {0}", checksDirectory);
                        return;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: Failed to validate rules file(s) in {0}. Exception:{1}", checksDirectory, ex.ToString());
                    return;
                }

                // Iterate through each applicable directory
                foreach (string singleDirectory in allDirectories)
                {
                    Console.WriteLine("Scanning directory: {0}", singleDirectory);
                    List <FileInfo> directoryFiles = GetFilesByExtensions(new DirectoryInfo(singleDirectory));
                    foreach (FileInfo applicableFile in directoryFiles)
                    {
                        try
                        {
                            // Assume a local file path
                            string outputDirectory = Path.Combine(output, applicableFile.DirectoryName.Remove(0, 3));
                            if (!Directory.Exists(outputDirectory))
                            {
                                try
                                {
                                    Directory.CreateDirectory(outputDirectory);
                                }
                                catch (Exception ex)
                                {
                                    throw new IOException("Failed to create output directory", ex);
                                }
                            }

                            ResourceStaticAnalysisApplication resourceStaticAnalysisApplication = ResourceStaticAnalysisApplication.Instance;
                            List <Exception> exceptions = new List <Exception>();
                            resourceStaticAnalysisApplication.Initialize(new List <string>()
                            {
                                checksDirectory
                            });
                            string outputFile = Path.Combine(outputDirectory, applicableFile.Name + ".xml");
                            resourceStaticAnalysisApplication.ConfigureOutput(outputFile);
                            resourceStaticAnalysisApplication.Execute(applicableFile.FullName, true, out exceptions);
                            if (exceptions != null)
                            {
                                filesWithErrors++;
                                foreach (Exception ex in exceptions)
                                {
                                    reportedExceptions.Add(ex);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            reportedExceptions.Add(ex);
                            filesWithErrors++;
                        }

                        filesScanned++;
                    }

                    directoriesScanned++;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error bulk processing files", ex);
            }

            Console.WriteLine("Bulk operation complete...");
            Console.WriteLine("Direcotries Scanned:{0}", directoriesScanned);
            Console.WriteLine("Files scanned:{0}", filesScanned);
            Console.WriteLine("Files successfully scanned:{0}", filesScanned - filesWithErrors);
            Console.WriteLine("Files with errors:{0}", filesWithErrors);
            Console.WriteLine("Error details:");

            foreach (Exception re in reportedExceptions)
            {
                Console.WriteLine(re.ToString());
            }
        }
        public void RulesOutputUnitTest()
        {
            try
            {
                ResourceStaticAnalysisApplication ResourceStaticAnalysisApplication = ResourceStaticAnalysisApplication.Instance;
                List <Exception> exceptions;
                ResourceStaticAnalysisApplication.Initialize(new List <string>()
                {
                    TestContext.DeploymentDirectory
                });                                                                                                       // TestContext.DeploymentDirectory will pick UnitTests.dll
                // which contains the two rules defined here.
                // RuleThatAccessesAllLocResourceProperties and AdjectivePlusPlaceholder rules

                IEnumerable <OutputEntryForOneRule> engineResults = ResourceStaticAnalysisApplication.Execute("DefaultUt.resx", true, out exceptions);

                Assert.IsFalse(exceptions != null, "Engine reported some execution errors.");

                #region CommentsContext Rule UT
                var commentsContext = engineResults.Where(a => a.Rule.Name.Equals("CommentsContext"));

                Assert.IsTrue(commentsContext.Count() == 2,
                              "CommentsContext Rule did not return right number of issues");

                Assert.IsTrue(commentsContext.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "CommentsContext Rule returned false");
                Assert.IsFalse(commentsContext.ElementAt(0).OutputItems.ElementAt(1).Result,
                               "CommentsContext Rule returned true");
                Assert.IsTrue(commentsContext.ElementAt(0).CO.Properties[1].GetValue().Equals("String2"),
                              "CommentsContext Rule flagged an issue on a wrong resource");

                Assert.IsFalse(commentsContext.ElementAt(1).OutputItems.ElementAt(0).Result,
                               "CommentsContext Rule returned true");
                Assert.IsTrue(commentsContext.ElementAt(1).OutputItems.ElementAt(1).Result,
                              "CommentsContext Rule returned false");
                Assert.IsTrue(commentsContext.ElementAt(1).CO.Properties[1].GetValue().Equals("String3"),
                              "CommentsContext Rule flagged an issue on a wrong resource");
                #endregion

                #region DuplicatedResourceId Rule UT
                var duplicatedResourceId = engineResults.Where(a => a.Rule.Name.Equals("DuplicatedResourceId"));

                Assert.IsTrue(duplicatedResourceId.Count() == 2,
                              "DuplicatedResourceId Rule did not return right number of issues");

                Assert.IsTrue(duplicatedResourceId.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "DuplicatedResourceId Rule returned false");
                Assert.IsTrue(duplicatedResourceId.ElementAt(0).CO.Properties[1].GetValue().Equals("String4_WRReviewer_Duplicate_ResourceId1"),
                              "DuplicatedResourceId Rule flagged an issue on a wrong resource");

                Assert.IsTrue(duplicatedResourceId.ElementAt(1).OutputItems.ElementAt(0).Result,
                              "DuplicatedResourceId Rule returned false");
                Assert.IsTrue(duplicatedResourceId.ElementAt(1).CO.Properties[1].GetValue().Equals("String4_WRReviewer_Duplicate_ResourceId2"),
                              "DuplicatedResourceId Rule flagged an issue on a wrong resource");
                #endregion

                #region DuplicatedSourceString Rule UT
                var duplicatedSourceString = engineResults.Where(a => a.Rule.Name.Equals("DuplicatedSourceString"));

                Assert.IsTrue(duplicatedSourceString.Count() == 2,
                              "DuplicatedSourceString Rule did not return right number of issues");

                Assert.IsTrue(duplicatedSourceString.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "DuplicatedSourceString Rule returned false");
                Assert.IsTrue(duplicatedSourceString.ElementAt(0).CO.Properties[1].GetValue().Equals("String7_WRReviewer_Duplicate_SourceString1"),
                              "DuplicatedSourceString Rule flagged an issue on a wrong resource");

                Assert.IsTrue(duplicatedSourceString.ElementAt(1).OutputItems.ElementAt(0).Result,
                              "DuplicatedSourceString Rule returned false");
                Assert.IsTrue(duplicatedSourceString.ElementAt(1).CO.Properties[1].GetValue().Equals("String14_WRReviewer_Duplicate_SourceString1"),
                              "DuplicatedSourceString Rule flagged an issue on a wrong resource");
                #endregion

                #region EmptySourceString Rule UT
                var emptySourceString = engineResults.Where(a => a.Rule.Name.Equals("EmptySourceString"));

                Assert.IsTrue(emptySourceString.Count() == 1,
                              "EmptySourceString Rule did not return right number of issues");

                Assert.IsTrue(emptySourceString.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "EmptySourceString Rule returned false");
                Assert.IsTrue(emptySourceString.ElementAt(0).CO.Properties[1].GetValue().Equals("String8"),
                              "EmptySourceString Rule flagged an issue on a wrong resource");
                #endregion

                #region EnUsCulture Rule UT
                var enUsCulture = engineResults.Where(a => a.Rule.Name.Equals("EnUsCulture"));

                Assert.IsTrue(enUsCulture.Count() == 1,
                              "EnUsCulture Rule did not return right number of issues");

                Assert.IsTrue(enUsCulture.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "EnUsCulture Rule returned false");
                Assert.IsTrue(enUsCulture.ElementAt(0).CO.Properties[1].GetValue().Equals("String9"),
                              "EnUsCulture Rule flagged an issue on a wrong resource");
                #endregion

                #region LongSourceString Rule UT
                var longSourceString = engineResults.Where(a => a.Rule.Name.Equals("LongSourceString"));

                Assert.IsTrue(longSourceString.Count() == 1,
                              "LongSourceString Rule did not return right number of issues");

                Assert.IsTrue(longSourceString.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "LongSourceString Rule returned false");
                Assert.IsTrue(longSourceString.ElementAt(0).CO.Properties[1].GetValue().Equals("String10"),
                              "LongSourceString Rule flagged an issue on a wrong resource");
                #endregion

                #region Placeholder Rule UT
                var placeHolderResults = engineResults.Where(a => a.Rule.Name.Equals("PlaceholderInsufficientContext"));

                Assert.IsTrue(placeHolderResults.Count() == 1,
                              "PlaceholderInsufficientContext Rule did not return right number of issues");

                Assert.IsTrue(placeHolderResults.ElementAt(0).Result,
                              "PlaceholderInsufficientContext Rule returned false");

                Assert.IsTrue(placeHolderResults.ElementAt(0).CO.Properties[1].GetValue().Equals("String1"),
                              "PlaceholderInsufficientContext Rule flagged an issue on a wrong resource");
                #endregion

                #region SpecialCharacters Rule UT
                var specialCharacters = engineResults.Where(a => a.Rule.Name.Equals("SpecialCharacters"));

                Assert.IsTrue(specialCharacters.Count() == 2,
                              "SpecialCharacters Rule did not return right number of issues");

                Assert.IsTrue(specialCharacters.ElementAt(0).OutputItems.ElementAt(0).Result,
                              "SpecialCharacters Rule returned false");
                Assert.IsTrue(specialCharacters.ElementAt(0).CO.Properties[1].GetValue().Equals("String11"),
                              "SpecialCharacters Rule flagged an issue on a wrong resource");

                Assert.IsTrue(specialCharacters.ElementAt(1).OutputItems.ElementAt(0).Result,
                              "SpecialCharacters Rule returned false");
                Assert.IsTrue(specialCharacters.ElementAt(1).CO.Properties[1].GetValue().Equals("String12"),
                              "SpecialCharacters Rule flagged an issue on a wrong resource");
                #endregion
            }
            catch (OperationCanceledException ex)
            {
                Assert.Fail("ResourceStaticAnalysis engine failed because {0}", ex.Message);
            }
            catch (ResourceStaticAnalysisEngineInitializationException ex)//Thrown when there are no rules to run on the input set.
            {
                Assert.Fail("ResourceStaticAnalysis engine failed because {0}", ex.Message);
            }
        }