Пример #1
0
        public ITestRunner Create(StrykerOptions options, OptimizationFlags flags, ProjectInfo projectInfo)
        {
            _logger.LogDebug("Factory is creating testrunner for asked type {0}", options.TestRunner);
            ITestRunner testRunner;

            switch (options.TestRunner)
            {
            case TestRunner.DotnetTest:
            default:
                testRunner = new DotnetTestRunner(projectInfo.TestProjectAnalyzerResult.ProjectFilePath, new ProcessExecutor(), flags);
                break;

            case TestRunner.VsTest:
                testRunner = new VsTestRunnerPool(options, flags, projectInfo);
                break;
            }
            _logger.LogInformation("Using testrunner {0}", options.TestRunner.ToString());
            return(testRunner);
        }
Пример #2
0
        public void MutantFilterFactory_Creates_Standard_Mutant_Filters()
        {
            // Arrange
            var options = new StrykerOptions()
            {
                Since = false
            };
            var diffProviderMock   = new Mock <IDiffProvider>(MockBehavior.Loose);
            var branchProviderMock = new Mock <IGitInfoProvider>(MockBehavior.Loose);
            var baselineProvider   = new Mock <IBaselineProvider>(MockBehavior.Loose);

            // Act
            var result = MutantFilterFactory.Create(options, null, diffProviderMock.Object, baselineProvider.Object, branchProviderMock.Object);

            // Assert
            var resultAsBroadcastFilter = result as BroadcastMutantFilter;

            resultAsBroadcastFilter.MutantFilters.Count().ShouldBe(4);
        }
Пример #3
0
        public void ShouldNotMutateIfMutationLevelIsLow()
        {
            var originalNode = SyntaxFactory.BinaryExpression(SyntaxKind.AddExpression,
                                                              SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(1)),
                                                              SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(8)));

            // The mutator is of level Expert
            var target = new ExampleMutator(MutationLevel.Complete);

            // The options level is Beginner
            var options = new StrykerOptions
            {
                MutationLevel = MutationLevel.Standard
            };

            target.Mutate(originalNode, options);

            // ApplyMutations should not have been called
        }
        public void StrykerCLI_ExcludedMutationsNamesShouldMapToMutatorTypes(Mutator expectedType, params string[] argValues)
        {
            var mock       = new Mock <IStrykerRunner>(MockBehavior.Strict);
            var options    = new StrykerOptions();
            var runResults = new StrykerRunResult(options, 0.3);

            mock.Setup(x => x.RunMutationTest(It.IsAny <StrykerOptions>(), It.IsAny <IEnumerable <LogMessage> >())).Returns(runResults);

            var target = new StrykerCLI(mock.Object);

            argValues.Count().ShouldBeGreaterThan(0);

            foreach (var argValue in argValues)
            {
                target.Run(new string[] { "-em", $"['{argValue}']" });

                mock.Verify(x => x.RunMutationTest(It.Is <StrykerOptions>(o => o.ExcludedMutations.Single() == expectedType), It.IsAny <IEnumerable <LogMessage> >()));
            }
        }
        public void StrykerCLI_WithLogConsoleArgument_ShouldPassLogConsoleArgumentsToStryker(string argName)
        {
            StrykerOptions actualOptions = null;
            var            runResults    = new StrykerRunResult(new StrykerOptions(), 0.3);
            var            mock          = new Mock <IStrykerRunner>(MockBehavior.Strict);

            mock.Setup(x => x.RunMutationTest(It.IsAny <StrykerOptions>(), It.IsAny <IEnumerable <LogMessage> >()))
            .Callback <StrykerOptions, IEnumerable <LogMessage> >((c, m) => actualOptions = c)
            .Returns(runResults)
            .Verifiable();

            var target = new StrykerCLI(mock.Object);

            target.Run(new[] { argName, "debug" });

            mock.VerifyAll();
            actualOptions.LogOptions.LogLevel.ShouldBe(LogEventLevel.Debug);
            actualOptions.LogOptions.LogToFile.ShouldBeFalse();
        }
        public async Task ShouldLoadReportFromDiskAsync()
        {
            // Arrange
            var fileSystemMock = new MockFileSystem();
            var options        = new StrykerOptions(basePath: @"C:/Users/JohnDoe/Project/TestFolder", fileSystem: fileSystemMock);

            var report = JsonReport.Build(options, JsonReportTestHelper.CreateProjectWith().ToReadOnlyInputComponent());

            fileSystemMock.AddFile("C:/Users/JohnDoe/Project/TestFolder/StrykerOutput/Baselines/version/stryker-report.json", report.ToJson());

            var target = new DiskBaselineProvider(options, fileSystemMock);

            // Act
            var result = await target.Load("version");

            // Assert
            result.ShouldNotBeNull();
            result.ToJson().ShouldBe(report.ToJson());
        }
