Skip to content

Commit 347110c

Browse files
richardwerkmanrouke-broersmaRichard WerkmanRichard Werkman
authored
chore: implement dependency injection using Microsoft.Extensions.DependencyInjection (#3365)
* Initial Addresses review feedback about using real InitialisationProcess instead of mocks. Co-authored-by: richardwerkman <14224500+richardwerkman@users.noreply.github.com> * Addressing PR comments Co-authored-by: richardwerkman <14224500+richardwerkman@users.noreply.github.com> * fix: add missing using directive for System.IO.Abstractions * refactor: remove unnecessary logger parameters from InitialTestProcess and InitialisationProcess constructors * fix merge * Fix sonar issue * Add extra dependency injections * Add more DI * Fix issues * Fix test build * Fix unit tests * Fix some more tests * Fix dependency injection for IMutationProcess by removing F# initializer * fix tests * Fix more tests * fix code smells * rename integration test macOS --------- Co-authored-by: richardwerkman <14224500+richardwerkman@users.noreply.github.com> Co-authored-by: rouke-broersma <3595932+rouke-broersma@users.noreply.github.com> Co-authored-by: Rouke Broersma <rouke.broersma@infosupport.com> Co-authored-by: Richard Werkman <richard.werkman@infosupport.com> Co-authored-by: Richard Werkman <Richard.Werkman@Richards-MacBook-Pro.local>
1 parent 91b48fb commit 347110c

File tree

52 files changed

+709
-470
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+709
-470
lines changed

.github/workflows/integration-test.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: integration test macos m1
2-
run-name: e2e ${{ github.head_ref }} on m1 macos
2+
run-name: e2e ${{ github.head_ref }} on macOS apple silicon ARM
33

44
on: [pull_request]
55

src/Directory.Packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="1.2.39" />
55
<PackageVersion Include="LaunchDarkly.EventSource" Version="5.2.1" />
66
<PackageVersion Include="McMaster.Extensions.CommandLineUtils" Version="4.1.1" />
7+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
78
<PackageVersion Include="MSTest" Version="3.11.1" />
89
<PackageVersion Include="MSTest.TestFramework" Version="3.11.1" />
910
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="4.14.0" />
1011
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.14.0" />
1112
<PackageVersion Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.14.0" />
1213
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
14+
<PackageVersion Include="NuGet.Frameworks" Version="7.0.1" />
1315
<PackageVersion Include="NuGet.Protocol" Version="7.0.1" />
1416
<PackageVersion Include="ResXResourceReader.NetStandard" Version="1.3.0" />
1517
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
@@ -19,7 +21,6 @@
1921
<PackageVersion Include="Buildalyzer" Version="7.1.0" />
2022
<PackageVersion Include="Microsoft.Web.LibraryManager.Build" Version="3.0.71" />
2123
<PackageVersion Include="Mono.Cecil" Version="0.11.6" />
22-
<PackageVersion Include="NuGet.Frameworks" Version="7.0.1" />
2324
<PackageVersion Include="Serilog" Version="4.3.0" />
2425
<PackageVersion Include="Serilog.Extensions.Logging" Version="10.0.0" />
2526
<PackageVersion Include="Serilog.Extensions.Logging.File" Version="3.0.0" />

src/Stryker.Abstractions/packages.lock.json

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,6 @@
130130
"System.Configuration.ConfigurationManager": "8.0.0"
131131
}
132132
},
133-
"Microsoft.Extensions.DependencyInjection": {
134-
"type": "Transitive",
135-
"resolved": "6.0.0",
136-
"contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==",
137-
"dependencies": {
138-
"Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
139-
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
140-
}
141-
},
142133
"Microsoft.Extensions.DependencyInjection.Abstractions": {
143134
"type": "Transitive",
144135
"resolved": "6.0.0",
@@ -298,6 +289,16 @@
298289
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
299290
}
300291
},
292+
"Microsoft.Extensions.DependencyInjection": {
293+
"type": "CentralTransitive",
294+
"requested": "[10.0.0, )",
295+
"resolved": "6.0.0",
296+
"contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==",
297+
"dependencies": {
298+
"Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
299+
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
300+
}
301+
},
301302
"Microsoft.Extensions.Logging": {
302303
"type": "CentralTransitive",
303304
"requested": "[10.0.0, )",

src/Stryker.CLI/Stryker.CLI.UnitTest/FileConfigReaderTests.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
using System.IO;
2+
using System.IO.Abstractions;
23
using Microsoft.Extensions.Logging;
34
using Microsoft.VisualStudio.TestTools.UnitTesting;
45
using Moq;
56
using Shouldly;
7+
using Spectre.Console;
68
using Stryker.Abstractions;
79
using Stryker.Abstractions.Options;
10+
using Stryker.CLI.Clients;
11+
using Stryker.CLI.Logging;
12+
using Stryker.Configuration;
813
using Stryker.Core;
914
using Stryker.Core.Initialisation;
1015

@@ -29,8 +34,8 @@ public void WithNoArgumentsAndNoConfigFile_ShouldStartStrykerWithConfigOptions()
2934
var currentDirectory = Directory.GetCurrentDirectory();
3035
Directory.SetCurrentDirectory($"..{Path.DirectorySeparatorChar}");
3136
var runResults = new StrykerRunResult(options, 0.3);
32-
mock.Setup(x => x.RunMutationTest(It.IsAny<StrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>())).Returns(runResults).Verifiable();
33-
var target = new StrykerCli(mock.Object);
37+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>())).Returns(runResults).Verifiable();
38+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
3439

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

