diff --git a/src/Platform/Microsoft.Testing.Extensions.CtrfReport/CtrfReportExtensions.cs b/src/Platform/Microsoft.Testing.Extensions.CtrfReport/CtrfReportExtensions.cs
index 5d8a03502c..bdc1c73807 100644
--- a/src/Platform/Microsoft.Testing.Extensions.CtrfReport/CtrfReportExtensions.cs
+++ b/src/Platform/Microsoft.Testing.Extensions.CtrfReport/CtrfReportExtensions.cs
@@ -4,7 +4,6 @@
using Microsoft.Testing.Extensions.CtrfReport;
using Microsoft.Testing.Extensions.CtrfReport.Resources;
using Microsoft.Testing.Platform.Builder;
-using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Helpers;
using Microsoft.Testing.Platform.Logging;
using Microsoft.Testing.Platform.Services;
@@ -22,16 +21,11 @@ public static class CtrfReportExtensions
///
/// The test application builder.
public static void AddCtrfReportProvider(this ITestApplicationBuilder builder)
- {
- if (builder is not TestApplicationBuilder)
- {
- throw new InvalidOperationException(ExtensionResources.InvalidTestApplicationBuilderType);
- }
-
- var commandLine = new CtrfReportGeneratorCommandLine();
-
- var compositeCtrfReportGenerator =
- new CompositeExtensionFactory(serviceProvider =>
+ => ReportProviderRegistration.AddReportProvider(
+ builder,
+ ExtensionResources.InvalidTestApplicationBuilderType,
+ () => new CtrfReportGeneratorCommandLine(),
+ serviceProvider =>
new CtrfReportGenerator(
serviceProvider.GetConfiguration(),
serviceProvider.GetCommandLineOptions(),
@@ -44,10 +38,4 @@ public static void AddCtrfReportProvider(this ITestApplicationBuilder builder)
serviceProvider.GetTestFramework(),
serviceProvider.GetTestApplicationProcessExitCode(),
serviceProvider.GetLoggerFactory().CreateLogger()));
-
- builder.TestHost.AddDataConsumer(compositeCtrfReportGenerator);
- builder.TestHost.AddTestSessionLifetimeHandler(compositeCtrfReportGenerator);
-
- builder.CommandLine.AddProvider(() => commandLine);
- }
}
diff --git a/src/Platform/Microsoft.Testing.Extensions.CtrfReport/Microsoft.Testing.Extensions.CtrfReport.csproj b/src/Platform/Microsoft.Testing.Extensions.CtrfReport/Microsoft.Testing.Extensions.CtrfReport.csproj
index 56dd893cce..d7a44e86c6 100644
--- a/src/Platform/Microsoft.Testing.Extensions.CtrfReport/Microsoft.Testing.Extensions.CtrfReport.csproj
+++ b/src/Platform/Microsoft.Testing.Extensions.CtrfReport/Microsoft.Testing.Extensions.CtrfReport.csproj
@@ -56,6 +56,7 @@ This package extends Microsoft Testing Platform to produce test reports in the C
+
diff --git a/src/Platform/Microsoft.Testing.Extensions.HtmlReport/HtmlReportExtensions.cs b/src/Platform/Microsoft.Testing.Extensions.HtmlReport/HtmlReportExtensions.cs
index eef9848ab2..2d8b0c7327 100644
--- a/src/Platform/Microsoft.Testing.Extensions.HtmlReport/HtmlReportExtensions.cs
+++ b/src/Platform/Microsoft.Testing.Extensions.HtmlReport/HtmlReportExtensions.cs
@@ -4,7 +4,6 @@
using Microsoft.Testing.Extensions.HtmlReport;
using Microsoft.Testing.Extensions.HtmlReport.Resources;
using Microsoft.Testing.Platform.Builder;
-using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Helpers;
using Microsoft.Testing.Platform.Logging;
using Microsoft.Testing.Platform.Services;
@@ -22,16 +21,11 @@ public static class HtmlReportExtensions
///
/// The test application builder.
public static void AddHtmlReportProvider(this ITestApplicationBuilder builder)
- {
- if (builder is not TestApplicationBuilder)
- {
- throw new InvalidOperationException(ExtensionResources.InvalidTestApplicationBuilderType);
- }
-
- var commandLine = new HtmlReportGeneratorCommandLine();
-
- var compositeHtmlReportGenerator =
- new CompositeExtensionFactory(serviceProvider =>
+ => ReportProviderRegistration.AddReportProvider(
+ builder,
+ ExtensionResources.InvalidTestApplicationBuilderType,
+ () => new HtmlReportGeneratorCommandLine(),
+ serviceProvider =>
new HtmlReportGenerator(
serviceProvider.GetConfiguration(),
serviceProvider.GetCommandLineOptions(),
@@ -44,10 +38,4 @@ public static void AddHtmlReportProvider(this ITestApplicationBuilder builder)
serviceProvider.GetTestFramework(),
serviceProvider.GetTestApplicationProcessExitCode(),
serviceProvider.GetLoggerFactory().CreateLogger()));
-
- builder.TestHost.AddDataConsumer(compositeHtmlReportGenerator);
- builder.TestHost.AddTestSessionLifetimeHandler(compositeHtmlReportGenerator);
-
- builder.CommandLine.AddProvider(() => commandLine);
- }
}
diff --git a/src/Platform/Microsoft.Testing.Extensions.HtmlReport/Microsoft.Testing.Extensions.HtmlReport.csproj b/src/Platform/Microsoft.Testing.Extensions.HtmlReport/Microsoft.Testing.Extensions.HtmlReport.csproj
index f64a1df50c..dd146add10 100644
--- a/src/Platform/Microsoft.Testing.Extensions.HtmlReport/Microsoft.Testing.Extensions.HtmlReport.csproj
+++ b/src/Platform/Microsoft.Testing.Extensions.HtmlReport/Microsoft.Testing.Extensions.HtmlReport.csproj
@@ -54,6 +54,7 @@ This package extends Microsoft Testing Platform to produce self-contained HTML t
+
diff --git a/src/Platform/Microsoft.Testing.Extensions.JUnitReport/JUnitReportExtensions.cs b/src/Platform/Microsoft.Testing.Extensions.JUnitReport/JUnitReportExtensions.cs
index 49e8b5e44c..ae81b19b13 100644
--- a/src/Platform/Microsoft.Testing.Extensions.JUnitReport/JUnitReportExtensions.cs
+++ b/src/Platform/Microsoft.Testing.Extensions.JUnitReport/JUnitReportExtensions.cs
@@ -4,7 +4,6 @@
using Microsoft.Testing.Extensions.JUnitReport;
using Microsoft.Testing.Extensions.JUnitReport.Resources;
using Microsoft.Testing.Platform.Builder;
-using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Helpers;
using Microsoft.Testing.Platform.Logging;
using Microsoft.Testing.Platform.Services;
@@ -22,16 +21,11 @@ public static class JUnitReportExtensions
///
/// The test application builder.
public static void AddJUnitReportProvider(this ITestApplicationBuilder builder)
- {
- if (builder is not TestApplicationBuilder)
- {
- throw new InvalidOperationException(ExtensionResources.InvalidTestApplicationBuilderType);
- }
-
- var commandLine = new JUnitReportGeneratorCommandLine();
-
- var compositeJUnitReportGenerator =
- new CompositeExtensionFactory(serviceProvider =>
+ => ReportProviderRegistration.AddReportProvider(
+ builder,
+ ExtensionResources.InvalidTestApplicationBuilderType,
+ () => new JUnitReportGeneratorCommandLine(),
+ serviceProvider =>
new JUnitReportGenerator(
serviceProvider.GetConfiguration(),
serviceProvider.GetCommandLineOptions(),
@@ -44,10 +38,4 @@ public static void AddJUnitReportProvider(this ITestApplicationBuilder builder)
serviceProvider.GetTestFramework(),
serviceProvider.GetTestApplicationProcessExitCode(),
serviceProvider.GetLoggerFactory().CreateLogger()));
-
- builder.TestHost.AddDataConsumer(compositeJUnitReportGenerator);
- builder.TestHost.AddTestSessionLifetimeHandler(compositeJUnitReportGenerator);
-
- builder.CommandLine.AddProvider(() => commandLine);
- }
}
diff --git a/src/Platform/Microsoft.Testing.Extensions.JUnitReport/Microsoft.Testing.Extensions.JUnitReport.csproj b/src/Platform/Microsoft.Testing.Extensions.JUnitReport/Microsoft.Testing.Extensions.JUnitReport.csproj
index ec11fa08e3..60823d340f 100644
--- a/src/Platform/Microsoft.Testing.Extensions.JUnitReport/Microsoft.Testing.Extensions.JUnitReport.csproj
+++ b/src/Platform/Microsoft.Testing.Extensions.JUnitReport/Microsoft.Testing.Extensions.JUnitReport.csproj
@@ -52,6 +52,7 @@ This package extends Microsoft Testing Platform to produce JUnit XML test report
+
diff --git a/src/Platform/SharedExtensionHelpers/ReportProviderRegistration.cs b/src/Platform/SharedExtensionHelpers/ReportProviderRegistration.cs
new file mode 100644
index 0000000000..6f1b8f5ee3
--- /dev/null
+++ b/src/Platform/SharedExtensionHelpers/ReportProviderRegistration.cs
@@ -0,0 +1,44 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Microsoft.Testing.Platform.Builder;
+using Microsoft.Testing.Platform.Extensions;
+using Microsoft.Testing.Platform.Extensions.CommandLine;
+using Microsoft.Testing.Platform.Extensions.TestHost;
+
+namespace Microsoft.Testing.Extensions;
+
+internal static class ReportProviderRegistration
+{
+ ///
+ /// Registers a report generator as both a data consumer and a test session lifetime handler, along with its
+ /// command-line options provider, applying the shared TestApplicationBuilder implementation guard.
+ ///
+ /// The report generator type.
+ /// The test application builder.
+ ///
+ /// The error message used when is not a TestApplicationBuilder.
+ ///
+ /// The factory that creates the command-line options provider associated with the report.
+ /// The factory that creates the report generator from the service provider.
+ public static void AddReportProvider(
+ ITestApplicationBuilder builder,
+ string invalidBuilderTypeErrorMessage,
+ Func commandLineFactory,
+ Func generatorFactory)
+ where TGenerator : class, IDataConsumer, ITestSessionLifetimeHandler
+ {
+ if (builder is not TestApplicationBuilder)
+ {
+ throw new InvalidOperationException(invalidBuilderTypeErrorMessage);
+ }
+
+ var compositeReportGenerator = new CompositeExtensionFactory(generatorFactory);
+
+ builder.TestHost.AddDataConsumer(compositeReportGenerator);
+ builder.TestHost.AddTestSessionLifetimeHandler(compositeReportGenerator);
+
+ ICommandLineOptionsProvider commandLine = commandLineFactory();
+ builder.CommandLine.AddProvider(() => commandLine);
+ }
+}