Skip to content

Commit

Permalink
Merge pull request #337 from tonyhallett/correct-mscode-provided-runs…
Browse files Browse the repository at this point in the history
…ettings-enabled

intercept user runsettings and disable ms code coverage when all proj…
  • Loading branch information
tonyhallett committed Jul 2, 2023
2 parents 6fe6554 + 6252662 commit bb61b02
Show file tree
Hide file tree
Showing 6 changed files with 146 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,24 @@

namespace FineCodeCoverageTests.MsCodeCoverage
{

internal class MsCodeCoverageRunSettingsService_Test_Execution_Not_Finished_Tests
{
[Test]
public void Should_Set_To_Not_Collecting()
{
var autoMocker = new AutoMoqer();
var msCodeCoverageRunSettingsService = autoMocker.Create<MsCodeCoverageRunSettingsService>();

msCodeCoverageRunSettingsService.collectionStatus = MsCodeCoverageCollectionStatus.Collecting;

var mockTestOperation = new Mock<ITestOperation>();
mockTestOperation.Setup(testOperation => testOperation.GetCoverageProjectsAsync()).ReturnsAsync(new List<ICoverageProject>());
msCodeCoverageRunSettingsService.TestExecutionNotFinishedAsync(mockTestOperation.Object);

Assert.That(msCodeCoverageRunSettingsService.collectionStatus, Is.EqualTo(MsCodeCoverageCollectionStatus.NotCollecting));
}

[Test]
public async Task Should_Clean_Up_RunSettings_Coverage_Projects()
{
Expand Down Expand Up @@ -68,6 +84,23 @@ internal class MsCodeCoverageRunSettingsService_Collect_Tests
{
private AutoMoqer autoMocker;
private ICoverageProject runSettingsCoverageProject;
private MsCodeCoverageRunSettingsService msCodeCoverageRunSettingsService;

[Test]
public async Task Should_Set_To_Not_Collecting()
{
var resultsUris = new List<Uri>()
{
new Uri(@"C:\SomePath\result1.cobertura.xml", UriKind.Absolute),
new Uri(@"C:\SomePath\result2.cobertura.xml", UriKind.Absolute),
new Uri(@"C:\SomePath\result3.xml", UriKind.Absolute),
};

var expectedCoberturaFiles = new string[] { @"C:\SomePath\result1.cobertura.xml", @"C:\SomePath\result2.cobertura.xml" };
await RunAndProcessReportAsync(resultsUris, expectedCoberturaFiles);

Assert.That(msCodeCoverageRunSettingsService.collectionStatus, Is.EqualTo(MsCodeCoverageCollectionStatus.NotCollecting));
}

[Test]
public async Task Should_FCCEngine_RunAndProcessReport_With_CoberturaResults()
Expand Down Expand Up @@ -119,7 +152,8 @@ private async Task RunAndProcessReportAsync(IEnumerable<Uri> resultsUris,string[
It.IsAny<CancellationToken>()
)).Returns("ZipDestination");

var msCodeCoverageRunSettingsService = autoMocker.Create<MsCodeCoverageRunSettingsService>();
msCodeCoverageRunSettingsService = autoMocker.Create<MsCodeCoverageRunSettingsService>();
msCodeCoverageRunSettingsService.collectionStatus = MsCodeCoverageCollectionStatus.Collecting;
msCodeCoverageRunSettingsService.threadHelper = new TestThreadHelper();

var mockFccEngine = new Mock<IFCCEngine>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,48 @@ public void Should_Be_Empty_String_Replacement_When_Null()
ReplacementsAssertions.AssertAllEmpty(replacements);
}

[TestCase(true,true,"true")]
[TestCase(false, true, "true")]
[TestCase(true, false, "true")]
[TestCase(false, false, "false")]
public void Should_Be_Disabled_When_All_Projects_Are_Disabled(bool project1Enabled, bool project2Enabled, string expectedEnabled)
{
var testContainer1 = CreateTestContainer("Source1");
var testContainer2 = CreateTestContainer("Source2");
var testContainers = new List<ITestContainer>()
{
testContainer1,
testContainer2
};
Dictionary<string, IUserRunSettingsProjectDetails> userRunSettingsProjectDetailsLookup = new Dictionary<string, IUserRunSettingsProjectDetails>
{
{
"Source1",
new TestUserRunSettingsProjectDetails
{
CoverageOutputFolder = "",
Settings = new TestMsCodeCoverageOptions{ Enabled = project1Enabled, IncludeTestAssembly = true},
ExcludedReferencedProjects = new List<string>(),
IncludedReferencedProjects = new List<string>(),
}
},
{
"Source2",
new TestUserRunSettingsProjectDetails
{
CoverageOutputFolder = "",
Settings = new TestMsCodeCoverageOptions{ Enabled = project2Enabled, IncludeTestAssembly = true},
ExcludedReferencedProjects = new List<string>(),
IncludedReferencedProjects = new List<string>(),
}
}
};

var runSettingsTemplateReplacements = runSettingsTemplateReplacementsFactory.Create(testContainers, userRunSettingsProjectDetailsLookup, "");

Assert.That(runSettingsTemplateReplacements.Enabled, Is.EqualTo(expectedEnabled));
}

private string ModulePathElement(string value)
{
return $"<ModulePath>{value}</ModulePath>";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public void Should_Create_Replacements()
projectDetailsLookup,
"fccMsTestAdapterPath"
)
).Returns(new RunSettingsTemplateReplacements());
).Returns(new RunSettingsTemplateReplacements() { Enabled = "true"});

userRunSettingsService.AddFCCRunSettings(
xPathNavigable,
Expand Down Expand Up @@ -144,7 +144,8 @@ public void Should_Add_Replaced_RunConfiguration_If_Not_Present()
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements
{
ResultsDirectory = resultsDirectory,
TestAdapter = testAdapter
TestAdapter = testAdapter,
Enabled = "true"
});
}