@@ -57,12 +62,12 @@ public void WithJsonConfigFile_ShouldStartStrykerWithConfigFileOptions(string ar
5762
var runResults = new StrykerRunResult(options, 0.3);
5863

5964
var mock = new Mock<IStrykerRunner>(MockBehavior.Strict);
60-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
61-
.Callback<IStrykerInputs, ILoggerFactory, IProjectOrchestrator>((c, l, p) => actualInputs = c)
65+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
66+
.Callback<IStrykerInputs>(c => actualInputs = c)
6267
.Returns(runResults)
6368
.Verifiable();
6469

65-
var target = new StrykerCli(mock.Object);
70+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
6671

6772
target.Run(new string[] { argName, "filled-stryker-config.json" });
6873

@@ -104,12 +109,12 @@ public void WithYamlConfigFile_ShouldStartStrykerWithConfigFileOptions()
104109
var runResults = new StrykerRunResult(options, 0.3);
105110

106111
var mock = new Mock<IStrykerRunner>(MockBehavior.Strict);
107-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
108-
.Callback<IStrykerInputs, ILoggerFactory, IProjectOrchestrator>((c, l, p) => actualInputs = c)
112+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
113+
.Callback<IStrykerInputs>(c => actualInputs = c)
109114
.Returns(runResults)
110115
.Verifiable();
111116

112-
var target = new StrykerCli(mock.Object);
117+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
113118

114119
target.Run(new string[] { "-f", "filled-stryker-config.yaml" });
115120

src/Stryker.CLI/Stryker.CLI.UnitTest/StrykerCLIInitCommandTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class StrykerCLIInitCommandTests
2626

2727
public StrykerCLIInitCommandTests()
2828
{
29-
_target = new StrykerCli(_strykerRunnerMock.Object, null, _loggingInitializerMock.Object, _nugetClientMock.Object, _consoleMock, _fileSystemMock);
29+
_target = new StrykerCli(_strykerRunnerMock.Object, new ConfigBuilder(), _loggingInitializerMock.Object, _nugetClientMock.Object, _consoleMock, _fileSystemMock);
3030
}
3131

3232
[TestMethod]

src/Stryker.CLI/Stryker.CLI.UnitTest/StrykerCLITests.cs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.IO.Abstractions;
23
using System.Linq;
34
using System.Threading;
45
using System.Threading.Tasks;
@@ -8,6 +9,7 @@
89
using NuGet.Versioning;
910
using Serilog.Events;
1011
using Shouldly;
12+
using Spectre.Console;
1113
using Spectre.Console.Testing;
1214
using Stryker.Abstractions;
1315
using Stryker.Abstractions.Options;
@@ -35,20 +37,23 @@ public StrykerCLITests()
3537
{
3638
_options = new StrykerOptions() { Thresholds = new Thresholds { Break = 0 } };
3739
_runResults = new StrykerRunResult(_options, 0.3);
38-
_strykerRunnerMock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
39-
.Callback<IStrykerInputs, ILoggerFactory, IProjectOrchestrator>((c, l, p) => _inputs = c)
40+
_strykerRunnerMock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
41+
.Callback<IStrykerInputs>(c => _inputs = c)
4042
.Returns(_runResults)
4143
.Verifiable();
4244
_nugetClientMock.Setup(x => x.GetLatestVersionAsync()).Returns(Task.FromResult(new SemanticVersion(10, 0, 0)));
43-
_target = new StrykerCli(_strykerRunnerMock.Object, null, _loggingInitializerMock.Object, _nugetClientMock.Object);
45+
var configBuilder = new ConfigBuilder();
46+
var consoleMock = new Mock<IAnsiConsole>();
47+
var fileSystemMock = new Mock<IFileSystem>();
48+
_target = new StrykerCli(_strykerRunnerMock.Object, configBuilder, _loggingInitializerMock.Object, _nugetClientMock.Object, consoleMock.Object, fileSystemMock.Object);
4449
}
4550

4651
[TestMethod]
4752
public void ShouldDisplayInfoOnHelp()
4853
{
4954
var mock = new Mock<IStrykerRunner>(MockBehavior.Strict);
5055
var console = new TestConsole().EmitAnsiSequences().Width(160);
51-
var target = new StrykerCli(mock.Object, console:console);
56+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), console, Mock.Of<IFileSystem>());
5257

