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