Пример #7
0
        public MutationProcess(MutationTestInput mutationTestInput,
                               IMutantOrchestrator orchestrator = null,
                               IFileSystem fileSystem           = null,
                               StrykerOptions options           = null,

                               IMutantFilter mutantFilter = null,
                               IReporter reporter         = null)
        {
            _input            = mutationTestInput;
            _projectInfo      = (ProjectComponent <SyntaxTree>)mutationTestInput.ProjectInfo.ProjectContents;
            _options          = options;
            _orchestrator     = orchestrator ?? new MutantOrchestrator(options: _options);
            _compilingProcess = new CompilingProcess(mutationTestInput, new RollbackProcess());
            _fileSystem       = fileSystem ?? new FileSystem();
            _logger           = ApplicationLogging.LoggerFactory.CreateLogger <MutationTestProcess>();

            _mutantFilter = mutantFilter ?? MutantFilterFactory.Create(options);
            _reporter     = reporter;
        }
        /// <summary>
        /// Finds the referencedProjects and looks for all files that should be mutated in those projects
        /// </summary>
        public ProjectInfo ResolveInput(StrykerOptions options)
        {
            var projectInfo = new ProjectInfo(_fileSystem);
            // Determine test projects
            var testProjectFiles = new List <string>();

            if (options.TestProjects != null && options.TestProjects.Any())
            {
                testProjectFiles = options.TestProjects.Select(FindTestProject).ToList();
            }
            else
            {
                testProjectFiles.Add(FindTestProject(options.BasePath));
            }

            var testProjectAnalyzerResults = new List <IAnalyzerResult>();

            foreach (var testProjectFile in testProjectFiles)
            {
                // Analyze the test project
                testProjectAnalyzerResults.Add(_projectFileReader.AnalyzeProject(testProjectFile, options.SolutionPath, options.TargetFramework));
            }
            projectInfo.TestProjectAnalyzerResults = testProjectAnalyzerResults;

            // Determine project under test
            var projectUnderTest = FindProjectUnderTest(projectInfo.TestProjectAnalyzerResults, options.ProjectUnderTestName);

            _logger.LogInformation("The project {0} will be mutated.", projectUnderTest);

            // Analyze project under test
            projectInfo.ProjectUnderTestAnalyzerResult = _projectFileReader.AnalyzeProject(projectUnderTest, options.SolutionPath, options.TargetFramework);

            //to test Fsharp support you would need to create a FsharpProjectComponentsBuilder
            var inputFiles = new CsharpProjectComponentsBuilder(projectInfo, options, _foldersToExclude, _logger, _fileSystem).Build();

            projectInfo.ProjectContents = inputFiles;

            ValidateTestProjectsCanBeExecuted(projectInfo);
            _logger.LogInformation("Analysis complete.");

            return(projectInfo);
        }
        public void ReturnsTip_When_Friendly_Name_Is_GitSource()
        {
            // Arrange
            var options        = new StrykerOptions(gitSource: "master");
            var repositoryMock = new Mock <IRepository>(MockBehavior.Strict);

            var branchCollectionMock = new Mock <BranchCollection>(MockBehavior.Strict);
            var branchMock           = new Mock <Branch>();
            var commitMock           = new Mock <Commit>();

            branchMock
            .SetupGet(x => x.FriendlyName)
            .Returns("master");

            branchMock
            .SetupGet(x => x.CanonicalName)
            .Returns("origin/master");

            branchMock.SetupGet(x => x.Tip).Returns(commitMock.Object);

            branchCollectionMock
            .Setup(x => x.GetEnumerator())
            .Returns(((IEnumerable <Branch>) new List <Branch>
            {
                branchMock.Object
            }).GetEnumerator());

            repositoryMock
            .SetupGet(x => x.Branches)
            .Returns(branchCollectionMock.Object);

            var target = new GitInfoProvider(options, repositoryMock.Object);

            // Act
            var res = target.DetermineCommit();

            // Assert
            res.ShouldNotBeNull();
            res.ShouldBe(commitMock.Object);

            repositoryMock.Verify();
        }