Expand All @@ -167,7 +168,8 @@ public void Should_Add_Replaced_TestAdaptersPath_If_Not_Present()
</RunSettings>";
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements
{
TestAdapter = "MsTestAdapter"
TestAdapter = "MsTestAdapter",
Enabled = "true"
});

}
Expand All @@ -192,7 +194,8 @@ public void Should_Replace_TestAdaptersPath_If_Present()
</RunSettings>";
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements
{
TestAdapter = "MsTestAdapter"
TestAdapter = "MsTestAdapter",
Enabled = "true"
});
}

Expand Down Expand Up @@ -469,7 +472,7 @@ public void Should_Add_Missing_Configuration_Format_Cobertura_To_Existing_Ms_Dat
</DataCollectionRunSettings>
</RunSettings>
";
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements());
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements() { Enabled = "true"});
}

[Test]
Expand Down Expand Up @@ -505,7 +508,7 @@ public void Should_Change_Format_To_Cobertura_For_Existing_Ms_Data_Collector()
</RunSettings>
";

TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements());
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements() { Enabled = "true"});
}

[Test]
Expand Down Expand Up @@ -559,6 +562,42 @@ public void Should_Add_Replaced_RunConfiguration_And_Add_Replaceable_DataCollect
TestAddFCCSettings("<RunSettings/>", expectedRunSettings, new RunSettingsTemplateReplacements { Enabled = "true"});
}

[Test]
public void Should_Disable_Ms_Data_Collection_When_Not_Enabled()
{
var runSettings = $@"
<RunSettings>
{unchangedRunConfiguration}
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector uri='datacollector://Microsoft/CodeCoverage/2.0' enabled='true'>
<Configuration>
<Format>Xml</Format>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
";

var expectedRunSettings = $@"
<RunSettings>
{unchangedRunConfiguration}
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector uri='datacollector://Microsoft/CodeCoverage/2.0' enabled='false'>
<Configuration>
<Format>Cobertura</Format>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
";

TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements() { Enabled = "false" });
}

