From ab45eccc669572a705c2fe00747c7bf26c13a0ee Mon Sep 17 00:00:00 2001
From: Bart Koelman <104792814+bart-vmware@users.noreply.github.com>
Date: Thu, 21 Aug 2025 23:15:38 +0200
Subject: [PATCH 1/4] Install .NET 10 in GHA workflows
---
.github/workflows/Steeltoe.All.yml | 12 ++++++++++++
.github/workflows/component-shared-workflow.yml | 13 +++++++++++++
.github/workflows/package.yml | 6 ++++++
.github/workflows/scan-vulnerable-dependencies.yml | 6 ++++++
.github/workflows/sonarcube.yml | 12 ++++++++++++
.github/workflows/verify-code-style.yml | 6 ++++++
6 files changed, 55 insertions(+)
diff --git a/.github/workflows/Steeltoe.All.yml b/.github/workflows/Steeltoe.All.yml
index a7567b0dc5..a6eb38507d 100644
--- a/.github/workflows/Steeltoe.All.yml
+++ b/.github/workflows/Steeltoe.All.yml
@@ -65,6 +65,12 @@ jobs:
8.0.*
9.0.*
+ - name: Setup .NET 10 (preview)
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.*
+ dotnet-quality: preview
+
- name: Turn off dev certificate (macOS only)
if: ${{ matrix.os == 'macos-latest' }}
# Setting DOTNET_GENERATE_ASPNET_CERTIFICATE to "false" makes it easier to determine which test failed on macOS when it tried to start a web server with https enabled.
@@ -106,6 +112,12 @@ jobs:
- name: Test (net9.0) (memory dumps)
run: dotnet test ${{ env.SOLUTION_FILE }} --framework net9.0 --filter "${{ env.SKIP_FILTER_WITH_MEMORY_DUMPS }}" ${{ env.COMMON_TEST_ARGS }}
+ - name: Test (net10.0)
+ run: dotnet test ${{ env.SOLUTION_FILE }} --framework net10.0 --filter "${{ env.SKIP_FILTER_NO_MEMORY_DUMPS }}" ${{ env.COMMON_TEST_ARGS }}
+
+ - name: Test (net10.0) (memory dumps)
+ run: dotnet test ${{ env.SOLUTION_FILE }} --framework net10.0 --filter "${{ env.SKIP_FILTER_WITH_MEMORY_DUMPS }}" ${{ env.COMMON_TEST_ARGS }}
+
- name: Upload crash/hang dumps (on failure)
if: ${{ failure() }}
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/component-shared-workflow.yml b/.github/workflows/component-shared-workflow.yml
index 17ca300bc0..c386c7c00f 100644
--- a/.github/workflows/component-shared-workflow.yml
+++ b/.github/workflows/component-shared-workflow.yml
@@ -62,6 +62,12 @@ jobs:
8.0.*
9.0.*
+ - name: Setup .NET 10 (preview)
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.*
+ dotnet-quality: preview
+
- name: Turn off dev certificate (macOS only)
if: ${{ inputs.OS == 'macos' }}
# Setting DOTNET_GENERATE_ASPNET_CERTIFICATE to "false" makes it easier to determine which test failed on macOS when it tried to start a web server with https enabled.
@@ -99,6 +105,13 @@ jobs:
if: ${{ inputs.component == 'Management' }}
run: dotnet test ${{ env.SOLUTION_FILE }} --framework net9.0 ${{ env.SKIP_FILTER_WITH_MEMORY_DUMPS }} ${{ env.COMMON_TEST_ARGS }}
+ - name: Test (net10.0)
+ run: dotnet test ${{ env.SOLUTION_FILE }} --framework net10.0 ${{ env.SKIP_FILTER_NO_MEMORY_DUMPS }} ${{ env.COMMON_TEST_ARGS }}
+
+ - name: Test (net10.0) (memory dumps)
+ if: ${{ inputs.component == 'Management' }}
+ run: dotnet test ${{ env.SOLUTION_FILE }} --framework net10.0 ${{ env.SKIP_FILTER_WITH_MEMORY_DUMPS }} ${{ env.COMMON_TEST_ARGS }}
+
- name: Upload crash/hang dumps (on failure)
if: ${{ failure() }}
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml
index 186049309f..75cd0710c9 100644
--- a/.github/workflows/package.yml
+++ b/.github/workflows/package.yml
@@ -38,6 +38,12 @@ jobs:
8.0.*
9.0.*
+ - name: Setup .NET 10 (preview)
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.*
+ dotnet-quality: preview
+
- name: Git checkout
uses: actions/checkout@v4
with:
diff --git a/.github/workflows/scan-vulnerable-dependencies.yml b/.github/workflows/scan-vulnerable-dependencies.yml
index aab25e06a7..e38055a056 100644
--- a/.github/workflows/scan-vulnerable-dependencies.yml
+++ b/.github/workflows/scan-vulnerable-dependencies.yml
@@ -34,6 +34,12 @@ jobs:
8.0.*
9.0.*
+ - name: Setup .NET 10 (preview)
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.*
+ dotnet-quality: preview
+
- name: Git checkout
uses: actions/checkout@v4
with:
diff --git a/.github/workflows/sonarcube.yml b/.github/workflows/sonarcube.yml
index 34f5e0a5e7..e8668eac95 100644
--- a/.github/workflows/sonarcube.yml
+++ b/.github/workflows/sonarcube.yml
@@ -54,6 +54,12 @@ jobs:
8.0.*
9.0.*
+ - name: Setup .NET 10 (preview)
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.*
+ dotnet-quality: preview
+
- name: Install Sonar .NET Scanner
run: dotnet tool install --global dotnet-sonarscanner
@@ -90,6 +96,12 @@ jobs:
- name: Test (net9.0) (memory dumps)
run: dotnet test ${{ env.SOLUTION_FILE }} --filter "Category=MemoryDumps" --framework net9.0 ${{ env.SONAR_TEST_ARGS }}
+ - name: Test (net10.0)
+ run: dotnet test ${{ env.SOLUTION_FILE }} --filter "Category!=MemoryDumps" --framework net10.0 ${{ env.SONAR_TEST_ARGS }}
+
+ - name: Test (net10.0) (memory dumps)
+ run: dotnet test ${{ env.SOLUTION_FILE }} --filter "Category=MemoryDumps" --framework net10.0 ${{ env.SONAR_TEST_ARGS }}
+
- name: End Sonar .NET scanner
if: ${{ !cancelled() && steps.sonar_begin.outcome == 'success' }}
env:
diff --git a/.github/workflows/verify-code-style.yml b/.github/workflows/verify-code-style.yml
index 07859d8a55..e049ac423a 100644
--- a/.github/workflows/verify-code-style.yml
+++ b/.github/workflows/verify-code-style.yml
@@ -33,6 +33,12 @@ jobs:
8.0.*
9.0.*
+ - name: Setup .NET 10 (preview)
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.*
+ dotnet-quality: preview
+
- name: Git checkout
uses: actions/checkout@v4
with:
From bd069b3ba93622aa22371a9a6e426326d1432d4b Mon Sep 17 00:00:00 2001
From: Bart Koelman <104792814+bart-vmware@users.noreply.github.com>
Date: Thu, 21 Aug 2025 18:11:54 +0200
Subject: [PATCH 2/4] Add net10.0 to test projects, fix/suppress broken build
---
shared.props | 6 +++++
...oe.Bootstrap.AutoConfiguration.Test.csproj | 6 ++---
...otstrap.EmptyAutoConfiguration.Test.csproj | 2 +-
.../Steeltoe.Common.Certificates.Test.csproj | 2 +-
.../Common.Test/Steeltoe.Common.Test.csproj | 2 +-
.../Steeltoe.Common.Hosting.Test.csproj | 2 +-
.../Steeltoe.Common.Http.Test.csproj | 2 +-
.../Steeltoe.Common.Logging.Test.csproj | 2 +-
.../Net.Test/Steeltoe.Common.Net.Test.csproj | 2 +-
.../Steeltoe.Common.TestResources.csproj | 2 +-
...toe.Configuration.CloudFoundry.Test.csproj | 2 +-
...uration.ConfigServer.Discovery.Test.csproj | 2 +-
...ation.ConfigServer.Integration.Test.csproj | 2 +-
...toe.Configuration.ConfigServer.Test.csproj | 2 +-
...eltoe.Configuration.Encryption.Test.csproj | 2 +-
...ion.Kubernetes.ServiceBindings.Test.csproj | 2 +-
...ltoe.Configuration.Placeholder.Test.csproj | 2 +-
...ltoe.Configuration.RandomValue.Test.csproj | 2 +-
...eltoe.Configuration.SpringBoot.Test.csproj | 2 +-
.../Steeltoe.Connectors.Test.csproj | 8 +++----
...Connectors.EntityFrameworkCore.Test.csproj | 9 ++++----
src/Directory.Build.props | 11 +++++++++
...eeltoe.Discovery.Configuration.Test.csproj | 2 +-
.../Steeltoe.Discovery.Consul.Test.csproj | 2 +-
.../Steeltoe.Discovery.Eureka.Test.csproj | 2 +-
...Steeltoe.Discovery.HttpClients.Test.csproj | 2 +-
...teeltoe.Logging.DynamicConsole.Test.csproj | 2 +-
...teeltoe.Logging.DynamicSerilog.Test.csproj | 2 +-
.../Steeltoe.Management.Endpoint.Test.csproj | 2 +-
...Steeltoe.Management.Prometheus.Test.csproj | 2 +-
...ement.Endpoint.RazorPagesTestWebApp.csproj | 2 +-
.../Steeltoe.Management.Tasks.Test.csproj | 2 +-
.../Steeltoe.Management.Tracing.Test.csproj | 2 +-
...urity.Authentication.JwtBearer.Test.csproj | 2 +-
...y.Authentication.OpenIdConnect.Test.csproj | 2 +-
...rity.Authorization.Certificate.Test.csproj | 2 +-
....Security.DataProtection.Redis.Test.csproj | 2 +-
.../ConfigurationSchemaGenerator.Tests.csproj | 2 +-
versions.props | 23 ++++++++++++++++++-
39 files changed, 84 insertions(+), 45 deletions(-)
create mode 100644 src/Directory.Build.props
diff --git a/shared.props b/shared.props
index a6473a3318..5c1cf092e2 100644
--- a/shared.props
+++ b/shared.props
@@ -12,6 +12,12 @@
false
+
+ preview
+
+ $(NoWarn);CA1873
+
+
+ $(NoWarn);NU1608
+
+
diff --git a/src/Discovery/test/Configuration.Test/Steeltoe.Discovery.Configuration.Test.csproj b/src/Discovery/test/Configuration.Test/Steeltoe.Discovery.Configuration.Test.csproj
index a1d257dfa7..7d56666bcb 100644
--- a/src/Discovery/test/Configuration.Test/Steeltoe.Discovery.Configuration.Test.csproj
+++ b/src/Discovery/test/Configuration.Test/Steeltoe.Discovery.Configuration.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Discovery/test/Consul.Test/Steeltoe.Discovery.Consul.Test.csproj b/src/Discovery/test/Consul.Test/Steeltoe.Discovery.Consul.Test.csproj
index 0c13f5fb1c..9d04c2d612 100644
--- a/src/Discovery/test/Consul.Test/Steeltoe.Discovery.Consul.Test.csproj
+++ b/src/Discovery/test/Consul.Test/Steeltoe.Discovery.Consul.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Discovery/test/Eureka.Test/Steeltoe.Discovery.Eureka.Test.csproj b/src/Discovery/test/Eureka.Test/Steeltoe.Discovery.Eureka.Test.csproj
index f79a91c068..28d96ac0da 100644
--- a/src/Discovery/test/Eureka.Test/Steeltoe.Discovery.Eureka.Test.csproj
+++ b/src/Discovery/test/Eureka.Test/Steeltoe.Discovery.Eureka.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Discovery/test/HttpClients.Test/Steeltoe.Discovery.HttpClients.Test.csproj b/src/Discovery/test/HttpClients.Test/Steeltoe.Discovery.HttpClients.Test.csproj
index 9a42b744de..e9458c6127 100644
--- a/src/Discovery/test/HttpClients.Test/Steeltoe.Discovery.HttpClients.Test.csproj
+++ b/src/Discovery/test/HttpClients.Test/Steeltoe.Discovery.HttpClients.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Logging/test/DynamicConsole.Test/Steeltoe.Logging.DynamicConsole.Test.csproj b/src/Logging/test/DynamicConsole.Test/Steeltoe.Logging.DynamicConsole.Test.csproj
index 3a3430b390..ec171ac8c0 100644
--- a/src/Logging/test/DynamicConsole.Test/Steeltoe.Logging.DynamicConsole.Test.csproj
+++ b/src/Logging/test/DynamicConsole.Test/Steeltoe.Logging.DynamicConsole.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Logging/test/DynamicSerilog.Test/Steeltoe.Logging.DynamicSerilog.Test.csproj b/src/Logging/test/DynamicSerilog.Test/Steeltoe.Logging.DynamicSerilog.Test.csproj
index 9120fbd62a..0620235176 100644
--- a/src/Logging/test/DynamicSerilog.Test/Steeltoe.Logging.DynamicSerilog.Test.csproj
+++ b/src/Logging/test/DynamicSerilog.Test/Steeltoe.Logging.DynamicSerilog.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj b/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj
index afaade1a7f..99a87cce8c 100644
--- a/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj
+++ b/src/Management/test/Endpoint.Test/Steeltoe.Management.Endpoint.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Management/test/Prometheus.Test/Steeltoe.Management.Prometheus.Test.csproj b/src/Management/test/Prometheus.Test/Steeltoe.Management.Prometheus.Test.csproj
index 95444f1e2c..484afb7186 100644
--- a/src/Management/test/Prometheus.Test/Steeltoe.Management.Prometheus.Test.csproj
+++ b/src/Management/test/Prometheus.Test/Steeltoe.Management.Prometheus.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Management/test/RazorPagesTestWebApp/Steeltoe.Management.Endpoint.RazorPagesTestWebApp.csproj b/src/Management/test/RazorPagesTestWebApp/Steeltoe.Management.Endpoint.RazorPagesTestWebApp.csproj
index 260873cc43..bfe64a947a 100644
--- a/src/Management/test/RazorPagesTestWebApp/Steeltoe.Management.Endpoint.RazorPagesTestWebApp.csproj
+++ b/src/Management/test/RazorPagesTestWebApp/Steeltoe.Management.Endpoint.RazorPagesTestWebApp.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
false
diff --git a/src/Management/test/Tasks.Test/Steeltoe.Management.Tasks.Test.csproj b/src/Management/test/Tasks.Test/Steeltoe.Management.Tasks.Test.csproj
index dc3b1e985f..c8c75a12ee 100644
--- a/src/Management/test/Tasks.Test/Steeltoe.Management.Tasks.Test.csproj
+++ b/src/Management/test/Tasks.Test/Steeltoe.Management.Tasks.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Management/test/Tracing.Test/Steeltoe.Management.Tracing.Test.csproj b/src/Management/test/Tracing.Test/Steeltoe.Management.Tracing.Test.csproj
index 5e73996d4e..c28991c23d 100644
--- a/src/Management/test/Tracing.Test/Steeltoe.Management.Tracing.Test.csproj
+++ b/src/Management/test/Tracing.Test/Steeltoe.Management.Tracing.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Security/test/Authentication.JwtBearer.Test/Steeltoe.Security.Authentication.JwtBearer.Test.csproj b/src/Security/test/Authentication.JwtBearer.Test/Steeltoe.Security.Authentication.JwtBearer.Test.csproj
index d738e78d77..abdce38f96 100644
--- a/src/Security/test/Authentication.JwtBearer.Test/Steeltoe.Security.Authentication.JwtBearer.Test.csproj
+++ b/src/Security/test/Authentication.JwtBearer.Test/Steeltoe.Security.Authentication.JwtBearer.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Security/test/Authentication.OpenIdConnect.Test/Steeltoe.Security.Authentication.OpenIdConnect.Test.csproj b/src/Security/test/Authentication.OpenIdConnect.Test/Steeltoe.Security.Authentication.OpenIdConnect.Test.csproj
index 4273872dc9..7a11ec9e00 100644
--- a/src/Security/test/Authentication.OpenIdConnect.Test/Steeltoe.Security.Authentication.OpenIdConnect.Test.csproj
+++ b/src/Security/test/Authentication.OpenIdConnect.Test/Steeltoe.Security.Authentication.OpenIdConnect.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Security/test/Authorization.Certificate.Test/Steeltoe.Security.Authorization.Certificate.Test.csproj b/src/Security/test/Authorization.Certificate.Test/Steeltoe.Security.Authorization.Certificate.Test.csproj
index c06e4381d5..9235a977d6 100644
--- a/src/Security/test/Authorization.Certificate.Test/Steeltoe.Security.Authorization.Certificate.Test.csproj
+++ b/src/Security/test/Authorization.Certificate.Test/Steeltoe.Security.Authorization.Certificate.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Security/test/DataProtection.Redis.Test/Steeltoe.Security.DataProtection.Redis.Test.csproj b/src/Security/test/DataProtection.Redis.Test/Steeltoe.Security.DataProtection.Redis.Test.csproj
index 71284f6de5..39e575c9a1 100644
--- a/src/Security/test/DataProtection.Redis.Test/Steeltoe.Security.DataProtection.Redis.Test.csproj
+++ b/src/Security/test/DataProtection.Redis.Test/Steeltoe.Security.DataProtection.Redis.Test.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
diff --git a/src/Tools/test/ConfigurationSchemaGenerator.Tests/ConfigurationSchemaGenerator.Tests.csproj b/src/Tools/test/ConfigurationSchemaGenerator.Tests/ConfigurationSchemaGenerator.Tests.csproj
index b3b0ca4194..c54c1fa2e4 100644
--- a/src/Tools/test/ConfigurationSchemaGenerator.Tests/ConfigurationSchemaGenerator.Tests.csproj
+++ b/src/Tools/test/ConfigurationSchemaGenerator.Tests/ConfigurationSchemaGenerator.Tests.csproj
@@ -1,6 +1,6 @@
- net9.0;net8.0
+ net10.0;net9.0;net8.0
false
enable
true
diff --git a/versions.props b/versions.props
index a11c13fea6..3ae717c330 100644
--- a/versions.props
+++ b/versions.props
@@ -33,10 +33,20 @@
8.0.*
+ $(EntityFrameworkCoreTestVersion)
+ $(EntityFrameworkCoreTestVersion)
- 9.0.*-*
+ 9.0.*
+ $(EntityFrameworkCoreTestVersion)
+ $(EntityFrameworkCoreTestVersion)
+
+
+
+ 10.0.*-*
+ 9.0.*
+ 9.0.*
@@ -88,4 +98,15 @@
9.0.*
+
+
+
+
+ 10.0.*-*
+
+
From 0806d3c009e5b49919d4034ba723bea5d5032cba Mon Sep 17 00:00:00 2001
From: Bart Koelman <104792814+bart-vmware@users.noreply.github.com>
Date: Thu, 21 Aug 2025 23:02:14 +0200
Subject: [PATCH 3/4] Fix/skip/comment broken tests
---
shared-test.props | 7 ++++
shared.props | 3 +-
src/Common/test/TestResources/HostWrapper.cs | 2 ++
.../TestWebHostBuilderFactory.cs | 2 ++
.../CompositeConfigurationProvider.cs | 4 +++
.../SpringBootEnvironmentVariableProvider.cs | 4 ++-
.../CloudfoundryConfigurationProviderTest.cs | 17 ++++++++-
...ringBootEnvironmentVariableProviderTest.cs | 36 +++++++++++++++++++
.../DynamicTypeAccess/ConnectorFactoryShim.cs | 2 +-
.../DynamicTypeAccess/ConnectorShim.cs | 2 +-
...qlDbContextOptionsBuilderExtensionsTest.cs | 8 +++++
...erDbContextOptionsBuilderExtensionsTest.cs | 4 +--
.../DynamicConsoleLoggerProviderTest.cs | 24 +++++++++++++
.../RouteMappings/AspNetEndpointProvider.cs | 2 +-
.../ConfigurationSchemaGenerator.Tests.csproj | 5 +--
15 files changed, 112 insertions(+), 10 deletions(-)
diff --git a/shared-test.props b/shared-test.props
index 070739758d..0abf7cd070 100644
--- a/shared-test.props
+++ b/shared-test.props
@@ -4,6 +4,13 @@
$(NoWarn);S2094;S3717;SA1602;CA1062;CA1707;NU5104
+
+
+
+
+ $(NoWarn);ASPDEPR004;ASPDEPR008
+
+
false
diff --git a/shared.props b/shared.props
index 5c1cf092e2..7ca23ec482 100644
--- a/shared.props
+++ b/shared.props
@@ -12,7 +12,8 @@
false
-
+
+
preview
$(NoWarn);CA1873
diff --git a/src/Common/test/TestResources/HostWrapper.cs b/src/Common/test/TestResources/HostWrapper.cs
index 519224e5a2..e80f1f4cb5 100644
--- a/src/Common/test/TestResources/HostWrapper.cs
+++ b/src/Common/test/TestResources/HostWrapper.cs
@@ -7,6 +7,8 @@
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Hosting;
+#pragma warning disable ASPDEPR008 // 'IWebHost' is obsolete: Use IHost instead.
+
namespace Steeltoe.Common.TestResources;
public sealed class HostWrapper : IAsyncDisposable
diff --git a/src/Common/test/TestResources/TestWebHostBuilderFactory.cs b/src/Common/test/TestResources/TestWebHostBuilderFactory.cs
index 5a4f18a271..7161ec0870 100644
--- a/src/Common/test/TestResources/TestWebHostBuilderFactory.cs
+++ b/src/Common/test/TestResources/TestWebHostBuilderFactory.cs
@@ -9,6 +9,8 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
+#pragma warning disable ASPDEPR004 // 'WebHostBuilder' is deprecated in favor of HostBuilder and WebApplicationBuilder.
+
namespace Steeltoe.Common.TestResources;
public static class TestWebHostBuilderFactory
diff --git a/src/Configuration/src/Abstractions/CompositeConfigurationProvider.cs b/src/Configuration/src/Abstractions/CompositeConfigurationProvider.cs
index b9523cf738..4ed1b1d586 100644
--- a/src/Configuration/src/Abstractions/CompositeConfigurationProvider.cs
+++ b/src/Configuration/src/Abstractions/CompositeConfigurationProvider.cs
@@ -97,10 +97,14 @@ public void Set(string key, string? value)
LogSet(GetType().Name, key, value);
+#pragma warning disable IDE0031 // Use null propagation
+ // ReSharper disable once UseNullPropagation
+ // Justification: Triggers warning in Sonar, which doesn't support .NET 10 yet.
if (ConfigurationRoot != null)
{
ConfigurationRoot[key] = value;
}
+#pragma warning restore IDE0031 // Use null propagation
}
public void Dispose()
diff --git a/src/Configuration/src/SpringBoot/SpringBootEnvironmentVariableProvider.cs b/src/Configuration/src/SpringBoot/SpringBootEnvironmentVariableProvider.cs
index 825cab291d..3911e91a93 100644
--- a/src/Configuration/src/SpringBoot/SpringBootEnvironmentVariableProvider.cs
+++ b/src/Configuration/src/SpringBoot/SpringBootEnvironmentVariableProvider.cs
@@ -13,6 +13,7 @@ namespace Steeltoe.Configuration.SpringBoot;
internal sealed class SpringBootEnvironmentVariableProvider : JsonStreamConfigurationProvider
{
private const string SpringApplicationJson = "SPRING_APPLICATION_JSON";
+ private static readonly bool IsAtLeastDotNet10 = typeof(JsonStreamConfigurationProvider).Assembly.GetName().Version?.Major >= 10;
private readonly string? _springApplicationJson;
private bool _loaded;
@@ -61,7 +62,8 @@ public override void Load()
{
string? value = Data[key];
- if (value != null)
+ // Breaking change in JsonConfigurationFileParser at https://github.com/dotnet/runtime/pull/116677.
+ if (IsAtLeastDotNet10 || value != null)
{
string newKey = key.Contains('.') ? key.Replace('.', ':') : key;
data[newKey] = value;
diff --git a/src/Configuration/test/CloudFoundry.Test/CloudfoundryConfigurationProviderTest.cs b/src/Configuration/test/CloudFoundry.Test/CloudfoundryConfigurationProviderTest.cs
index 05bbbfd55f..c4fe354d5a 100644
--- a/src/Configuration/test/CloudFoundry.Test/CloudfoundryConfigurationProviderTest.cs
+++ b/src/Configuration/test/CloudFoundry.Test/CloudfoundryConfigurationProviderTest.cs
@@ -12,7 +12,14 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Steeltoe.Common.TestResources;
-using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
+using IPNetwork =
+#if NET10_0_OR_GREATER
+ System.Net.IPNetwork;
+
+#else
+ Microsoft.AspNetCore.HttpOverrides.IPNetwork;
+
+#endif
namespace Steeltoe.Configuration.CloudFoundry.Test;
@@ -244,14 +251,22 @@ public async Task ForwardedHeadersOptions_unrestricted_when_running_on_CloudFoun
{
options.ForwardedHeaders.Should().HaveFlag(ForwardedHeaders.XForwardedFor);
options.ForwardedHeaders.Should().HaveFlag(ForwardedHeaders.XForwardedProto);
+#if NET10_0_OR_GREATER
+ options.KnownIPNetworks.Should().BeEmpty();
+#else
options.KnownNetworks.Should().BeEmpty();
+#endif
options.KnownProxies.Should().BeEmpty();
}
else
{
options.ForwardedHeaders.Should().NotHaveFlag(ForwardedHeaders.XForwardedFor);
options.ForwardedHeaders.Should().NotHaveFlag(ForwardedHeaders.XForwardedProto);
+#if NET10_0_OR_GREATER
+ options.KnownIPNetworks.Should().ContainSingle().Which.Should().BeEquivalentTo(IPNetwork.Parse("127.0.0.1/8"));
+#else
options.KnownNetworks.Should().ContainSingle().Which.Should().BeEquivalentTo(IPNetwork.Parse("127.0.0.1/8"));
+#endif
options.KnownProxies.Should().ContainSingle().Which.Should().Be(IPAddress.Parse("::1"));
}
}
diff --git a/src/Configuration/test/SpringBoot.Test/SpringBootEnvironmentVariableProviderTest.cs b/src/Configuration/test/SpringBoot.Test/SpringBootEnvironmentVariableProviderTest.cs
index ac78944af9..22767044dd 100644
--- a/src/Configuration/test/SpringBoot.Test/SpringBootEnvironmentVariableProviderTest.cs
+++ b/src/Configuration/test/SpringBoot.Test/SpringBootEnvironmentVariableProviderTest.cs
@@ -63,14 +63,32 @@ public void TryGet_Tree()
value.Should().Be("q");
provider.TryGet("r", out value).Should().BeTrue();
+#if NET10_0_OR_GREATER
+ value.Should().BeNull();
+#else
value.Should().BeEmpty();
+#endif
provider.TryGet("s:t", out value).Should().BeTrue();
+#if NET10_0_OR_GREATER
+ value.Should().BeNull();
+#else
value.Should().BeEmpty();
+#endif
+#if NET10_0_OR_GREATER
+ provider.TryGet("u", out _).Should().BeTrue();
+ value.Should().BeNull();
+#else
provider.TryGet("u", out _).Should().BeFalse();
+#endif
+#if NET10_0_OR_GREATER
+ provider.TryGet("v:w", out _).Should().BeTrue();
+ value.Should().BeNull();
+#else
provider.TryGet("v:w", out _).Should().BeFalse();
+#endif
}
[Fact]
@@ -113,14 +131,32 @@ public void TryGet_Array()
value.Should().Be("q");
provider.TryGet("a:b:c:2:r", out value).Should().BeTrue();
+#if NET10_0_OR_GREATER
+ value.Should().BeNull();
+#else
value.Should().BeEmpty();
+#endif
provider.TryGet("a:b:c:2:s:t", out value).Should().BeTrue();
+#if NET10_0_OR_GREATER
+ value.Should().BeNull();
+#else
value.Should().BeEmpty();
+#endif
+#if NET10_0_OR_GREATER
+ provider.TryGet("a:b:c:2:u", out _).Should().BeTrue();
+ value.Should().BeNull();
+#else
provider.TryGet("a:b:c:2:u", out _).Should().BeFalse();
+#endif
+#if NET10_0_OR_GREATER
+ provider.TryGet("a:b:c:2:v:w", out _).Should().BeTrue();
+ value.Should().BeNull();
+#else
provider.TryGet("a:b:c:2:v:w", out _).Should().BeFalse();
+#endif
}
[Fact]
diff --git a/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorFactoryShim.cs b/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorFactoryShim.cs
index 4ad4609884..51d468747d 100644
--- a/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorFactoryShim.cs
+++ b/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorFactoryShim.cs
@@ -60,7 +60,7 @@ private static TypeAccessor MakeGenericTypeAccessor(Type connectionType)
public ConnectorShim Get(string serviceBindingName)
{
- object instance = InstanceAccessor.InvokeMethodOverload(nameof(ConnectorFactory.Get), true, [typeof(string)], serviceBindingName)!;
+ object instance = InstanceAccessor.InvokeMethodOverload(nameof(ConnectorFactory<,>.Get), true, [typeof(string)], serviceBindingName)!;
return new ConnectorShim(_connectionType, instance);
}
diff --git a/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorShim.cs b/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorShim.cs
index ff13dba205..e3479f0232 100644
--- a/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorShim.cs
+++ b/src/Connectors/src/Connectors/DynamicTypeAccess/ConnectorShim.cs
@@ -25,7 +25,7 @@ private static InstanceAccessor CreateAccessor(Type connectionType, object insta
public object GetConnection()
{
- return InstanceAccessor.InvokeMethod(nameof(Connector.GetConnection), true)!;
+ return InstanceAccessor.InvokeMethod(nameof(Connector<,>.GetConnection), true)!;
}
public void Dispose()
diff --git a/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs b/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs
index 048e5f9085..70bf65580c 100644
--- a/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs
+++ b/src/Connectors/test/EntityFrameworkCore.Test/MySql/Pomelo/MySqlDbContextOptionsBuilderExtensionsTest.cs
@@ -16,7 +16,11 @@ namespace Steeltoe.Connectors.EntityFrameworkCore.Test.MySql.Pomelo;
public sealed class MySqlDbContextOptionsBuilderExtensionsTest
{
+#if NET10_0_OR_GREATER
+ [Fact(Skip = "Disabled because there is no Pomelo version that's compatible with EF Core 10 yet.")]
+#else
[Fact]
+#endif
public async Task Registers_connection_string_for_default_service_binding()
{
var appSettings = new Dictionary
@@ -42,7 +46,11 @@ public async Task Registers_connection_string_for_default_service_binding()
"Server=localhost;User ID=steeltoe;Password=steeltoe;Database=myDb;Allow User Variables=True;Connection Timeout=15;Use Affected Rows=False;Use Compression=False");
}
+#if NET10_0_OR_GREATER
+ [Fact(Skip = "Disabled because there is no Pomelo version that's compatible with EF Core 10 yet.")]
+#else
[Fact]
+#endif
public async Task Registers_connection_string_for_named_service_binding()
{
var appSettings = new Dictionary
diff --git a/src/Connectors/test/EntityFrameworkCore.Test/SqlServer/SqlServerDbContextOptionsBuilderExtensionsTest.cs b/src/Connectors/test/EntityFrameworkCore.Test/SqlServer/SqlServerDbContextOptionsBuilderExtensionsTest.cs
index 66d5001276..fe02b0faaa 100644
--- a/src/Connectors/test/EntityFrameworkCore.Test/SqlServer/SqlServerDbContextOptionsBuilderExtensionsTest.cs
+++ b/src/Connectors/test/EntityFrameworkCore.Test/SqlServer/SqlServerDbContextOptionsBuilderExtensionsTest.cs
@@ -34,7 +34,7 @@ public async Task Registers_connection_string_for_default_service_binding()
await using var dbContext = scope.ServiceProvider.GetRequiredService();
string? connectionString = dbContext.Database.GetConnectionString();
- connectionString.Should().Be("Data Source=localhost;Initial Catalog=myDb;User ID=steeltoe;Password=steeltoe;Max Pool Size=50;Encrypt=false");
+ connectionString.Should().StartWith("Data Source=localhost;Initial Catalog=myDb;User ID=steeltoe;Password=steeltoe;Max Pool Size=50;Encrypt=");
}
[Fact]
@@ -56,6 +56,6 @@ public async Task Registers_connection_string_for_named_service_binding()
await using var dbContext = scope.ServiceProvider.GetRequiredService();
string? connectionString = dbContext.Database.GetConnectionString();
- connectionString.Should().Be("Data Source=localhost;Initial Catalog=myDb;User ID=steeltoe;Password=steeltoe;Max Pool Size=50;Encrypt=false");
+ connectionString.Should().StartWith("Data Source=localhost;Initial Catalog=myDb;User ID=steeltoe;Password=steeltoe;Max Pool Size=50;Encrypt=");
}
}
diff --git a/src/Logging/test/DynamicConsole.Test/DynamicConsoleLoggerProviderTest.cs b/src/Logging/test/DynamicConsole.Test/DynamicConsoleLoggerProviderTest.cs
index 5c17d14573..d48ca207d7 100644
--- a/src/Logging/test/DynamicConsole.Test/DynamicConsoleLoggerProviderTest.cs
+++ b/src/Logging/test/DynamicConsole.Test/DynamicConsoleLoggerProviderTest.cs
@@ -482,6 +482,29 @@ public async Task CanUseJsonFormatterWithScopes()
await _consoleOutput.WaitForFlushAsync(TestContext.Current.CancellationToken);
string logOutput = _consoleOutput.ToString();
+#if NET10_0_OR_GREATER
+ logOutput.Should().Be("""
+ {
+ "EventId": 0,
+ "LogLevel": "Information",
+ "Category": "Fully.Qualified.Type",
+ "Message": "Processing of { RequestUrl = https://www.example.com, UserAgent = Steeltoe } started.",
+ "State": {
+ "@IncomingRequest": "{ RequestUrl = https://www.example.com, UserAgent = Steeltoe }",
+ "{OriginalFormat}": "Processing of {@IncomingRequest} started."
+ },
+ "Scopes": [
+ "OuterScope",
+ {
+ "Message": "InnerScope=InnerScopeValue",
+ "InnerScopeKey": "InnerScopeValue",
+ "{OriginalFormat}": "InnerScope={InnerScopeKey}"
+ }
+ ]
+ }
+
+ """);
+#else
logOutput.Should().Be("""
{
"EventId": 0,
@@ -504,6 +527,7 @@ public async Task CanUseJsonFormatterWithScopes()
}
""");
+#endif
}
[Fact]
diff --git a/src/Management/src/Endpoint/Actuators/RouteMappings/AspNetEndpointProvider.cs b/src/Management/src/Endpoint/Actuators/RouteMappings/AspNetEndpointProvider.cs
index 70f810c77f..39c995b7a9 100644
--- a/src/Management/src/Endpoint/Actuators/RouteMappings/AspNetEndpointProvider.cs
+++ b/src/Management/src/Endpoint/Actuators/RouteMappings/AspNetEndpointProvider.cs
@@ -167,7 +167,7 @@ private static IEnumerable FromActuatorEndpoint(RouteEndpoint en
if (endpointOptions != null)
{
string displayName = endpoint.DisplayName ?? string.Empty;
- MethodInfo handlerMethod = typeof(EndpointMiddleware<,>).GetMethod(nameof(EndpointMiddleware