5358
target.Run(new string[] { "--help" });
5459

@@ -68,12 +73,12 @@ public void ShouldDisplayLogo()
6873
var strykerRunnerMock = new Mock<IStrykerRunner>(MockBehavior.Strict);
6974
var strykerRunResult = new StrykerRunResult(_options, 0.3);
7075

71-
strykerRunnerMock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
76+
strykerRunnerMock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
7277
.Returns(strykerRunResult)
7378
.Verifiable();
7479

7580
var console = new TestConsole().EmitAnsiSequences().Width(160);
76-
var target = new StrykerCli(strykerRunnerMock.Object, null, _loggingInitializerMock.Object, _nugetClientMock.Object, console);
81+
var target = new StrykerCli(strykerRunnerMock.Object, new ConfigBuilder(), _loggingInitializerMock.Object, _nugetClientMock.Object, console, Mock.Of<IFileSystem>());
7782

7883
target.Run(Array.Empty<string>());
7984

@@ -121,12 +126,11 @@ public void OnMutationScoreBelowThresholdBreak_ShouldReturn_ExitCodeBreakThresho
121126
};
122127
var strykerRunResult = new StrykerRunResult(options, 0.3);
123128

124-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
125-
.Callback<IStrykerInputs, ILoggerFactory, IProjectOrchestrator>((c, l, p) => Utilities.Logging.ApplicationLogging.LoggerFactory = l)
129+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
126130
.Returns(strykerRunResult)
127131
.Verifiable();
128132

129-
var target = new StrykerCli(mock.Object);
133+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
130134
var result = target.Run(new string[] { });
131135

132136
mock.Verify();
@@ -146,11 +150,11 @@ public void OnMutationScoreEqualToNullAndThresholdBreakEqualTo0_ShouldReturnExit
146150
}
147151
};
148152
var strykerRunResult = new StrykerRunResult(options, double.NaN);
149-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
153+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
150154
.Returns(strykerRunResult)
151155
.Verifiable();
152156

153-
var target = new StrykerCli(mock.Object);
157+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
154158
var result = target.Run(new string[] { });
155159