Пример #10
0
        public void ReturnsCurrentBranch()
        {
            // Arrange
            var options        = new StrykerOptions();
            var repositoryMock = new Mock <IRepository>(MockBehavior.Strict);

            var branchCollectionMock = new Mock <BranchCollection>(MockBehavior.Strict);
            var branchMock           = new Mock <Branch>();

            branchCollectionMock
            .Setup(x => x.Add(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(new Mock <Branch>(MockBehavior.Loose).Object);

            branchMock
            .SetupGet(x => x.IsCurrentRepositoryHead)
            .Returns(true);

            branchMock
            .SetupGet(x => x.FriendlyName)
            .Returns("master");

            branchCollectionMock
            .Setup(x => x.GetEnumerator())
            .Returns(((IEnumerable <Branch>) new List <Branch>
            {
                branchMock.Object
            }).GetEnumerator());

            repositoryMock
            .SetupGet(x => x.Branches)
            .Returns(branchCollectionMock.Object);

            var target = new GitInfoProvider(options, repositoryMock.Object);

            // Act
            var res = target.GetCurrentBranchName();

            // Assert
            res.ShouldBe("master");

            repositoryMock.Verify();
        }
Пример #11
0
        public void Stryker_ShouldInvokeAllProcesses()
        {
            string basePath = @"c:\TestProject\";

            var initialisationMock      = new Mock <IInitialisationProcess>(MockBehavior.Strict);
            var mutationTestProcessMock = new Mock <IMutationTestProcess>(MockBehavior.Strict);

            initialisationMock.Setup(x => x.Initialize(It.IsAny <StrykerOptions>())).Returns(new MutationTestInput()
            {
                ProjectInfo = new ProjectInfo()
                {
                    TestProjectPath = basePath,
                    ProjectContents = new FolderComposite()
                    {
                        Name     = "ProjectRoot",
                        Children = new Collection <ProjectComponent>()
                        {
                            new FileLeaf()
                            {
                                Name = "SomeFile.cs"
                            }
                        }
                    },
                    ProjectUnderTestAssemblyName = "ExampleProject.dll",
                    ProjectUnderTestPath         = @"c:\ExampleProject\",
                    TargetFramework = "netcoreapp2.0"
                },
            });
            var options = new StrykerOptions();

            mutationTestProcessMock.Setup(x => x.Mutate(options));
            mutationTestProcessMock.Setup(x => x.Test(It.IsAny <StrykerOptions>()))
            .Returns(new StrykerRunResult(It.IsAny <StrykerOptions>(), It.IsAny <decimal?>()));

            var target = new StrykerRunner(initialisationMock.Object, mutationTestProcessMock.Object);

            target.RunMutationTest(options);

            initialisationMock.Verify(x => x.Initialize(It.IsAny <StrykerOptions>()), Times.Once);
            mutationTestProcessMock.Verify(x => x.Mutate(options), Times.Once);
            mutationTestProcessMock.Verify(x => x.Test(It.IsAny <StrykerOptions>()), Times.Once);
        }
Пример #12
0
        public void ShouldNotFilterMutantsWhereCoveringTestsContainsChangedTestFile()
        {
            // Arrange
            string testProjectPath = "C:/MyTests";
            var    options         = new StrykerOptions();

            var diffProvider = new Mock <IDiffProvider>(MockBehavior.Loose);

            // If a file inside the test project is changed, a test has been changed
            string myTest = Path.Combine(testProjectPath, "myTest.cs");;

            diffProvider.Setup(x => x.ScanDiff()).Returns(new DiffResult()
            {
                ChangedSourceFiles = new Collection <string>()
                {
                    myTest
                },
                ChangedTestFiles = new Collection <string>()
                {
                    myTest
                }
            });
            var target = new DiffMutantFilter(diffProvider.Object);

            // check the diff result for a file not inside the test project
            var file = new CsharpFileLeaf {
                FullPath = Path.Combine("C:/NotMyTests", "myfile.cs")
            };

            var mutant = new Mutant();

            mutant.CoveringTests.Add(new TestDescription(Guid.NewGuid().ToString(), "name", myTest));

            // Act
            var filterResult = target.FilterMutants(new List <Mutant>()
            {
                mutant
            }, file.ToReadOnly(), options);

            // Assert
            filterResult.ShouldContain(mutant);
        }
        public void RunTestsSimultaneouslyWhenPossible()
        {
            var options      = new StrykerOptions();
            var mutantFilter = new Mock <IMutantFilter>(MockBehavior.Loose);

            using (var endProcess = new EventWaitHandle(false, EventResetMode.ManualReset))
            {
                var strykerOptions = new StrykerOptions(fileSystem: _fileSystem, abortTestOnFail: false);
                var mockVsTest     = BuildVsTestRunner(strykerOptions, endProcess, out var runner, strykerOptions.Optimizations);
                // make sure we have 4 mutants
                _projectContents.Add(new FileLeaf {
                    Mutants = new[] { new Mutant {
                                          Id = 2
                                      }, new Mutant {
                                          Id = 3
                                      } }
                });
                _testCases.Add(new TestCase("T2", _executorUri, _testAssemblyPath));
                _testCases.Add(new TestCase("T3", _executorUri, _testAssemblyPath));

                var input = new MutationTestInput {
                    ProjectInfo = _targetProject, TestRunner = runner, TimeoutMs = 100
                };
                foreach (var mutant in _targetProject.ProjectContents.Mutants)
                {
                    mutant.CoveringTests = new TestListDescription(null);
                }
                var mockReporter = new Mock <IReporter>();
                var tester       = new MutationTestProcess(input, mockReporter.Object, new MutationTestExecutor(input.TestRunner), fileSystem: _fileSystem, options: strykerOptions, mutantFilter: mutantFilter.Object);
                SetupMockCoverageRun(mockVsTest, new Dictionary <string, string> {
                    ["T0"] = "0;", ["T1"] = "1;"
                }, endProcess);
                tester.GetCoverage();
                SetupMockPartialTestRun(mockVsTest, new Dictionary <string, string> {
                    ["1,0"] = "T0=S,T1=F"
                }, endProcess);
                tester.Test(_projectContents.Mutants.Where(x => x.ResultStatus == MutantStatus.NotRun));

                _mutant.ResultStatus.ShouldBe(MutantStatus.Survived);
                _otherMutant.ResultStatus.ShouldBe(MutantStatus.Killed);
            }
        }
Пример #14
0
        public void Doesnt_Use_ProjectVersion_When_CurrentBranch_Is_Not_Null()
        {
            var gitInfoProvider  = new Mock <IGitInfoProvider>();
            var baselineProvider = new Mock <IBaselineProvider>();

            var readOnlyInputComponent = new Mock <IReadOnlyProjectComponent>(MockBehavior.Loose);

            readOnlyInputComponent.Setup(s => s.FullPath).Returns("/home/usr/dev/project");

            var options = new StrykerOptions(projectVersion: "new-feature", gitDiffTarget: "master", compareToDashboard: true);

            gitInfoProvider.Setup(x => x.GetCurrentBranchName()).Returns("new-feature");

            var target = new GitBaselineReporter(options, baselineProvider.Object, gitInfoProvider.Object);

            target.OnAllMutantsTested(readOnlyInputComponent.Object);

            baselineProvider.Verify(x => x.Save(It.IsAny <JsonReport>(), It.Is <string>(x => x == "dashboard-compare/new-feature")), Times.Once);
            baselineProvider.Verify(x => x.Save(It.IsAny <JsonReport>(), It.Is <string>(x => x == "new-feature")), Times.Never);
        }
Пример #15
0
        public void ShouldOverwriteDefaultDashboardUrlWhenPassed(string argName)
        {
            StrykerOptions options    = null;
            var            runResults = new StrykerRunResult(new StrykerOptions(), 0.3);

            var mock = new Mock <IStrykerRunner>(MockBehavior.Strict);

            mock.Setup(x => x.RunMutationTest(It.IsAny <StrykerOptions>(), It.IsAny <IEnumerable <LogMessage> >()))
            .Callback <StrykerOptions, IEnumerable <LogMessage> >((c, m) => options = c)
            .Returns(runResults)
            .Verifiable();

            var target = new StrykerCLI(mock.Object);

            target.Run(new string[] { argName, "--reporters", "['dashboard']", "--dashboard-project", "test", "--dashboard-api-key", "test" });

            mock.VerifyAll();

            options.DashboardUrl.ShouldBe("https://www.example.com/");
        }
Пример #16
0
        public void MutantFilterFactory_Creates_DashboardMutantFilter_And_DiffMutantFilter_WithBaseline_Enabled()
        {
            var options = new StrykerOptions()
            {
                WithBaseline   = true,
                ProjectVersion = "foo"
            };

            var diffProviderMock     = new Mock <IDiffProvider>(MockBehavior.Loose);
            var gitInfoProviderMock  = new Mock <IGitInfoProvider>(MockBehavior.Loose);
            var baselineProviderMock = new Mock <IBaselineProvider>(MockBehavior.Loose);

            var result = MutantFilterFactory.Create(options, null, diffProviderMock.Object, baselineProviderMock.Object, gitInfoProviderMock.Object);

            var resultAsBroadcastFilter = result as BroadcastMutantFilter;

            resultAsBroadcastFilter.MutantFilters.Count().ShouldBe(6);
            resultAsBroadcastFilter.MutantFilters.Where(x => x.GetType() == typeof(BaselineMutantFilter)).Count().ShouldBe(1);
            resultAsBroadcastFilter.MutantFilters.Where(x => x.GetType() == typeof(SinceMutantFilter)).Count().ShouldBe(1);
        }
Пример #17
0
        public void ShouldEnableDiffFeatureWhenDashboardComparePassed(params string[] argNames)
        {
            StrykerOptions options    = null;
            var            runResults = new StrykerRunResult(new StrykerOptions(), 0.3);

            var mock = new Mock <IStrykerRunner>(MockBehavior.Strict);

            mock.Setup(x => x.RunMutationTest(It.IsAny <StrykerOptions>(), It.IsAny <IEnumerable <LogMessage> >()))
            .Callback <StrykerOptions, IEnumerable <LogMessage> >((c, m) => options = c)
            .Returns(runResults)
            .Verifiable();

            var target = new StrykerCLI(mock.Object);

            target.Run(argNames);

            mock.VerifyAll();

            options.DiffEnabled.ShouldBeTrue();
        }
        public async Task ShouldWriteToDiskAsync()
        {
            // Arrange
            var fileSystemMock = new MockFileSystem();
            var options        = new StrykerOptions()
            {
                BasePath = @"C:/Users/JohnDoe/Project/TestFolder"
            };
            var sut = new DiskBaselineProvider(options, fileSystemMock);

            // Act
            await sut.Save(JsonReport.Build(options, JsonReportTestHelper.CreateProjectWith()), "baseline/version");

            // Assert
            var path = FilePathUtils.NormalizePathSeparators(@"C:/Users/JohnDoe/Project/TestFolder/StrykerOutput/baseline/version/stryker-report.json");

            MockFileData file = fileSystemMock.GetFile(path);

            file.ShouldNotBeNull();
        }
Пример #19
0
        private void HandleStrykerRunResult(StrykerOptions options, StrykerRunResult result)
        {
            var logger = ApplicationLogging.LoggerFactory.CreateLogger <StrykerCLI>();

            logger.LogInformation("The final mutation score is {MutationScore:P2}", result.MutationScore);
            if (result.ScoreIsLowerThanThresholdBreak())
            {
                var thresholdBreak = (double)options.Thresholds.Break / 100;
                logger.LogWarning("Final mutation score is below threshold break. Crashing...");

                new Chalk().Red(string.Format(@"
 The mutation score is lower than the configured break threshold of {0:P0}.
 If you're running in a CI environment, this means your pipeline will now fail.", thresholdBreak));

                Console.WriteLine(Environment.NewLine);
                new Chalk().Green(" Looks like you've got some work to do :)");

                ExitCode = 1;
            }
        }
Пример #20
0
        public void ShouldKeepDefaultDashboardUrlWhenArgumentNotProvided()
        {
            StrykerOptions options    = null;
            var            runResults = new StrykerRunResult(new StrykerOptions(), 0.3);

            var mock = new Mock <IStrykerRunner>(MockBehavior.Strict);

            mock.Setup(x => x.RunMutationTest(It.IsAny <StrykerOptions>(), It.IsAny <IEnumerable <LogMessage> >()))
            .Callback <StrykerOptions, IEnumerable <LogMessage> >((c, m) => options = c)
            .Returns(runResults)
            .Verifiable();

            var target = new StrykerCLI(mock.Object);

            target.Run(new string[] { "--reporters", "['dashboard']", "--dashboard-project", "test", "--dashboard-api-key", "test" });

            mock.VerifyAll();

            options.DashboardUrl.ShouldBe("https://dashboard.stryker-mutator.io");
        }
Пример #21
0
        public void StrykerCLI_WithDevModeArgument_ShouldPassDevModeArgumentsToStryker(string argName)
        {
            StrykerOptions actualOptions = null;
            var            runResults    = new StrykerRunResult(new StrykerOptions(), 0.3M);

            var mock = new Mock <IStrykerRunner>(MockBehavior.Strict);

            mock.Setup(x => x.RunMutationTest(It.IsAny <StrykerOptions>()))
            .Callback <StrykerOptions>((c) => actualOptions = c)
            .Returns(runResults)
            .Verifiable();

            var target = new StrykerCLI(mock.Object);

            target.Run(new string[] { argName });

            mock.VerifyAll();

            actualOptions.DevMode.ShouldBeTrue();
        }
Пример #22
0
        public void ScoreIsLowerThanThresholdBreak_ShouldReturnTrueWhen(double mutationScore, int thresholdBreak)
        {
            // Arrange
            var options = new StrykerOptions()
            {
                Thresholds = new Thresholds
                {
                    High  = 100,
                    Low   = 100,
                    Break = thresholdBreak
                }
            };
            var runResult = new StrykerRunResult(options, mutationScore);

            // Act
            var scoreIsLowerThanThresholdBreak = runResult.ScoreIsLowerThanThresholdBreak();

            // Assert
            scoreIsLowerThanThresholdBreak.ShouldBeTrue("because the mutation score is lower than the threshold break");
        }
Пример #23
0
        /// <summary>
        /// Starts a mutation test run
        /// </summary>
        /// <exception cref="StrykerInputException">For managed exceptions</exception>
        /// <param name="options">The user options</param>
        public StrykerRunResult RunMutationTest(StrykerOptions options)
        {
            // start stopwatch
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            // setup logging
            ApplicationLogging.ConfigureLogger(options.LogOptions);
            var logger = ApplicationLogging.LoggerFactory.CreateLogger <StrykerRunner>();

            try
            {
                // initialize
                _reporter = ReporterFactory.Create(options);
                _initialisationProcess = _initialisationProcess ?? new InitialisationProcess();
                _input = _initialisationProcess.Initialize(options);

                _mutationTestProcess = _mutationTestProcess ?? new MutationTestProcess(
                    mutationTestInput: _input,
                    excludedMutations: options.ExcludedMutations,
                    reporter: _reporter,
                    mutationTestExecutor: new MutationTestExecutor(_input.TestRunner, _input.TimeoutMS));

                // mutate
                _mutationTestProcess.Mutate(options);

                // test mutations and return results
                return(_mutationTestProcess.Test(options));
            }
            catch (Exception ex) when(!(ex is StrykerInputException))
            {
                logger.LogError(ex, "An error occurred during the mutation test run ");
                throw;
            }
            finally {
                // log duration
                stopwatch.Stop();
                logger.LogInformation("Time Elapsed {0}", stopwatch.Elapsed);
            }
        }
Пример #24
0
        public void ScanDiff_Throws_Stryker_Input_Exception_When_Commit_null()
        {
            var options = new StrykerOptions()
            {
                SinceTarget = "branch"
            };
            var repositoryMock       = new Mock <IRepository>();
            var branchCollectionMock = new Mock <BranchCollection>();
            var branchMock           = new Mock <Branch>();

            var commitMock = new Mock <Commit>();

            branchCollectionMock
            .Setup(x => x.Add(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(new Mock <Branch>(MockBehavior.Loose).Object);

            branchMock
            .SetupGet(x => x.IsCurrentRepositoryHead)
            .Returns(true);

            branchMock
            .SetupGet(x => x.FriendlyName)
            .Returns("master");

            branchCollectionMock
            .Setup(x => x.GetEnumerator())
            .Returns(((IEnumerable <Branch>) new List <Branch>
            {
                branchMock.Object
            }).GetEnumerator());

            repositoryMock.SetupGet(x => x.Branches).Returns(branchCollectionMock.Object);

            var gitInfoMock = new Mock <IGitInfoProvider>();

            gitInfoMock.Setup(x => x.DetermineCommit()).Returns((Commit)null);
            gitInfoMock.SetupGet(x => x.Repository).Returns(repositoryMock.Object);
            var target = new GitDiffProvider(options, null, gitInfoMock.Object);

            Should.Throw <InputException>(() => target.ScanDiff());
        }
Пример #25
0
        /// <summary>
        /// Finds the referencedProjects and looks for all files that should be mutated in those projects
        /// </summary>
        public ProjectInfo ResolveInput(StrykerOptions options)
        {
            var result = new ProjectInfo();

            var testProjectFile = FindProjectFile(options.BasePath, options.TestProjectNameFilter);

            // Analyze the test project
            result.TestProjectAnalyzerResult = _projectFileReader.AnalyzeProject(testProjectFile, options.SolutionPath);

            // Determine project under test
            var reader           = new ProjectFileReader();
            var projectUnderTest = reader.DetermineProjectUnderTest(result.TestProjectAnalyzerResult.ProjectReferences, options.ProjectUnderTestNameFilter);

            _logger.LogInformation("The project {0} will be mutated", projectUnderTest);

            // Analyze project under test
            result.ProjectUnderTestAnalyzerResult = _projectFileReader.AnalyzeProject(projectUnderTest, options.SolutionPath);

            var inputFiles = new FolderComposite();

            result.FullFramework = !result.TestProjectAnalyzerResult.TargetFramework.Contains("netcoreapp", StringComparison.InvariantCultureIgnoreCase);
            var projectUnderTestDir = Path.GetDirectoryName(result.ProjectUnderTestAnalyzerResult.ProjectFilePath);

            foreach (var dir in ExtractProjectFolders(result.ProjectUnderTestAnalyzerResult, result.FullFramework))
            {
                var folder = _fileSystem.Path.Combine(Path.GetDirectoryName(projectUnderTestDir), dir);

                _logger.LogDebug($"Scanning {folder}");
                if (!_fileSystem.Directory.Exists(folder))
                {
                    throw new DirectoryNotFoundException($"Can't find {folder}");
                }
                inputFiles.Add(FindInputFiles(folder, options.FilesToExclude.ToList()));
            }
            MarkInputFilesAsExcluded(inputFiles, options.FilesToExclude.ToList(), projectUnderTestDir);
            result.ProjectContents = inputFiles;

            ValidateResult(result, options);

            return(result);
        }
Пример #26
0
        /// <param name="mutators">The mutators that should be active during the mutation process</param>
        public MutantOrchestrator(IEnumerable <IMutator> mutators = null, StrykerOptions options = null)
        {
            _options = options;
            Mutators = mutators ?? new List <IMutator>
            {
                // the default list of mutators
                new BinaryExpressionMutator(),
                new BooleanMutator(),
                new AssignmentExpressionMutator(),
                new PrefixUnaryMutator(),
                new PostfixUnaryMutator(),
                new CheckedMutator(),
                new LinqMutator(),
                new StringMutator(),
                new StringEmptyMutator(),
                new InterpolatedStringMutator(),
                new NegateConditionMutator(),
                new InitializerMutator(),
                new ObjectCreationMutator(),
                new ArrayCreationMutator(),
                new RegexMutator()
            };
            Mutants = new Collection <Mutant>();
            Logger  = ApplicationLogging.LoggerFactory.CreateLogger <MutantOrchestrator>();

            _specificOrchestrator.RegisterHandlers(new List <INodeMutator>
            {
                new ForStatementOrchestrator(this),
                new AssignmentStatementOrchestrator(this),
                new PostfixUnaryExpressionOrchestrator(this),
                new StaticFieldDeclarationOrchestrator(this),
                new StaticConstructorOrchestrator(this),
                new ArrayInitializerOrchestrator(this),
                new BaseMethodDeclarationOrchestrator <BaseMethodDeclarationSyntax>(this),
                new ConstLocalDeclarationOrchestrator(this),
                new StatementSpecificOrchestrator <StatementSyntax>(this),
                new BlockOrchestrator(this),
                new ExpressionSpecificOrchestrator <ExpressionSyntax>(this),
                new SyntaxNodeOrchestrator(this)
            });
        }
        public async Task DashboardClient_Logs_And_Returns_Null_On_Publish_Report_Does_Not_Return_200()
        {
            // Arrange
            var loggerMock  = new Mock <ILogger <DashboardClient> >(MockBehavior.Loose);
            var handlerMock = new Mock <HttpMessageHandler>(MockBehavior.Strict);

            handlerMock
            .Protected()
            .Setup <Task <HttpResponseMessage> >(
                "SendAsync",
                ItExpr.IsAny <HttpRequestMessage>(),
                ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(new HttpResponseMessage()
            {
                StatusCode = System.Net.HttpStatusCode.BadRequest,
                Content    = new StringContent("Error message", Encoding.UTF8, "text/html")
            })
            .Verifiable();

            var httpClient = new HttpClient(handlerMock.Object);
            var options    = new StrykerOptions
            {
                DashboardUrl    = "http://www.example.com/",
                DashboardApiKey = "Access_Token"
            };

            var target = new DashboardClient(options, httpClient, loggerMock.Object);

            // Act
            var result = await target.PublishReport(new MockJsonReport(null, null), "version");

            loggerMock.Verify(
                x => x.Log(
                    It.Is <LogLevel>(logLevel => logLevel == LogLevel.Error),
                    It.IsAny <EventId>(),
                    It.Is <It.IsAnyType>((v, t) => true),
                    It.IsAny <Exception>(),
                    It.Is <Func <It.IsAnyType, Exception, string> >((v, t) => true)));

            result.ShouldBeNull();
        }
Пример #28
0
        public void ShouldValidateApiKey()
        {
            const string strykerDashboardApiKey = "STRYKER_DASHBOARD_API_KEY";
            var key = Environment.GetEnvironmentVariable(strykerDashboardApiKey);
            try
            {
                var options = new StrykerOptions();
                Environment.SetEnvironmentVariable(strykerDashboardApiKey, string.Empty);

                var ex = Assert.Throws<StrykerInputException>(() =>
                {
                    new StrykerOptions(reporters: new string[] { "Dashboard" });
                });
                ex.Message.ShouldContain($"An API key is required when the {Reporter.Dashboard} reporter is turned on! You can get an API key at {options.DashboardUrl}");
                ex.Message.ShouldContain($"A project name is required when the {Reporter.Dashboard} reporter is turned on!");
            }
            finally
            {
                Environment.SetEnvironmentVariable(strykerDashboardApiKey, key);
            }
        }
Пример #29
0
        public void ShouldValidateOptimisationMode()
        {
            var options = new StrykerOptions(coverageAnalysis: "perTestInIsolation");
            options.Optimizations.HasFlag(OptimizationFlags.CoverageBasedTest).ShouldBeTrue();
            options.Optimizations.HasFlag(OptimizationFlags.CaptureCoveragePerTest).ShouldBeTrue();

            options = new StrykerOptions();
            options.Optimizations.HasFlag(OptimizationFlags.CoverageBasedTest).ShouldBeTrue();

            options = new StrykerOptions(coverageAnalysis: "all");
            options.Optimizations.HasFlag(OptimizationFlags.SkipUncoveredMutants).ShouldBeTrue();

            options = new StrykerOptions(coverageAnalysis: "off");
            options.Optimizations.HasFlag(OptimizationFlags.NoOptimization).ShouldBeTrue();

            var ex = Assert.Throws<StrykerInputException>(() =>
            {
                new StrykerOptions(coverageAnalysis: "gibberish");
            });
            ex.Details.ShouldBe($"Incorrect coverageAnalysis option gibberish. The options are [off, all, perTest or perTestInIsolation].");
        }
Пример #30
0
 /// <param name="mutators">The mutators that should be active during the mutation process</param>
 public MutantOrchestrator(IEnumerable <IMutator> mutators = null, StrykerOptions options = null)
 {
     _options = options;
     Mutators = mutators ?? new List <IMutator>()
     {
         // the default list of mutators
         new BinaryExpressionMutator(),
         new BooleanMutator(),
         new AssignmentExpressionMutator(),
         new PrefixUnaryMutator(),
         new PostfixUnaryMutator(),
         new CheckedMutator(),
         new LinqMutator(),
         new StringMutator(),
         new StringEmptyMutator(),
         new InterpolatedStringMutator(),
         new NegateConditionMutator(),
     };
     Mutants = new Collection <Mutant>();
     Logger  = ApplicationLogging.LoggerFactory.CreateLogger <MutantOrchestrator>();
 }