Skip to content

Commit 14afa88

Browse files
committed
Refactor tests for all actuators
1 parent 2b59561 commit 14afa88

File tree

4 files changed

+154
-76
lines changed

4 files changed

+154
-76
lines changed

src/Management/test/Endpoint.Test/ActuatorRouteBuilderExtensionsTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ private static HostBuilder GetHostBuilder(Action<AuthorizationPolicyBuilder> pol
7070
{
7171
var appSettings = new Dictionary<string, string?>
7272
{
73-
["management:endpoints:actuator:exposure:include:0"] = "*"
73+
["Management:Endpoints:Actuator:Exposure:Include:0"] = "*"
7474
};
7575

7676
HostBuilder hostBuilder = TestHostBuilderFactory.CreateWeb();
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using Microsoft.AspNetCore.Cors.Infrastructure;
6+
using Microsoft.AspNetCore.Hosting;
7+
using Microsoft.Extensions.Configuration;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using Microsoft.Extensions.Options;
10+
using Steeltoe.Common.TestResources;
11+
using Steeltoe.Management.Endpoint.Actuators.All;
12+
using Steeltoe.Management.Endpoint.Actuators.CloudFoundry;
13+
using Steeltoe.Management.Endpoint.Actuators.DbMigrations;
14+
using Steeltoe.Management.Endpoint.Actuators.Environment;
15+
using Steeltoe.Management.Endpoint.Actuators.Health;
16+
using Steeltoe.Management.Endpoint.Actuators.Health.Availability;
17+
using Steeltoe.Management.Endpoint.Actuators.HeapDump;
18+
using Steeltoe.Management.Endpoint.Actuators.HttpExchanges;
19+
using Steeltoe.Management.Endpoint.Actuators.Hypermedia;
20+
using Steeltoe.Management.Endpoint.Actuators.Info;
21+
using Steeltoe.Management.Endpoint.Actuators.Loggers;
22+
using Steeltoe.Management.Endpoint.Actuators.Refresh;
23+
using Steeltoe.Management.Endpoint.Actuators.RouteMappings;
24+
using Steeltoe.Management.Endpoint.Actuators.Services;
25+
using Steeltoe.Management.Endpoint.Actuators.ThreadDump;
26+
using Steeltoe.Management.Endpoint.Configuration;
27+
using Steeltoe.Management.Endpoint.ManagementPort;
28+
using Steeltoe.Management.Endpoint.Middleware;
29+
30+
namespace Steeltoe.Management.Endpoint.Test.Actuators.All;
31+
32+
public sealed class AllActuatorsTest
33+
{
34+
[Theory]
35+
[InlineData(false)]
36+
[InlineData(true)]
37+
public async Task Registers_dependent_services(bool platformIsCloudFoundry)
38+
{
39+
using IDisposable? scope = platformIsCloudFoundry ? new EnvironmentVariableScope("VCAP_APPLICATION", "{}") : null;
40+
41+
var services = new ServiceCollection();
42+
services.AddSingleton<IConfiguration>(new ConfigurationBuilder().Build());
43+
services.AddSingleton<IWebHostEnvironment, FakeWebHostEnvironment>();
44+
services.AddAllActuators();
45+
await using ServiceProvider serviceProvider = services.BuildServiceProvider(true);
46+
47+
List<Type> middlewareTypes =
48+
[
49+
typeof(HypermediaEndpointMiddleware),
50+
typeof(ThreadDumpEndpointMiddleware),
51+
typeof(HeapDumpEndpointMiddleware),
52+
typeof(DbMigrationsEndpointMiddleware),
53+
typeof(EnvironmentEndpointMiddleware),
54+
typeof(InfoEndpointMiddleware),
55+
typeof(HealthEndpointMiddleware),
56+
typeof(LoggersEndpointMiddleware),
57+
typeof(HttpExchangesEndpointMiddleware),
58+
typeof(RouteMappingsEndpointMiddleware),
59+
typeof(RefreshEndpointMiddleware),
60+
typeof(ServicesEndpointMiddleware)
61+
];
62+
63+
foreach (Type middlewareType in middlewareTypes)
64+
{
65+
// ReSharper disable once AccessToDisposedClosure
66+
Func<object> action = () => serviceProvider.GetRequiredService(middlewareType);
67+
action.Should().NotThrow();
68+
}
69+
70+
if (platformIsCloudFoundry)
71+
{
72+
Action action = () =>
73+
{
74+
// ReSharper disable AccessToDisposedClosure
75+
_ = serviceProvider.GetRequiredService<CloudFoundryEndpointMiddleware>();
76+
_ = serviceProvider.GetRequiredService<PermissionsProvider>();
77+
// ReSharper restore AccessToDisposedClosure
78+
};
79+
80+
action.Should().NotThrow();
81+
}
82+
else
83+
{
84+
var middleware = serviceProvider.GetService<CloudFoundryEndpointMiddleware>();
85+
middleware.Should().BeNull();
86+
87+
var provider = serviceProvider.GetService<PermissionsProvider>();
88+
provider.Should().BeNull();
89+
}
90+
}
91+
92+
[Theory]
93+
[InlineData(HostBuilderType.Host, false)]
94+
[InlineData(HostBuilderType.Host, true)]
95+
[InlineData(HostBuilderType.WebHost, false)]
96+
[InlineData(HostBuilderType.WebHost, true)]
97+
[InlineData(HostBuilderType.WebApplication, false)]
98+
[InlineData(HostBuilderType.WebApplication, true)]
99+
public async Task Does_not_register_duplicate_services(HostBuilderType hostBuilderType, bool platformIsCloudFoundry)
100+
{
101+
using IDisposable? scope = platformIsCloudFoundry ? new EnvironmentVariableScope("VCAP_APPLICATION", "{}") : null;
102+
int actuatorCount = platformIsCloudFoundry ? 13 : 12;
103+
104+
await using HostWrapper host = hostBuilderType.Build(builder =>
105+
{
106+
builder.ConfigureServices(services =>
107+
{
108+
services.AddAllActuators();
109+
services.AddAllActuators();
110+
});
111+
});
112+
113+
host.Services.GetServices<ActuatorEndpointMapper>().Should().ContainSingle();
114+
host.Services.GetServices<IConfigureOptions<CorsOptions>>().OfType<ConfigureActuatorsCorsPolicyOptions>().Should().ContainSingle();
115+
host.Services.GetServices<IConfigureOptions<ManagementOptions>>().Should().ContainSingle();
116+
host.Services.GetServices<IOptionsChangeTokenSource<ManagementOptions>>().Should().ContainSingle();
117+
118+
host.Services.GetServices<IEndpointOptionsMonitorProvider>().Should().HaveCount(actuatorCount);
119+
host.Services.GetServices<IEndpointMiddleware>().Should().HaveCount(actuatorCount);
120+
121+
IStartupFilter[] startupFilters = [.. host.Services.GetServices<IStartupFilter>()];
122+
startupFilters.Should().ContainSingle(filter => filter is ConfigureActuatorsMiddlewareStartupFilter);
123+
startupFilters.Should().ContainSingle(filter => filter is ManagementPortStartupFilter);
124+
startupFilters.Should().ContainSingle(filter => filter is AvailabilityStartupFilter);
125+
126+
host.Services.GetServices<IConfigureOptions<InfoEndpointOptions>>().Should().ContainSingle();
127+
host.Services.GetServices<IOptionsChangeTokenSource<InfoEndpointOptions>>().Should().ContainSingle();
128+
host.Services.GetServices<IEndpointOptionsMonitorProvider>().OfType<EndpointOptionsMonitorProvider<InfoEndpointOptions>>().Should().ContainSingle();
129+
host.Services.GetServices<IInfoEndpointHandler>().OfType<InfoEndpointHandler>().Should().ContainSingle();
130+
host.Services.GetServices<InfoEndpointMiddleware>().Should().ContainSingle();
131+
host.Services.GetServices<IEndpointMiddleware>().OfType<InfoEndpointMiddleware>().Should().ContainSingle();
132+
}
133+
}

src/Management/test/Endpoint.Test/ActuatorsHostBuilderTest.cs

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,17 @@
44

55
using System.Net;
66
using System.Net.Http.Headers;
7-
using Microsoft.AspNetCore.Cors.Infrastructure;
8-
using Microsoft.AspNetCore.Hosting;
9-
using Microsoft.Extensions.Configuration;
107
using Microsoft.Extensions.DependencyInjection;
11-
using Microsoft.Extensions.Options;
128
using RichardSzalay.MockHttp;
139
using Steeltoe.Common.Http.HttpClientPooling;
1410
using Steeltoe.Common.TestResources;
1511
using Steeltoe.Configuration.CloudFoundry;
16-
using Steeltoe.Management.Endpoint.Actuators.All;
1712
using Steeltoe.Management.Endpoint.Actuators.CloudFoundry;
18-
using Steeltoe.Management.Endpoint.Actuators.Health.Availability;
19-
using Steeltoe.Management.Endpoint.Actuators.Info;
20-
using Steeltoe.Management.Endpoint.Configuration;
21-
using Steeltoe.Management.Endpoint.ManagementPort;
22-
using Steeltoe.Management.Endpoint.Middleware;
2313

2414
namespace Steeltoe.Management.Endpoint.Test;
2515

2616
public sealed class ActuatorsHostBuilderTest
2717
{
28-
private static readonly Dictionary<string, string?> AppSettings = new()
29-
{
30-
["Management:Endpoints:Actuator:Exposure:Include:0"] = "*"
31-
};
32-
3318
[Theory]
3419
[InlineData(HostBuilderType.Host)]
3520
[InlineData(HostBuilderType.WebHost)]
@@ -81,44 +66,4 @@ public async Task CloudFoundryActuator(HostBuilderType hostBuilderType)
8166

8267
handler.Mock.VerifyNoOutstandingExpectation();
8368
}
84-
85-
[Theory]
86-
[InlineData(HostBuilderType.Host)]
87-
[InlineData(HostBuilderType.WebHost)]
88-
[InlineData(HostBuilderType.WebApplication)]
89-
public async Task AddAllActuatorsDoesNotRegisterDuplicateServices(HostBuilderType hostBuilderType)
90-
{
91-
const int actuatorCount = 12;
92-
93-
await using HostWrapper host = hostBuilderType.Build(builder =>
94-
{
95-
builder.ConfigureAppConfiguration(configurationBuilder => configurationBuilder.AddInMemoryCollection(AppSettings));
96-
97-
builder.ConfigureServices(services =>
98-
{
99-
services.AddAllActuators();
100-
services.AddAllActuators();
101-
});
102-
});
103-
104-
host.Services.GetServices<ActuatorEndpointMapper>().Should().ContainSingle();
105-
host.Services.GetServices<IConfigureOptions<CorsOptions>>().OfType<ConfigureActuatorsCorsPolicyOptions>().Should().ContainSingle();
106-
host.Services.GetServices<IConfigureOptions<ManagementOptions>>().Should().ContainSingle();
107-
host.Services.GetServices<IOptionsChangeTokenSource<ManagementOptions>>().Should().ContainSingle();
108-
109-
host.Services.GetServices<IEndpointOptionsMonitorProvider>().Should().HaveCount(actuatorCount);
110-
host.Services.GetServices<IEndpointMiddleware>().Should().HaveCount(actuatorCount);
111-
112-
IStartupFilter[] startupFilters = [.. host.Services.GetServices<IStartupFilter>()];
113-
startupFilters.Should().ContainSingle(filter => filter is ConfigureActuatorsMiddlewareStartupFilter);
114-
startupFilters.Should().ContainSingle(filter => filter is ManagementPortStartupFilter);
115-
startupFilters.Should().ContainSingle(filter => filter is AvailabilityStartupFilter);
116-
117-
host.Services.GetServices<IConfigureOptions<InfoEndpointOptions>>().Should().ContainSingle();
118-
host.Services.GetServices<IOptionsChangeTokenSource<InfoEndpointOptions>>().Should().ContainSingle();
119-
host.Services.GetServices<IEndpointOptionsMonitorProvider>().OfType<EndpointOptionsMonitorProvider<InfoEndpointOptions>>().Should().ContainSingle();
120-
host.Services.GetServices<IInfoEndpointHandler>().OfType<InfoEndpointHandler>().Should().ContainSingle();
121-
host.Services.GetServices<InfoEndpointMiddleware>().Should().ContainSingle();
122-
host.Services.GetServices<IEndpointMiddleware>().OfType<InfoEndpointMiddleware>().Should().ContainSingle();
123-
}
12469
}

src/Management/test/Endpoint.Test/ManagementPort/ManagementEndpointServedOnDifferentPortTest.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public async Task AspNetDefaultPort_SameManagementPortConfigured_OnlyActuatorAcc
4646
{
4747
var appSettings = new Dictionary<string, string?>
4848
{
49-
["management:endpoints:port"] = AspNetDefaultPort
49+
["Management:Endpoints:Port"] = AspNetDefaultPort
5050
};
5151

5252
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -75,7 +75,7 @@ public async Task AspNetDefaultPort_AlternateManagementPortConfigured_Accessible
7575

7676
var appSettings = new Dictionary<string, string?>
7777
{
78-
["management:endpoints:port"] = managementPort
78+
["Management:Endpoints:Port"] = managementPort
7979
};
8080

8181
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -125,7 +125,7 @@ public async Task AspNetDefaultPort_AlternateManagementPortConfigured_Accessible
125125
{
126126
// The test listens on the proxy ports in lieu of Cloud Foundry's proxy infrastructure
127127
["urls"] = $"http://*:{externalTlsProxyPort};http://*:{internalTlsProxyPort}",
128-
["management:endpoints:port"] = managementPort
128+
["Management:Endpoints:Port"] = managementPort
129129
};
130130

131131
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -152,8 +152,8 @@ public async Task AspNetDefaultPort_AlternateManagementPortAndSchemeConfigured_A
152152

153153
var appSettings = new Dictionary<string, string?>
154154
{
155-
["management:endpoints:port"] = managementPort,
156-
["management:endpoints:sslEnabled"] = "true"
155+
["Management:Endpoints:Port"] = managementPort,
156+
["Management:Endpoints:SslEnabled"] = "true"
157157
};
158158

159159
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -230,7 +230,7 @@ public async Task AspNetCustomPortsConfigured_SameManagementPortConfigured_OnlyA
230230
var appSettings = new Dictionary<string, string?>
231231
{
232232
["urls"] = $"http://localhost:{appHttpPort};https://*:{appHttpsPort}",
233-
["management:endpoints:port"] = appHttpPort
233+
["Management:Endpoints:Port"] = appHttpPort
234234
};
235235

236236
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -270,7 +270,7 @@ public async Task AspNetCustomPortsConfigured_AlternateManagementPortConfigured_
270270
var appSettings = new Dictionary<string, string?>
271271
{
272272
["urls"] = $"http://localhost:{appHttpPort};https://*:{appHttpsPort}",
273-
["management:endpoints:port"] = managementPort
273+
["Management:Endpoints:Port"] = managementPort
274274
};
275275

276276
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -317,8 +317,8 @@ public async Task AspNetCustomPortsConfigured_AlternateHttpsManagementPortConfig
317317
var appSettings = new Dictionary<string, string?>
318318
{
319319
["urls"] = $"http://localhost:{appHttpPort};https://*:{appHttpsPort}",
320-
["management:endpoints:port"] = managementPort,
321-
["management:endpoints:sslEnabled"] = "true"
320+
["Management:Endpoints:Port"] = managementPort,
321+
["Management:Endpoints:SslEnabled"] = "true"
322322
};
323323

324324
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -402,7 +402,7 @@ public async Task AspNetCustomPortsInEnvironmentVariables_SameManagementPortConf
402402

403403
var appSettings = new Dictionary<string, string?>
404404
{
405-
["management:endpoints:port"] = appHttpPort
405+
["Management:Endpoints:Port"] = appHttpPort
406406
};
407407

408408
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -444,7 +444,7 @@ public async Task AspNetCustomPortsInEnvironmentVariables_AlternateManagementPor
444444

445445
var appSettings = new Dictionary<string, string?>
446446
{
447-
["management:endpoints:port"] = managementPort
447+
["Management:Endpoints:Port"] = managementPort
448448
};
449449

450450
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -493,8 +493,8 @@ public async Task AspNetCustomPortsInEnvironmentVariables_AlternateHttpsManageme
493493

494494
var appSettings = new Dictionary<string, string?>
495495
{
496-
["management:endpoints:port"] = managementPort,
497-
["management:endpoints:sslEnabled"] = "true"
496+
["Management:Endpoints:Port"] = managementPort,
497+
["Management:Endpoints:SslEnabled"] = "true"
498498
};
499499

500500
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -576,7 +576,7 @@ public async Task AspNetCustomPortsInCode_SameManagementPortConfigured_OnlyActua
576576

577577
var appSettings = new Dictionary<string, string?>
578578
{
579-
["management:endpoints:port"] = appHttpPort
579+
["Management:Endpoints:Port"] = appHttpPort
580580
};
581581

582582
await using WebApplication app = await CreateAppAsync(appSettings, app =>
@@ -619,7 +619,7 @@ public async Task AspNetCustomPortsInCode_AlternateManagementPortConfigured_Acce
619619

620620
var appSettings = new Dictionary<string, string?>
621621
{
622-
["management:endpoints:port"] = managementPort
622+
["Management:Endpoints:Port"] = managementPort
623623
};
624624

625625
await using WebApplication app = await CreateAppAsync(appSettings, app =>
@@ -669,8 +669,8 @@ public async Task AspNetCustomPortsInCode_AlternateHttpsManagementPortConfigured
669669

670670
var appSettings = new Dictionary<string, string?>
671671
{
672-
["management:endpoints:port"] = managementPort,
673-
["management:endpoints:sslEnabled"] = "true"
672+
["Management:Endpoints:Port"] = managementPort,
673+
["Management:Endpoints:SslEnabled"] = "true"
674674
};
675675

676676
await using WebApplication app = await CreateAppAsync(appSettings, app =>
@@ -758,7 +758,7 @@ public async Task AspNetDynamicPortsConfigured_AlternateManagementPortConfigured
758758
var appSettings = new Dictionary<string, string?>
759759
{
760760
["urls"] = "http://127.0.0.1:0;https://*:0",
761-
["management:endpoints:port"] = managementPort
761+
["Management:Endpoints:Port"] = managementPort
762762
};
763763

764764
await using WebApplication app = await CreateAppAsync(appSettings);
@@ -807,8 +807,8 @@ public async Task AspNetDynamicPortsConfigured_AlternateHttpsManagementPortConfi
807807
var appSettings = new Dictionary<string, string?>
808808
{
809809
["urls"] = "http://127.0.0.1:0;https://*:0",
810-
["management:endpoints:port"] = managementPort,
811-
["management:endpoints:sslEnabled"] = "true"
810+
["Management:Endpoints:Port"] = managementPort,
811+
["Management:Endpoints:SslEnabled"] = "true"
812812
};
813813

814814
await using WebApplication app = await CreateAppAsync(appSettings);

0 commit comments

Comments
 (0)