156160
mock.Verify();
@@ -170,11 +174,11 @@ public void OnMutationScoreEqualToNullAndThresholdBreakAbove0_ShouldReturnExitCo
170174
}
171175
};
172176
var strykerRunResult = new StrykerRunResult(options, double.NaN);
173-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
177+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
174178
.Returns(strykerRunResult)
175179
.Verifiable();
176180

177-
var target = new StrykerCli(mock.Object, null, _loggingInitializerMock.Object, _nugetClientMock.Object);
181+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), _loggingInitializerMock.Object, _nugetClientMock.Object, Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
178182
var result = target.Run(new string[] { });
179183

180184
mock.Verify();
@@ -195,9 +199,9 @@ public void OnMutationScoreAboveThresholdBreak_ShouldReturnExitCode0()
195199
};
196200
var strykerRunResult = new StrykerRunResult(options, 0.1);
197201

198-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>())).Returns(strykerRunResult).Verifiable();
202+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>())).Returns(strykerRunResult).Verifiable();
199203

200-
var target = new StrykerCli(mock.Object);
204+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
201205
var result = target.Run(new string[] { });
202206

203207
mock.Verify();
@@ -212,7 +216,7 @@ public void OnMutationScoreAboveThresholdBreak_ShouldReturnExitCode0()
212216
public void ShouldNotStartStryker_WithHelpArgument(string argName)
213217
{
214218
var mock = new Mock<IStrykerRunner>(MockBehavior.Strict);
215-
var target = new StrykerCli(mock.Object);
219+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), Mock.Of<ILoggingInitializer>(), Mock.Of<IStrykerNugetFeedClient>(), Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
216220

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

@@ -223,11 +227,11 @@ public void ShouldNotStartStryker_WithHelpArgument(string argName)
223227
public void ShouldThrow_OnException()
224228
{
225229
var mock = new Mock<IStrykerRunner>(MockBehavior.Strict);
226-
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>(), It.IsAny<ILoggerFactory>(), It.IsAny<IProjectOrchestrator>()))
230+
mock.Setup(x => x.RunMutationTest(It.IsAny<IStrykerInputs>()))
227231
.Throws(new Exception("Initial testrun failed"))
228232
.Verifiable();
229233

230-
var target = new StrykerCli(mock.Object, null, _loggingInitializerMock.Object, _nugetClientMock.Object);
234+
var target = new StrykerCli(mock.Object, new ConfigBuilder(), _loggingInitializerMock.Object, _nugetClientMock.Object, Mock.Of<IAnsiConsole>(), Mock.Of<IFileSystem>());
231235
Should.Throw<Exception>(() => target.Run(new string[] { }));
232236
}
233237

