Skip to content

Commit bb61b02

Browse files
authored
Merge pull request #337 from tonyhallett/correct-mscode-provided-runsettings-enabled
intercept user runsettings and disable ms code coverage when all proj…
2 parents 6fe6554 + 6252662 commit bb61b02

6 files changed

+146
-12
lines changed

FineCodeCoverageTests/MsCodeCoverage/MsCodeCoverageRunSettingsService_Collect_Tests.cs

+35-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,24 @@
1818

1919
namespace FineCodeCoverageTests.MsCodeCoverage
2020
{
21+
2122
internal class MsCodeCoverageRunSettingsService_Test_Execution_Not_Finished_Tests
2223
{
24+
[Test]
25+
public void Should_Set_To_Not_Collecting()
26+
{
27+
var autoMocker = new AutoMoqer();
28+
var msCodeCoverageRunSettingsService = autoMocker.Create<MsCodeCoverageRunSettingsService>();
29+
30+
msCodeCoverageRunSettingsService.collectionStatus = MsCodeCoverageCollectionStatus.Collecting;
31+
32+
var mockTestOperation = new Mock<ITestOperation>();
33+
mockTestOperation.Setup(testOperation => testOperation.GetCoverageProjectsAsync()).ReturnsAsync(new List<ICoverageProject>());
34+
msCodeCoverageRunSettingsService.TestExecutionNotFinishedAsync(mockTestOperation.Object);
35+
36+
Assert.That(msCodeCoverageRunSettingsService.collectionStatus, Is.EqualTo(MsCodeCoverageCollectionStatus.NotCollecting));
37+
}
38+
2339
[Test]
2440
public async Task Should_Clean_Up_RunSettings_Coverage_Projects()
2541
{
@@ -68,6 +84,23 @@ internal class MsCodeCoverageRunSettingsService_Collect_Tests
6884
{
6985
private AutoMoqer autoMocker;
7086
private ICoverageProject runSettingsCoverageProject;
87+
private MsCodeCoverageRunSettingsService msCodeCoverageRunSettingsService;
88+
89+
[Test]
90+
public async Task Should_Set_To_Not_Collecting()
91+
{
92+
var resultsUris = new List<Uri>()
93+
{
94+
new Uri(@"C:\SomePath\result1.cobertura.xml", UriKind.Absolute),
95+
new Uri(@"C:\SomePath\result2.cobertura.xml", UriKind.Absolute),
96+
new Uri(@"C:\SomePath\result3.xml", UriKind.Absolute),
97+
};
98+
99+
var expectedCoberturaFiles = new string[] { @"C:\SomePath\result1.cobertura.xml", @"C:\SomePath\result2.cobertura.xml" };
100+
await RunAndProcessReportAsync(resultsUris, expectedCoberturaFiles);
101+
102+
Assert.That(msCodeCoverageRunSettingsService.collectionStatus, Is.EqualTo(MsCodeCoverageCollectionStatus.NotCollecting));
103+
}
71104

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

122-
var msCodeCoverageRunSettingsService = autoMocker.Create<MsCodeCoverageRunSettingsService>();
155+
msCodeCoverageRunSettingsService = autoMocker.Create<MsCodeCoverageRunSettingsService>();
156+
msCodeCoverageRunSettingsService.collectionStatus = MsCodeCoverageCollectionStatus.Collecting;
123157
msCodeCoverageRunSettingsService.threadHelper = new TestThreadHelper();
124158

125159
var mockFccEngine = new Mock<IFCCEngine>();

FineCodeCoverageTests/MsCodeCoverage/RunSettingsTemplateReplacementsFactory_Tests.cs

+42
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,48 @@ public void Should_Be_Empty_String_Replacement_When_Null()
362362
ReplacementsAssertions.AssertAllEmpty(replacements);
363363
}
364364

365+
[TestCase(true,true,"true")]
366+
[TestCase(false, true, "true")]
367+
[TestCase(true, false, "true")]
368+
[TestCase(false, false, "false")]
369+
public void Should_Be_Disabled_When_All_Projects_Are_Disabled(bool project1Enabled, bool project2Enabled, string expectedEnabled)
370+
{
371+
var testContainer1 = CreateTestContainer("Source1");
372+
var testContainer2 = CreateTestContainer("Source2");
373+
var testContainers = new List<ITestContainer>()
374+
{
375+
testContainer1,
376+
testContainer2
377+
};
378+
Dictionary<string, IUserRunSettingsProjectDetails> userRunSettingsProjectDetailsLookup = new Dictionary<string, IUserRunSettingsProjectDetails>
379+
{
380+
{
381+
"Source1",
382+
new TestUserRunSettingsProjectDetails
383+
{
384+
CoverageOutputFolder = "",
385+
Settings = new TestMsCodeCoverageOptions{ Enabled = project1Enabled, IncludeTestAssembly = true},
386+
ExcludedReferencedProjects = new List<string>(),
387+
IncludedReferencedProjects = new List<string>(),
388+
}
389+
},
390+
{
391+
"Source2",
392+
new TestUserRunSettingsProjectDetails
393+
{
394+
CoverageOutputFolder = "",
395+
Settings = new TestMsCodeCoverageOptions{ Enabled = project2Enabled, IncludeTestAssembly = true},
396+
ExcludedReferencedProjects = new List<string>(),
397+
IncludedReferencedProjects = new List<string>(),
398+
}
399+
}
400+
};
401+
402+
var runSettingsTemplateReplacements = runSettingsTemplateReplacementsFactory.Create(testContainers, userRunSettingsProjectDetailsLookup, "");
403+
404+
Assert.That(runSettingsTemplateReplacements.Enabled, Is.EqualTo(expectedEnabled));
405+
}
406+
365407
private string ModulePathElement(string value)
366408
{
367409
return $"<ModulePath>{value}</ModulePath>";

FineCodeCoverageTests/MsCodeCoverage/UserRunSettingsService_AddFCCSettings_Tests.cs

+45-6
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public void Should_Create_Replacements()
112112
projectDetailsLookup,
113113
"fccMsTestAdapterPath"
114114
)
115-
).Returns(new RunSettingsTemplateReplacements());
115+
).Returns(new RunSettingsTemplateReplacements() { Enabled = "true"});
116116

117117
userRunSettingsService.AddFCCRunSettings(
118118
xPathNavigable,
@@ -144,7 +144,8 @@ public void Should_Add_Replaced_RunConfiguration_If_Not_Present()
144144
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements
145145
{
146146
ResultsDirectory = resultsDirectory,
147-
TestAdapter = testAdapter
147+
TestAdapter = testAdapter,
148+
Enabled = "true"
148149
});
149150
}
150151

