1
+ // //-----------------------------------------------------------------------
2
+ // // <copyright file="BugFix.cs" company="Akka.NET Project">
3
+ // // Copyright (C) 2009-2022 Lightbend Inc. <http://www.lightbend.com>
4
+ // // Copyright (C) 2013-2022 .NET Foundation <https://github.com/akkadotnet/akka.net>
5
+ // // </copyright>
6
+ // //-----------------------------------------------------------------------
7
+
8
+ using System ;
9
+ using System . Threading ;
10
+ using System . Threading . Tasks ;
11
+ using Akka . Actor ;
12
+ using Akka . Event ;
13
+ using Akka . TestKit ;
14
+ using Microsoft . Extensions . DependencyInjection ;
15
+ using Microsoft . Extensions . Hosting ;
16
+ using Xunit ;
17
+ using Xunit . Abstractions ;
18
+ using FluentAssertions ;
19
+ using static FluentAssertions . FluentActions ;
20
+
21
+ namespace Akka . DependencyInjection . Tests
22
+ {
23
+ public class BugFixSpec : AkkaSpec , IAsyncLifetime
24
+ {
25
+ private readonly IServiceProvider _serviceProvider ;
26
+ private readonly AkkaService _akkaService ;
27
+
28
+ public BugFixSpec ( ITestOutputHelper output ) : base ( output )
29
+ {
30
+ var services = new ServiceCollection ( )
31
+ . AddSingleton < AkkaService > ( )
32
+ . AddHostedService < AkkaService > ( ) ;
33
+
34
+ _serviceProvider = services . BuildServiceProvider ( ) ;
35
+ _akkaService = _serviceProvider . GetRequiredService < AkkaService > ( ) ;
36
+ }
37
+
38
+ [ Fact ( DisplayName = "DI should log an error if DI provider does not contain required parameter" ) ]
39
+ public void ShouldLogAnErrorIfParameterInjectionFailed ( )
40
+ {
41
+ var system = _serviceProvider . GetRequiredService < AkkaService > ( ) . ActorSystem ;
42
+ var probe = CreateTestProbe ( system ) ;
43
+ system . EventStream . Subscribe ( probe , typeof ( Error ) ) ;
44
+
45
+ var props = DependencyResolver . For ( system ) . Props < TestDiActor > ( ) ;
46
+ var actor = system . ActorOf ( props . WithDeploy ( Deploy . Local ) , "testDIActor" ) ;
47
+
48
+ probe . ExpectMsg < Error > ( ) . Cause . Should ( ) . BeOfType < ActorInitializationException > ( ) ;
49
+ }
50
+
51
+ internal class TestDiActor : ReceiveActor
52
+ {
53
+ public TestDiActor ( NotInServices doesNotExistInDi )
54
+ {
55
+ }
56
+ }
57
+
58
+ internal class NotInServices
59
+ {
60
+ }
61
+
62
+
63
+ public async Task InitializeAsync ( )
64
+ {
65
+ await _akkaService . StartAsync ( default ) ;
66
+ InitializeLogger ( _akkaService . ActorSystem ) ;
67
+ }
68
+
69
+ public async Task DisposeAsync ( )
70
+ {
71
+ var sys = _serviceProvider . GetRequiredService < AkkaService > ( ) . ActorSystem ;
72
+ await sys . Terminate ( ) ;
73
+ }
74
+
75
+ internal class AkkaService : IHostedService
76
+ {
77
+ public ActorSystem ActorSystem { get ; private set ; }
78
+
79
+ private readonly IServiceProvider _serviceProvider ;
80
+
81
+ public AkkaService ( IServiceProvider serviceProvider )
82
+ {
83
+ _serviceProvider = serviceProvider ;
84
+ }
85
+
86
+ public Task StartAsync ( CancellationToken cancellationToken )
87
+ {
88
+ var setup = DependencyResolverSetup . Create ( _serviceProvider )
89
+ . And ( BootstrapSetup . Create ( ) . WithConfig ( TestKitBase . DefaultConfig ) ) ;
90
+
91
+ ActorSystem = ActorSystem . Create ( "TestSystem" , setup ) ;
92
+ return Task . CompletedTask ;
93
+ }
94
+
95
+ public async Task StopAsync ( CancellationToken cancellationToken )
96
+ {
97
+ await ActorSystem . Terminate ( ) ;
98
+ }
99
+ }
100
+ }
101
+ }
0 commit comments