From 4cb0347d58c9c5d5ccea4171cc8e8c0d152b49b5 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 30 Sep 2025 01:06:04 +0000
Subject: [PATCH 1/6] Initial plan
From 8637a83c460d61d7b15d321a0d52cfd9c371456d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 30 Sep 2025 01:14:38 +0000
Subject: [PATCH 2/6] Add Deprecated property to SecurityScheme with
serialization/deserialization
Co-authored-by: baywet <7905502+baywet@users.noreply.github.com>
---
.../Interfaces/IOpenApiSecurityScheme.cs | 6 +++++
.../Models/OpenApiSecurityScheme.cs | 17 ++++++++++++
.../OpenApiSecuritySchemeReference.cs | 3 +++
.../V3/OpenApiSecuritySchemeDeserializer.cs | 16 +++++++++++-
.../V31/OpenApiSecuritySchemeDeserializer.cs | 26 ++++++++++++++++++-
.../V32/OpenApiSecuritySchemeDeserializer.cs | 10 +++++++
6 files changed, 76 insertions(+), 2 deletions(-)
diff --git a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs
index c2920454c..41247ce08 100644
--- a/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs
+++ b/src/Microsoft.OpenApi/Models/Interfaces/IOpenApiSecurityScheme.cs
@@ -45,4 +45,10 @@ public interface IOpenApiSecurityScheme : IOpenApiDescribedElement, IOpenApiRead
/// REQUIRED. OpenId Connect URL to discover OAuth2 configuration values.
///
public Uri? OpenIdConnectUrl { get; }
+
+ ///
+ /// Specifies that a security scheme is deprecated and SHOULD be transitioned out of usage.
+ /// Note: This field is supported in OpenAPI 3.2.0+. For earlier versions, it will be serialized as x-oai-deprecated extension.
+ ///
+ public bool Deprecated { get; }
}
diff --git a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs
index 320d64504..4bee59619 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiSecurityScheme.cs
@@ -35,6 +35,9 @@ public class OpenApiSecurityScheme : IOpenApiExtensible, IOpenApiSecurityScheme
///
public Uri? OpenIdConnectUrl { get; set; }
+ ///
+ public bool Deprecated { get; set; }
+
///
public IDictionary? Extensions { get; set; }
@@ -57,6 +60,7 @@ internal OpenApiSecurityScheme(IOpenApiSecurityScheme securityScheme)
BearerFormat = securityScheme.BearerFormat ?? BearerFormat;
Flows = securityScheme.Flows != null ? new(securityScheme.Flows) : null;
OpenIdConnectUrl = securityScheme.OpenIdConnectUrl != null ? new Uri(securityScheme.OpenIdConnectUrl.OriginalString, UriKind.RelativeOrAbsolute) : null;
+ Deprecated = securityScheme.Deprecated;
Extensions = securityScheme.Extensions != null ? new Dictionary(securityScheme.Extensions) : null;
}
///
@@ -124,6 +128,19 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
break;
}
+ // deprecated - serialize as native field for v3.2+ or as extension for earlier versions
+ if (Deprecated)
+ {
+ if (version >= OpenApiSpecVersion.OpenApi3_2)
+ {
+ writer.WriteProperty(OpenApiConstants.Deprecated, Deprecated, false);
+ }
+ else
+ {
+ writer.WriteProperty("x-oai-deprecated", Deprecated, false);
+ }
+ }
+
// extensions
writer.WriteExtensions(Extensions, version);
diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
index aa83105fa..4267315e3 100644
--- a/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
+++ b/src/Microsoft.OpenApi/Models/References/OpenApiSecuritySchemeReference.cs
@@ -60,6 +60,9 @@ public string? Description
///
public SecuritySchemeType? Type { get => Target?.Type; }
+ ///
+ public bool Deprecated { get => Target?.Deprecated ?? default; }
+
///
public override IOpenApiSecurityScheme CopyReferenceAsTargetElementWithOverrides(IOpenApiSecurityScheme source)
{
diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs
index ae956ecf5..d0cbeb3ab 100644
--- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSecuritySchemeDeserializer.cs
@@ -72,7 +72,21 @@ internal static partial class OpenApiV3Deserializer
private static readonly PatternFieldMap _securitySchemePatternFields =
new()
{
- {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
+ {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) =>
+ {
+ if (p.Equals("x-oai-deprecated", StringComparison.OrdinalIgnoreCase))
+ {
+ var deprecated = n.GetScalarValue();
+ if (deprecated != null)
+ {
+ o.Deprecated = bool.Parse(deprecated);
+ }
+ }
+ else
+ {
+ o.AddExtension(p, LoadExtension(p,n));
+ }
+ }}
};
public static IOpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument)
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
index b85d82df9..952d25651 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
@@ -73,13 +73,37 @@ internal static partial class OpenApiV31Deserializer
{
o.Flows = LoadOAuthFlows(n, t);
}
+ },
+ {
+ "deprecated", (o, n, _) =>
+ {
+ var deprecated = n.GetScalarValue();
+ if (deprecated != null)
+ {
+ o.Deprecated = bool.Parse(deprecated);
+ }
+ }
}
};
private static readonly PatternFieldMap _securitySchemePatternFields =
new()
{
- {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))}
+ {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) =>
+ {
+ if (p.Equals("x-oai-deprecated", StringComparison.OrdinalIgnoreCase))
+ {
+ var deprecated = n.GetScalarValue();
+ if (deprecated != null)
+ {
+ o.Deprecated = bool.Parse(deprecated);
+ }
+ }
+ else
+ {
+ o.AddExtension(p, LoadExtension(p,n));
+ }
+ }}
};
public static IOpenApiSecurityScheme LoadSecurityScheme(ParseNode node, OpenApiDocument hostDocument)
diff --git a/src/Microsoft.OpenApi/Reader/V32/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V32/OpenApiSecuritySchemeDeserializer.cs
index 7278df227..34e3f589e 100644
--- a/src/Microsoft.OpenApi/Reader/V32/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V32/OpenApiSecuritySchemeDeserializer.cs
@@ -73,6 +73,16 @@ internal static partial class OpenApiV32Deserializer
{
o.Flows = LoadOAuthFlows(n, t);
}
+ },
+ {
+ "deprecated", (o, n, _) =>
+ {
+ var deprecated = n.GetScalarValue();
+ if (deprecated != null)
+ {
+ o.Deprecated = bool.Parse(deprecated);
+ }
+ }
}
};
From aaf4c36c9c1120e8ed3d4585c3926f79ce73535b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 30 Sep 2025 01:20:17 +0000
Subject: [PATCH 3/6] Add tests for SecurityScheme deprecated field and update
public API
Co-authored-by: baywet <7905502+baywet@users.noreply.github.com>
---
...ecuritySchemeReferenceDeserializerTests.cs | 58 +++++++++++++
...ecuritySchemeReferenceDeserializerTests.cs | 29 +++++++
.../Models/OpenApiSecuritySchemeTests.cs | 81 +++++++++++++++++++
.../PublicApi/PublicApi.approved.txt | 3 +
4 files changed, 171 insertions(+)
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
index 0a09b68be..2595bfc87 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
@@ -38,4 +38,62 @@ public void ShouldDeserializeSecuritySchemeReferenceAnnotations()
Assert.Equal("This is a security scheme reference", resultReference.Description);
Assert.NotNull(resultReference.Target);
}
+
+ [Fact]
+ public void ShouldDeserializeSecuritySchemeWithXOaiDeprecatedExtension()
+ {
+ var json =
+ """
+ {
+ "type": "apiKey",
+ "description": "This is a deprecated security scheme",
+ "name": "api_key",
+ "in": "header",
+ "x-oai-deprecated": true
+ }
+ """;
+
+ var hostDocument = new OpenApiDocument();
+ var jsonNode = JsonNode.Parse(json);
+ var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
+
+ var result = OpenApiV31Deserializer.LoadSecurityScheme(parseNode, hostDocument);
+
+ Assert.NotNull(result);
+ var resultScheme = Assert.IsType(result);
+
+ Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
+ Assert.Equal("api_key", resultScheme.Name);
+ Assert.Equal(ParameterLocation.Header, resultScheme.In);
+ Assert.True(resultScheme.Deprecated);
+ }
+
+ [Fact]
+ public void ShouldDeserializeSecuritySchemeWithDeprecatedField()
+ {
+ var json =
+ """
+ {
+ "type": "apiKey",
+ "description": "This is a deprecated security scheme",
+ "name": "api_key",
+ "in": "header",
+ "deprecated": true
+ }
+ """;
+
+ var hostDocument = new OpenApiDocument();
+ var jsonNode = JsonNode.Parse(json);
+ var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
+
+ var result = OpenApiV31Deserializer.LoadSecurityScheme(parseNode, hostDocument);
+
+ Assert.NotNull(result);
+ var resultScheme = Assert.IsType(result);
+
+ Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
+ Assert.Equal("api_key", resultScheme.Name);
+ Assert.Equal(ParameterLocation.Header, resultScheme.In);
+ Assert.True(resultScheme.Deprecated);
+ }
}
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
index 82d85926d..166496a62 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
@@ -38,5 +38,34 @@ public void ShouldDeserializeSecuritySchemeReferenceAnnotations()
Assert.Equal("This is a security scheme reference", resultReference.Description);
Assert.NotNull(resultReference.Target);
}
+
+ [Fact]
+ public void ShouldDeserializeSecuritySchemeWithDeprecatedField()
+ {
+ var json =
+ """
+ {
+ "type": "apiKey",
+ "description": "This is a deprecated security scheme",
+ "name": "api_key",
+ "in": "header",
+ "deprecated": true
+ }
+ """;
+
+ var hostDocument = new OpenApiDocument();
+ var jsonNode = JsonNode.Parse(json);
+ var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
+
+ var result = OpenApiV32Deserializer.LoadSecurityScheme(parseNode, hostDocument);
+
+ Assert.NotNull(result);
+ var resultScheme = Assert.IsType(result);
+
+ Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
+ Assert.Equal("api_key", resultScheme.Name);
+ Assert.Equal(ParameterLocation.Header, resultScheme.In);
+ Assert.True(resultScheme.Deprecated);
+ }
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
index 1415d62a1..bda70a443 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
@@ -109,6 +109,15 @@ public class OpenApiSecuritySchemeTests
OpenIdConnectUrl = new("https://example.com/openIdConnect")
};
+ private static OpenApiSecurityScheme DeprecatedApiKeySecurityScheme => new()
+ {
+ Description = "description1",
+ Name = "parameterName",
+ Type = SecuritySchemeType.ApiKey,
+ In = ParameterLocation.Query,
+ Deprecated = true
+ };
+
[Fact]
public async Task SerializeApiKeySecuritySchemeAsV3JsonWorks()
{
@@ -329,5 +338,77 @@ public async Task SerializeReferencedSecuritySchemeAsV3JsonWithoutReferenceWorks
// Assert
await Verifier.Verify(outputStringWriter).UseParameters(produceTerseOutput);
}
+
+ [Fact]
+ public async Task SerializeDeprecatedSecuritySchemeAsV32JsonWorks()
+ {
+ // Arrange
+ var expected =
+ """
+ {
+ "type": "apiKey",
+ "description": "description1",
+ "name": "parameterName",
+ "in": "query",
+ "deprecated": true
+ }
+ """;
+
+ // Act
+ var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_2);
+
+ // Assert
+ actual = actual.MakeLineBreaksEnvironmentNeutral();
+ expected = expected.MakeLineBreaksEnvironmentNeutral();
+ Assert.Equal(expected, actual);
+ }
+
+ [Fact]
+ public async Task SerializeDeprecatedSecuritySchemeAsV31JsonWorks()
+ {
+ // Arrange
+ var expected =
+ """
+ {
+ "type": "apiKey",
+ "description": "description1",
+ "name": "parameterName",
+ "in": "query",
+ "x-oai-deprecated": true
+ }
+ """;
+
+ // Act
+ var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1);
+
+ // Assert
+ actual = actual.MakeLineBreaksEnvironmentNeutral();
+ expected = expected.MakeLineBreaksEnvironmentNeutral();
+ Assert.Equal(expected, actual);
+ }
+
+ [Fact]
+ public async Task SerializeDeprecatedSecuritySchemeAsV3JsonWorks()
+ {
+ // Arrange
+ var expected =
+ """
+ {
+ "type": "apiKey",
+ "description": "description1",
+ "name": "parameterName",
+ "in": "query",
+ "x-oai-deprecated": true
+ }
+ """;
+
+ // Act
+ var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
+
+ // Assert
+ actual = actual.MakeLineBreaksEnvironmentNeutral();
+ expected = expected.MakeLineBreaksEnvironmentNeutral();
+ Assert.Equal(expected, actual);
+ }
}
}
diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
index a0deaacfb..55ef7e5d9 100644
--- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
+++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt
@@ -268,6 +268,7 @@ namespace Microsoft.OpenApi
public interface IOpenApiSecurityScheme : Microsoft.OpenApi.IOpenApiDescribedElement, Microsoft.OpenApi.IOpenApiElement, Microsoft.OpenApi.IOpenApiReadOnlyExtensible, Microsoft.OpenApi.IOpenApiReferenceable, Microsoft.OpenApi.IOpenApiSerializable, Microsoft.OpenApi.IShallowCopyable
{
string? BearerFormat { get; }
+ bool Deprecated { get; }
Microsoft.OpenApi.OpenApiOAuthFlows? Flows { get; }
Microsoft.OpenApi.ParameterLocation? In { get; }
string? Name { get; }
@@ -1299,6 +1300,7 @@ namespace Microsoft.OpenApi
{
public OpenApiSecurityScheme() { }
public string? BearerFormat { get; set; }
+ public bool Deprecated { get; set; }
public string? Description { get; set; }
public System.Collections.Generic.IDictionary? Extensions { get; set; }
public Microsoft.OpenApi.OpenApiOAuthFlows? Flows { get; set; }
@@ -1317,6 +1319,7 @@ namespace Microsoft.OpenApi
{
public OpenApiSecuritySchemeReference(string referenceId, Microsoft.OpenApi.OpenApiDocument? hostDocument = null, string? externalResource = null) { }
public string? BearerFormat { get; }
+ public bool Deprecated { get; }
public string? Description { get; set; }
public System.Collections.Generic.IDictionary? Extensions { get; }
public Microsoft.OpenApi.OpenApiOAuthFlows? Flows { get; }
From c6b79aa87440ab7749f3cdfa52ca708110629d44 Mon Sep 17 00:00:00 2001
From: Vincent Biret
Date: Tue, 30 Sep 2025 09:15:23 -0400
Subject: [PATCH 4/6] Apply suggestions from code review
---
.../V31/OpenApiSecuritySchemeDeserializer.cs | 10 -------
...ecuritySchemeReferenceDeserializerTests.cs | 29 -------------------
.../Models/OpenApiSecuritySchemeTests.cs | 12 ++------
3 files changed, 3 insertions(+), 48 deletions(-)
diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
index 952d25651..c315b229a 100644
--- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
+++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSecuritySchemeDeserializer.cs
@@ -73,16 +73,6 @@ internal static partial class OpenApiV31Deserializer
{
o.Flows = LoadOAuthFlows(n, t);
}
- },
- {
- "deprecated", (o, n, _) =>
- {
- var deprecated = n.GetScalarValue();
- if (deprecated != null)
- {
- o.Deprecated = bool.Parse(deprecated);
- }
- }
}
};
diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
index 2595bfc87..7084a1d56 100644
--- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
+++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSecuritySchemeReferenceDeserializerTests.cs
@@ -67,33 +67,4 @@ public void ShouldDeserializeSecuritySchemeWithXOaiDeprecatedExtension()
Assert.Equal(ParameterLocation.Header, resultScheme.In);
Assert.True(resultScheme.Deprecated);
}
-
- [Fact]
- public void ShouldDeserializeSecuritySchemeWithDeprecatedField()
- {
- var json =
- """
- {
- "type": "apiKey",
- "description": "This is a deprecated security scheme",
- "name": "api_key",
- "in": "header",
- "deprecated": true
- }
- """;
-
- var hostDocument = new OpenApiDocument();
- var jsonNode = JsonNode.Parse(json);
- var parseNode = ParseNode.Create(new ParsingContext(new()), jsonNode);
-
- var result = OpenApiV31Deserializer.LoadSecurityScheme(parseNode, hostDocument);
-
- Assert.NotNull(result);
- var resultScheme = Assert.IsType(result);
-
- Assert.Equal(SecuritySchemeType.ApiKey, resultScheme.Type);
- Assert.Equal("api_key", resultScheme.Name);
- Assert.Equal(ParameterLocation.Header, resultScheme.In);
- Assert.True(resultScheme.Deprecated);
- }
}
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
index bda70a443..e13271618 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
@@ -358,9 +358,7 @@ public async Task SerializeDeprecatedSecuritySchemeAsV32JsonWorks()
var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_2);
// Assert
- actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- Assert.Equal(expected, actual);
+ Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
}
[Fact]
@@ -382,9 +380,7 @@ public async Task SerializeDeprecatedSecuritySchemeAsV31JsonWorks()
var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_1);
// Assert
- actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- Assert.Equal(expected, actual);
+ Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
}
[Fact]
@@ -406,9 +402,7 @@ public async Task SerializeDeprecatedSecuritySchemeAsV3JsonWorks()
var actual = await DeprecatedApiKeySecurityScheme.SerializeAsJsonAsync(OpenApiSpecVersion.OpenApi3_0);
// Assert
- actual = actual.MakeLineBreaksEnvironmentNeutral();
- expected = expected.MakeLineBreaksEnvironmentNeutral();
- Assert.Equal(expected, actual);
+ Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
}
}
}
From 9924957f3d3c12bc4d12e778789cf561153a081c Mon Sep 17 00:00:00 2001
From: Vincent Biret
Date: Tue, 30 Sep 2025 09:16:23 -0400
Subject: [PATCH 5/6] chore: adds missing using
---
.../Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
index e13271618..1432d07cc 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiSecuritySchemeTests.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.IO;
+using System.Text.Json.Nodes;
using System.Threading.Tasks;
using VerifyXunit;
using Xunit;
From 269181b6924e6b2f49131e1d891074689902b2b2 Mon Sep 17 00:00:00 2001
From: Vincent Biret
Date: Tue, 30 Sep 2025 13:32:16 -0400
Subject: [PATCH 6/6] chore: updates benchmark results
---
.../performance.Descriptions-report-github.md | 20 +++---
.../performance.Descriptions-report.csv | 8 +--
.../performance.Descriptions-report.html | 20 +++---
.../performance.Descriptions-report.json | 2 +-
.../performance.EmptyModels-report-github.md | 68 +++++++++----------
.../performance.EmptyModels-report.csv | 56 +++++++--------
.../performance.EmptyModels-report.html | 68 +++++++++----------
.../performance.EmptyModels-report.json | 2 +-
8 files changed, 122 insertions(+), 122 deletions(-)
diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md
index a9df33114..856b430d4 100644
--- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md
+++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md
@@ -1,18 +1,18 @@
```
-BenchmarkDotNet v0.15.4, Linux Ubuntu 24.04.3 LTS (Noble Numbat)
-AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
+BenchmarkDotNet v0.15.4, Windows 11 (10.0.26200.6584)
+11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores
.NET SDK 8.0.414
- [Host] : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v3
- ShortRun : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v3
+ [Host] : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v4
+ ShortRun : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v4
Job=ShortRun IterationCount=3 LaunchCount=1
WarmupCount=3
```
-| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
-|------------- |---------------:|--------------:|------------:|-----------:|-----------:|----------:|-------------:|
-| PetStoreYaml | 513.8 μs | 220.40 μs | 12.08 μs | 23.4375 | 3.9063 | - | 387.37 KB |
-| PetStoreJson | 235.7 μs | 19.54 μs | 1.07 μs | 13.6719 | 1.9531 | - | 249.22 KB |
-| GHESYaml | 1,008,778.7 μs | 50,002.60 μs | 2,740.81 μs | 26000.0000 | 20000.0000 | 3000.0000 | 384508.01 KB |
-| GHESJson | 469,189.2 μs | 144,923.46 μs | 7,943.74 μs | 16000.0000 | 9000.0000 | 2000.0000 | 245977.2 KB |
+| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
+|------------- |---------------:|-------------:|-------------:|-----------:|-----------:|----------:|-------------:|
+| PetStoreYaml | 519.5 μs | 807.9 μs | 44.29 μs | 62.5000 | 11.7188 | - | 387.37 KB |
+| PetStoreJson | 234.0 μs | 166.2 μs | 9.11 μs | 40.0391 | 7.8125 | - | 249.52 KB |
+| GHESYaml | 1,120,391.4 μs | 912,897.7 μs | 50,039.00 μs | 65000.0000 | 21000.0000 | 3000.0000 | 384510.39 KB |
+| GHESJson | 585,492.8 μs | 734,663.2 μs | 40,269.37 μs | 40000.0000 | 16000.0000 | 3000.0000 | 245982.27 KB |
diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv
index 683e975b7..24891b3b2 100644
--- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv
+++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv
@@ -1,5 +1,5 @@
Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Gen0,Gen1,Gen2,Allocated
-PetStoreYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,513.8 μs,220.40 μs,12.08 μs,23.4375,3.9063,0.0000,387.37 KB
-PetStoreJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,235.7 μs,19.54 μs,1.07 μs,13.6719,1.9531,0.0000,249.22 KB
-GHESYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"1,008,778.7 μs","50,002.60 μs","2,740.81 μs",26000.0000,20000.0000,3000.0000,384508.01 KB
-GHESJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"469,189.2 μs","144,923.46 μs","7,943.74 μs",16000.0000,9000.0000,2000.0000,245977.2 KB
+PetStoreYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,519.5 μs,807.9 μs,44.29 μs,62.5000,11.7188,0.0000,387.37 KB
+PetStoreJson,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,234.0 μs,166.2 μs,9.11 μs,40.0391,7.8125,0.0000,249.52 KB
+GHESYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"1,120,391.4 μs","912,897.7 μs","50,039.00 μs",65000.0000,21000.0000,3000.0000,384510.39 KB
+GHESJson,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"585,492.8 μs","734,663.2 μs","40,269.37 μs",40000.0000,16000.0000,3000.0000,245982.27 KB
diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html
index e8f53868c..da25ebf94 100644
--- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html
+++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html
@@ -2,7 +2,7 @@
-performance.Descriptions-20250929-235233
+performance.Descriptions-20250930-095804