@@ -167,7 +168,8 @@ public void Should_Add_Replaced_TestAdaptersPath_If_Not_Present()
167168
</RunSettings>";
168169
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements
169170
{
170-
TestAdapter = "MsTestAdapter"
171+
TestAdapter = "MsTestAdapter",
172+
Enabled = "true"
171173
});
172174

173175
}
@@ -192,7 +194,8 @@ public void Should_Replace_TestAdaptersPath_If_Present()
192194
</RunSettings>";
193195
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements
194196
{
195-
TestAdapter = "MsTestAdapter"
197+
TestAdapter = "MsTestAdapter",
198+
Enabled = "true"
196199
});
197200
}
198201

@@ -469,7 +472,7 @@ public void Should_Add_Missing_Configuration_Format_Cobertura_To_Existing_Ms_Dat
469472
</DataCollectionRunSettings>
470473
</RunSettings>
471474
";
472-
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements());
475+
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements() { Enabled = "true"});
473476
}
474477

475478
[Test]
@@ -505,7 +508,7 @@ public void Should_Change_Format_To_Cobertura_For_Existing_Ms_Data_Collector()
505508
</RunSettings>
506509
";
507510

508-
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements());
511+
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements() { Enabled = "true"});
509512
}
510513

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

565+
[Test]
566+
public void Should_Disable_Ms_Data_Collection_When_Not_Enabled()
567+
{
568+
var runSettings = $@"
569+
<RunSettings>
570+
{unchangedRunConfiguration}
571+
<DataCollectionRunSettings>
572+
<DataCollectors>
573+
<DataCollector uri='datacollector://Microsoft/CodeCoverage/2.0' enabled='true'>
574+
<Configuration>
575+
<Format>Xml</Format>
576+
</Configuration>
577+
</DataCollector>
578+
</DataCollectors>
579+
</DataCollectionRunSettings>
580+
</RunSettings>
581+
";
582+
583+
var expectedRunSettings = $@"
584+
<RunSettings>
585+
{unchangedRunConfiguration}
586+
<DataCollectionRunSettings>
587+
<DataCollectors>
588+
<DataCollector uri='datacollector://Microsoft/CodeCoverage/2.0' enabled='false'>
589+
<Configuration>
590+
<Format>Cobertura</Format>
591+
</Configuration>
592+
</DataCollector>
593+
</DataCollectors>
594+
</DataCollectionRunSettings>
595+
</RunSettings>
596+
";
597+
598+
TestAddFCCSettings(runSettings, expectedRunSettings, new RunSettingsTemplateReplacements() { Enabled = "false" });
599+
}
600+
562601
private void TestAddFCCSettings(string runSettings, string expectedFccRunSettings, IRunSettingsTemplateReplacements runSettingsTemplateReplacements)
563602
{
564603
var actualRunSettings = AddFCCSettings(runSettings, runSettingsTemplateReplacements);

SharedProject/Core/MsTestPlatform/CodeCoverage/MsCodeCoverageRunSettingsService.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ private void ReportEndOfCoverageRunIfError()
178178

179179
private Task InitializeIsCollectingAsync(ITestOperation testOperation)
180180
{
181-
collectionStatus = MsCodeCoverageCollectionStatus.NotCollecting;
182181
runMsCodeCoverage = appOptionsProvider.Get().RunMsCodeCoverage;
183182
useMsCodeCoverage = runMsCodeCoverage == RunMsCodeCoverage.Yes;
184183
userRunSettingsProjectDetailsLookup = null;
@@ -407,6 +406,7 @@ private async Task CleanUpAsync(ITestOperation testOperation)
407406
{
408407
coverageProjectsByType = await CoverageProjectsByType.CreateAsync(testOperation);
409408
await templatedRunSettingsService.CleanUpAsync(coverageProjectsByType.RunSettings);
409+
collectionStatus = MsCodeCoverageCollectionStatus.NotCollecting;
410410
}
411411
}
412412

@@ -415,7 +415,7 @@ public static bool IsTestExecution(this IRunSettingsConfigurationInfo configurat
415415
{
416416
return configurationInfo.RequestState == RunSettingConfigurationInfoState.Execution;
417417
}
418-
418+
419419
}
420420

421421
internal static class UserRunSettingsAnalysisResultExtensions

SharedProject/Core/MsTestPlatform/CodeCoverage/RunSettingsTemplateReplacementsFactory.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ public IRunSettingsTemplateReplacements Create(
146146
var allProjectDetails = testContainers.Select(tc => userRunSettingsProjectDetailsLookup[tc.Source]).ToList();
147147
var resultsDirectory = allProjectDetails[0].CoverageOutputFolder;
148148
var allSettings = allProjectDetails.Select(pd => pd.Settings);
149+
var allProjectsDisabled = allSettings.All(s => !s.Enabled);
149150
var mergedSettings = new MergedIncludesExcludesOptions(allSettings);
150151

151152

@@ -162,7 +163,7 @@ public IRunSettingsTemplateReplacements Create(
162163

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

168169
public IRunSettingsTemplateReplacements Create(ICoverageProject coverageProject, string testAdapter)

SharedProject/Core/MsTestPlatform/CodeCoverage/UserRunSettingsService.cs

+20-2
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ private IXPathNavigable AddFCCRunSettingsActual(IXPathNavigable inputRunSettingD
152152
userRunSettingsProjectDetailsLookup,
153153
fccMsTestAdapterPath
154154
);
155+
155156
EnsureTestAdaptersPathsAndReplace(navigator, replacements);
156157
EnsureCorrectMsDataCollectorAndReplace(clonedNavigator, replacements);
157158
return navigator;
@@ -212,14 +213,31 @@ private void EnsureCorrectMsDataCollectorAndReplace(XPathNavigator xpathNavigato
212213
xpathNavigator.AppendChild(runSettingsTemplate.DataCollectionRunSettingsElement);
213214
}
214215

215-
if (addedMsDataCollector)
216+
// todo - improve this
217+
var disableMsDataCollector = replacements.Enabled == "false";
218+
if (addedMsDataCollector || disableMsDataCollector)
216219
{
217220
xpathNavigator.MoveToRoot();
218221
var dataCollectorsNavigator = xpathNavigator.SelectSingleNode("/RunSettings/DataCollectionRunSettings/DataCollectors");
219222
var msDataCollectorNavigator = MoveToMsDataCollectorFromDataCollectors(dataCollectorsNavigator);
220-
ReplaceExcludesIncludes(msDataCollectorNavigator, replacements);
223+
224+
if (disableMsDataCollector)
225+
{
226+
DisableMsDataCollector(msDataCollectorNavigator);
227+
}
228+
else
229+
{
230+
ReplaceExcludesIncludes(msDataCollectorNavigator, replacements); // no need to replace if we are disabling
231+
}
221232
}
233+
}
222234

235+
236+
private void DisableMsDataCollector(XPathNavigator msDataCollectorNavigator)
237+
{
238+
var element = XElement.Parse(msDataCollectorNavigator.OuterXml);
239+
element.SetAttributeValue("enabled", "false");
240+
msDataCollectorNavigator.OuterXml = element.ToString();
223241
}
224242

225243
private XPathNavigator MoveToMsDataCollectorFromDataCollectors(XPathNavigator navigator)

0 commit comments

Comments
 (0)