Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pass TFM into Buildalyzer build #3185

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,8 @@ internal Mock<IProjectAnalyzer> BuildProjectAnalyzerMock(string csprojPathName,
projectAnalyzerMock.Setup(x => x.Build(It.IsAny<string[]>())).Returns(sourceProjectAnalyzerResultsMock);
projectAnalyzerMock.Setup(x => x.Build(It.IsAny<string[]>(), It.IsAny<EnvironmentOptions>())).Returns(sourceProjectAnalyzerResultsMock);
projectAnalyzerMock.Setup(x => x.Build(It.IsAny<EnvironmentOptions>())).Returns(sourceProjectAnalyzerResultsMock);
projectAnalyzerMock.Setup(x => x.Build(It.IsAny<string>())).Returns(sourceProjectAnalyzerResultsMock);
projectAnalyzerMock.Setup(x => x.Build(It.IsAny<string>(), It.IsAny<EnvironmentOptions>())).Returns(sourceProjectAnalyzerResultsMock);
projectAnalyzerMock.Setup(x => x.Build()).Returns(sourceProjectAnalyzerResultsMock);

projectAnalyzerMock.Setup(x => x.ProjectFile).Returns(projectFileMock.Object);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -908,7 +908,7 @@ public void ShouldSelectFrameworkBasedOnTestProject(string testFrameworks, strin
var testProjectPath = Path.Combine(_sourcePath, "TestProjectFolder", "TestProject.csproj");
var sourceProjectPath = Path.Combine(_sourcePath, "ExampleProject", "ExampleProject.csproj");
var sourceProjectNameFilter = "ExampleProject.csproj";

var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
{
{ sourceProjectPath, new MockFileData(_defaultTestProjectFileContents)},
Expand Down
46 changes: 41 additions & 5 deletions src/Stryker.Core/Stryker.Core/Initialisation/InputFileResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Buildalyzer;
using Buildalyzer.Environment;
using Microsoft.Extensions.Logging;
using NuGet.Frameworks;
using Stryker.Abstractions.Exceptions;
using Stryker.Abstractions.Logging;
using Stryker.Abstractions.Options;
Expand Down Expand Up @@ -183,7 +184,7 @@ private IEnumerable<IAnalyzerResult> GetProjectAndAddIt(IStrykerOptions options,
ConcurrentBag<(IEnumerable<IAnalyzerResult> result, bool isTest)> mutableProjectsAnalyzerResults)
{
var project = manager.GetProject(entry.projectFile);
IEnumerable<IAnalyzerResult> buildResult = AnalyzeSingleProject(project, options);
IEnumerable<IAnalyzerResult> buildResult = AnalyzeSingleProject(project, options, entry.framework);
if (!buildResult.Any())
{
// analysis failed
Expand Down Expand Up @@ -237,7 +238,7 @@ private List<string> ScanReferences(ScanMode mode, IEnumerable<IAnalyzerResult>
return referencesToAdd;
}

private IAnalyzerResults AnalyzeSingleProject(IProjectAnalyzer project, IStrykerOptions options)
private IAnalyzerResults AnalyzeSingleProject(IProjectAnalyzer project, IStrykerOptions options, string targetFramework = null)
{
if (options.DevMode)
{
Expand All @@ -246,7 +247,14 @@ private IAnalyzerResults AnalyzeSingleProject(IProjectAnalyzer project, IStryker
}
var projectLogName = Path.GetRelativePath(options.WorkingDirectory, project.ProjectFile.Path);
_logger.LogDebug("Analyzing {ProjectFilePath}", projectLogName);
var buildResult = project.Build();

string bestFramework = null;
if (targetFramework is not null)
{
bestFramework = DetermineBestTargetFramework(project, targetFramework);
}

var buildResult = project.Build(bestFramework!);

var buildResultOverallSuccess = buildResult.OverallSuccess || Array.
TrueForAll(project.ProjectFile.TargetFrameworks, tf =>
Expand All @@ -273,7 +281,7 @@ private IAnalyzerResults AnalyzeSingleProject(IProjectAnalyzer project, IStryker
Restore = true
};
// retry the analysis
buildResult = project.Build(buildOptions);
buildResult = project.Build(bestFramework, buildOptions);

// check the new status
buildResultOverallSuccess = Array.TrueForAll(project.ProjectFile.TargetFrameworks, tf =>
Expand Down Expand Up @@ -302,6 +310,34 @@ private IAnalyzerResults AnalyzeSingleProject(IProjectAnalyzer project, IStryker
return buildResult.All(br => !IsValid(br)) ? new AnalyzerResults() : buildResult;
}

private string DetermineBestTargetFramework(IProjectAnalyzer project, string targetFramework)
{
var targetFrameworks = project.ProjectFile.TargetFrameworks;

if (targetFrameworks.Contains(targetFramework))
{
return targetFramework;
}

var reducer = new FrameworkReducer();
var framework = NuGetFramework.Parse(targetFramework);
var availableFrameworks = targetFrameworks.Select(NuGetFramework.Parse).ToList();

var nearest = reducer.GetNearest(framework, availableFrameworks);

if (nearest is null)
{
_logger.LogWarning("Could not find any compatible target frameworks for project '{ProjectFilePath}' that are compatible with '{TargetFramework}'.", project.ProjectFile.Path, targetFramework);
return null;
}

var bestFramework = nearest.GetShortFolderName();

_logger.LogInformation("Target framework '{TargetFramework}' not found in project '{ProjectFilePath}'. Using '{BestFramework}' instead.", targetFramework, project.ProjectFile.Path, bestFramework);

return bestFramework;
}

private void LogAnalyzerResult(IAnalyzerResults analyzerResults, IStrykerOptions options)
{
// do not log if trace is not enabled
Expand Down Expand Up @@ -338,7 +374,7 @@ private void LogAnalyzerResult(IAnalyzerResults analyzerResults, IStrykerOptions
{
if (importantProperties.Contains(property.Key))
{
continue; // already logged
continue; // already logged
}

log.AppendLine($"Property {property.Key}={property.Value.Replace(Environment.NewLine, "\\n")}");
Expand Down
Loading