src/Stryker.CLI/Stryker.CLI.UnitTest/packages.lock.json

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,6 @@
214214
"Microsoft.Extensions.Configuration.Abstractions": "6.0.0"
215215
}
216216
},
217-
"Microsoft.Extensions.DependencyInjection": {
218-
"type": "Transitive",
219-
"resolved": "10.0.0",
220-
"contentHash": "f0RBabswJq+gRu5a+hWIobrLWiUYPKMhCD9WO3sYBAdSy3FFH14LMvLVFZc2kPSCimBLxSuitUhsd6tb0TAY6A==",
221-
"dependencies": {
222-
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
223-
}
224-
},
225217
"Microsoft.Extensions.DependencyInjection.Abstractions": {
226218
"type": "Transitive",
227219
"resolved": "10.0.0",
@@ -850,6 +842,7 @@
850842
"type": "Project",
851843
"dependencies": {
852844
"McMaster.Extensions.CommandLineUtils": "[4.1.1, )",
845+
"Microsoft.Extensions.DependencyInjection": "[10.0.0, )",
853846
"NuGet.Protocol": "[7.0.1, )",
854847
"YamlDotNet": "[16.3.0, )",
855848
"stryker": "[4.8.1, )"
@@ -865,6 +858,7 @@
865858
"LibGit2Sharp": "[0.31.0, )",
866859
"Microsoft.CodeAnalysis.CSharp": "[4.14.0, )",
867860
"Microsoft.CodeAnalysis.Common": "[4.14.0, )",
861+
"Microsoft.Extensions.DependencyInjection": "[10.0.0, )",
868862
"Microsoft.Extensions.Logging": "[10.0.0, )",
869863
"Microsoft.TestPlatform": "[18.0.1, )",
870864
"Microsoft.TestPlatform.ObjectModel": "[18.0.1, )",
@@ -1048,6 +1042,15 @@
10481042
"Microsoft.CodeAnalysis.Common": "[4.0.0]"
10491043
}
10501044
},
1045+
"Microsoft.Extensions.DependencyInjection": {
1046+
"type": "CentralTransitive",
1047+
"requested": "[10.0.0, )",
1048+
"resolved": "10.0.0",
1049+
"contentHash": "f0RBabswJq+gRu5a+hWIobrLWiUYPKMhCD9WO3sYBAdSy3FFH14LMvLVFZc2kPSCimBLxSuitUhsd6tb0TAY6A==",
1050+
"dependencies": {
1051+
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
1052+
}
1053+
},
10511054
"Microsoft.Extensions.Logging": {
10521055
"type": "CentralTransitive",
10531056
"requested": "[10.0.0, )",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.IO.Abstractions;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Spectre.Console;
4+
using Stryker.CLI.Clients;
5+
using Stryker.CLI.Logging;
6+
using Stryker.Configuration;
7+
8+
namespace Stryker.CLI;
9+
10+
public static class ServiceCollectionExtensions
11+
{
12+
public static IServiceCollection AddStrykerCli(this IServiceCollection services)
13+
{
14+
// CLI services
15+
services.AddTransient<StrykerCli>();
16+
services.AddSingleton<IConfigBuilder, ConfigBuilder>();
17+
services.AddSingleton<ILoggingInitializer, LoggingInitializer>();
18+
services.AddSingleton<IStrykerNugetFeedClient, StrykerNugetFeedClient>();
19+
services.AddSingleton<IAnsiConsole>(AnsiConsole.Console);
20+
services.AddSingleton<IFileSystem, FileSystem>();
21+
22+
return services;
23+
}
24+
}

src/Stryker.CLI/Stryker.CLI/Logging/ApplicationLogging.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public static void ConfigureLogger(LogEventLevel logLevel, bool logToFile, bool
2222
LoggerFactory.AddFile(Path.Combine(outputPath, "logs", "log-{Date}.txt"), traceToFile ? MSLogLevel.Trace : MSLogLevel.Debug);
2323
}
2424

25+
// Set the Utilities ApplicationLogging factory to the same instance
26+
// This ensures that code in Stryker.Options and other projects can access the configured logger
27+
Stryker.Utilities.Logging.ApplicationLogging.LoggerFactory = LoggerFactory;
28+
2529
// When stryker log level is debug or trace, set LibGit2Sharp loglevel
2630
if (logLevel >= LogEventLevel.Information) return; // LibGit2Sharp does not handle LogEventLevel.None properly.
2731

src/Stryker.CLI/Stryker.CLI/Program.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Logging;
13
using Spectre.Console;
24
using Stryker.Abstractions.Exceptions;
5+
using Stryker.CLI.Logging;
36
using Stryker.Configuration;
7+
using Stryker.Core.Infrastructure;
48

59
namespace Stryker.CLI;
610

@@ -10,7 +14,14 @@ public static int Main(string[] args)
1014
{
1115
try
1216
{
13-
var app = new StrykerCli();
17+
// Build DI container
18+
var services = new ServiceCollection()
19+
.AddLogging()
20+
.AddStrykerCore()
21+
.AddStrykerCli()
22+
.BuildServiceProvider();
23+
24+
var app = services.GetRequiredService<StrykerCli>();
1425
return app.Run(args);
1526
}
1627
catch (NoTestProjectsException exception)

0 commit comments

Comments
 (0)