private void TestAddFCCSettings(string runSettings, string expectedFccRunSettings, IRunSettingsTemplateReplacements runSettingsTemplateReplacements)
{
var actualRunSettings = AddFCCSettings(runSettings, runSettingsTemplateReplacements);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,6 @@ private void ReportEndOfCoverageRunIfError()

private Task InitializeIsCollectingAsync(ITestOperation testOperation)
{
collectionStatus = MsCodeCoverageCollectionStatus.NotCollecting;
runMsCodeCoverage = appOptionsProvider.Get().RunMsCodeCoverage;
useMsCodeCoverage = runMsCodeCoverage == RunMsCodeCoverage.Yes;
userRunSettingsProjectDetailsLookup = null;
Expand Down Expand Up @@ -407,6 +406,7 @@ private async Task CleanUpAsync(ITestOperation testOperation)
{
coverageProjectsByType = await CoverageProjectsByType.CreateAsync(testOperation);
await templatedRunSettingsService.CleanUpAsync(coverageProjectsByType.RunSettings);
collectionStatus = MsCodeCoverageCollectionStatus.NotCollecting;
}
}

Expand All @@ -415,7 +415,7 @@ public static bool IsTestExecution(this IRunSettingsConfigurationInfo configurat
{
return configurationInfo.RequestState == RunSettingConfigurationInfoState.Execution;
}

}

internal static class UserRunSettingsAnalysisResultExtensions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ public IRunSettingsTemplateReplacements Create(
var allProjectDetails = testContainers.Select(tc => userRunSettingsProjectDetailsLookup[tc.Source]).ToList();
var resultsDirectory = allProjectDetails[0].CoverageOutputFolder;
var allSettings = allProjectDetails.Select(pd => pd.Settings);
var allProjectsDisabled = allSettings.All(s => !s.Enabled);
var mergedSettings = new MergedIncludesExcludesOptions(allSettings);


Expand All @@ -162,7 +163,7 @@ public IRunSettingsTemplateReplacements Create(

var additionalModulePathsInclude = allProjectDetails.SelectMany(projectDetails => projectDetails.IncludedReferencedProjects.Select(rp => MsCodeCoverageRegex.RegexModuleName(rp)));
var settings = new CombinedIncludesExcludesOptions(mergedSettings, additionalModulePathsInclude, additionalModulePathsExclude);
return new RunSettingsTemplateReplacements(settings, resultsDirectory, "true", testAdapter);
return new RunSettingsTemplateReplacements(settings, resultsDirectory, (!allProjectsDisabled).ToString().ToLower(), testAdapter);
}

public IRunSettingsTemplateReplacements Create(ICoverageProject coverageProject, string testAdapter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ private IXPathNavigable AddFCCRunSettingsActual(IXPathNavigable inputRunSettingD
userRunSettingsProjectDetailsLookup,
fccMsTestAdapterPath
);

EnsureTestAdaptersPathsAndReplace(navigator, replacements);
EnsureCorrectMsDataCollectorAndReplace(clonedNavigator, replacements);
return navigator;
Expand Down Expand Up @@ -212,14 +213,31 @@ private void EnsureCorrectMsDataCollectorAndReplace(XPathNavigator xpathNavigato
xpathNavigator.AppendChild(runSettingsTemplate.DataCollectionRunSettingsElement);
}

if (addedMsDataCollector)
// todo - improve this
var disableMsDataCollector = replacements.Enabled == "false";
if (addedMsDataCollector || disableMsDataCollector)
{
xpathNavigator.MoveToRoot();
var dataCollectorsNavigator = xpathNavigator.SelectSingleNode("/RunSettings/DataCollectionRunSettings/DataCollectors");
var msDataCollectorNavigator = MoveToMsDataCollectorFromDataCollectors(dataCollectorsNavigator);
ReplaceExcludesIncludes(msDataCollectorNavigator, replacements);

if (disableMsDataCollector)
{
DisableMsDataCollector(msDataCollectorNavigator);
}
else
{
ReplaceExcludesIncludes(msDataCollectorNavigator, replacements); // no need to replace if we are disabling
}
}
}


private void DisableMsDataCollector(XPathNavigator msDataCollectorNavigator)
{
var element = XElement.Parse(msDataCollectorNavigator.OuterXml);
element.SetAttributeValue("enabled", "false");
msDataCollectorNavigator.OuterXml = element.ToString();
}

private XPathNavigator MoveToMsDataCollectorFromDataCollectors(XPathNavigator navigator)
Expand Down

0 comments on commit bb61b02

Please sign in to comment.