From 561e33c0f49778c653396db310e8bfcf1e1e73a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 21:30:11 +0000 Subject: [PATCH 01/12] Bump Microsoft.NET.Test.Sdk from 18.4.0 to 18.5.1 --- updated-dependencies: - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.5.1 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.5.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .../Microsoft.OpenApi.Hidi.Tests.csproj | 2 +- .../Microsoft.OpenApi.Readers.Tests.csproj | 2 +- test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj index 2ff261d63..84f3e3ddd 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj +++ b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index 370e1b372..683a480df 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 41666803a..7dabac677 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -11,7 +11,7 @@ - + From 0fcdf65bd2d0f1e6f59506e47cdbc494b6214eae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 00:10:59 +0000 Subject: [PATCH 02/12] chore(deps): bump dotnet-sdk from 10.0.203 to 10.0.300 Bumps [dotnet-sdk](https://github.com/dotnet/sdk) from 10.0.203 to 10.0.300. - [Release notes](https://github.com/dotnet/sdk/releases) - [Commits](https://github.com/dotnet/sdk/commits/v10.0.300) --- updated-dependencies: - dependency-name: dotnet-sdk dependency-version: 10.0.300 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index f234262d9..d895dfe5a 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "10.0.203" + "version": "10.0.300" } } \ No newline at end of file From d69ed7df0005aead185124bb72a95f84e26e5239 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 09:31:50 +0000 Subject: [PATCH 03/12] Bump Microsoft.Extensions.DependencyInjection and 5 others Bumps Microsoft.Extensions.DependencyInjection from 10.0.7 to 10.0.8 Bumps Microsoft.Extensions.Logging from 10.0.7 to 10.0.8 Bumps Microsoft.Extensions.Logging.Abstractions from 10.0.7 to 10.0.8 Bumps Microsoft.Extensions.Logging.Console from 10.0.7 to 10.0.8 Bumps Microsoft.Extensions.Logging.Debug from 10.0.7 to 10.0.8 Bumps System.Text.Json from 10.0.7 to 10.0.8 --- updated-dependencies: - dependency-name: Microsoft.Extensions.DependencyInjection dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging.Abstractions dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging.Console dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging.Console dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging.Debug dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: Microsoft.Extensions.Logging.Debug dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions - dependency-name: System.Text.Json dependency-version: 10.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: microsoftextensions ... Signed-off-by: dependabot[bot] --- performance/resultsComparer/resultsComparer.csproj | 10 +++++----- .../Microsoft.OpenApi.Hidi.csproj | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/performance/resultsComparer/resultsComparer.csproj b/performance/resultsComparer/resultsComparer.csproj index eeeb0c683..21bf06fa0 100644 --- a/performance/resultsComparer/resultsComparer.csproj +++ b/performance/resultsComparer/resultsComparer.csproj @@ -8,12 +8,12 @@ - - - - + + + + - + diff --git a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj index eb6a089b6..6642b9fb3 100644 --- a/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj +++ b/src/Microsoft.OpenApi.Hidi/Microsoft.OpenApi.Hidi.csproj @@ -29,10 +29,10 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all From 2c41ac9aafaf93ba94c3edec874070e8dcf16412 Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 09:51:16 +0000 Subject: [PATCH 04/12] Updated for https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build?definitionId=107 by using baselines generated in https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build/results?buildId=178250 --- .config/1espt/PipelineAutobaseliningConfig.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.config/1espt/PipelineAutobaseliningConfig.yml b/.config/1espt/PipelineAutobaseliningConfig.yml index a4d9608c6..b0e7ed896 100644 --- a/.config/1espt/PipelineAutobaseliningConfig.yml +++ b/.config/1espt/PipelineAutobaseliningConfig.yml @@ -15,8 +15,8 @@ pipelines: lastModifiedDate: 2024-09-13 binary: credscan: - lastModifiedDate: 2025-01-27 + lastModifiedDate: 2025-01-28 binskim: - lastModifiedDate: 2025-01-27 + lastModifiedDate: 2025-01-28 spotbugs: - lastModifiedDate: 2025-01-27 + lastModifiedDate: 2025-01-28 From 634aa2f2e5c37d881c2a578045f1395c7b05f981 Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 14:56:41 +0000 Subject: [PATCH 05/12] Updated for https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build?definitionId=107 by using baselines generated in https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build/results?buildId=186331 --- .config/1espt/PipelineAutobaseliningConfig.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/1espt/PipelineAutobaseliningConfig.yml b/.config/1espt/PipelineAutobaseliningConfig.yml index b0e7ed896..85fe75918 100644 --- a/.config/1espt/PipelineAutobaseliningConfig.yml +++ b/.config/1espt/PipelineAutobaseliningConfig.yml @@ -17,6 +17,6 @@ pipelines: credscan: lastModifiedDate: 2025-01-28 binskim: - lastModifiedDate: 2025-01-28 + lastModifiedDate: 2025-04-28 spotbugs: lastModifiedDate: 2025-01-28 From a923502ac10a2d478ff199d45b575a25758265dd Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 19:58:41 +0000 Subject: [PATCH 06/12] Updated for https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build?definitionId=107 by using baselines generated in https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build/results?buildId=189262 --- .config/1espt/PipelineAutobaseliningConfig.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.config/1espt/PipelineAutobaseliningConfig.yml b/.config/1espt/PipelineAutobaseliningConfig.yml index 85fe75918..0d024b16a 100644 --- a/.config/1espt/PipelineAutobaseliningConfig.yml +++ b/.config/1espt/PipelineAutobaseliningConfig.yml @@ -13,6 +13,8 @@ pipelines: lastModifiedDate: 2024-09-13 armory: lastModifiedDate: 2024-09-13 + accessibilityinsights: + lastModifiedDate: 2025-06-03 binary: credscan: lastModifiedDate: 2025-01-28 From f187c94d7a7f5b9fc3c5b922159f72e56d874bb9 Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 00:43:19 +0000 Subject: [PATCH 07/12] Updated for https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build?definitionId=107 by using baselines generated in https://dev.azure.com/microsoftgraph/0985d294-5762-4bc2-a565-161ef349ca3e/_build/results?buildId=218579 --- .../1espt/PipelineAutobaseliningConfig.yml | 10 ++-- .config/guardian/.gdnbaselines | 53 +++++++++++++++++++ 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 .config/guardian/.gdnbaselines diff --git a/.config/1espt/PipelineAutobaseliningConfig.yml b/.config/1espt/PipelineAutobaseliningConfig.yml index 0d024b16a..37a1a42bd 100644 --- a/.config/1espt/PipelineAutobaseliningConfig.yml +++ b/.config/1espt/PipelineAutobaseliningConfig.yml @@ -8,17 +8,17 @@ pipelines: credscan: lastModifiedDate: 2024-09-13 eslint: - lastModifiedDate: 2024-09-13 + lastModifiedDate: 2026-05-13 psscriptanalyzer: - lastModifiedDate: 2024-09-13 + lastModifiedDate: 2026-05-13 armory: - lastModifiedDate: 2024-09-13 + lastModifiedDate: 2026-05-13 accessibilityinsights: lastModifiedDate: 2025-06-03 binary: credscan: lastModifiedDate: 2025-01-28 binskim: - lastModifiedDate: 2025-04-28 + lastModifiedDate: 2026-05-13 spotbugs: - lastModifiedDate: 2025-01-28 + lastModifiedDate: 2026-05-13 diff --git a/.config/guardian/.gdnbaselines b/.config/guardian/.gdnbaselines new file mode 100644 index 000000000..5ed019a92 --- /dev/null +++ b/.config/guardian/.gdnbaselines @@ -0,0 +1,53 @@ +{ + "properties": { + "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/baselines" + }, + "version": "1.0.0", + "baselines": { + "default": { + "name": "default", + "createdDate": "2026-05-13 00:39:09Z", + "lastUpdatedDate": "2026-05-13 00:40:41Z" + } + }, + "results": { + "89411c6a070fd31f2836b38a16926ffbfb4882aff49c907cafe6c95dfba1104a": { + "signature": "89411c6a070fd31f2836b38a16926ffbfb4882aff49c907cafe6c95dfba1104a", + "alternativeSignatures": [ + "59104f1c3fec111fba3f6b5b6d2d37f3bc0d5267b425f82b8c3f852abc8b2b7a", + "4dee2b2a1887d7a952ae5c61e48c9b6f543096940991cdcd0209c60561a537ce", + "558e542a1dcc76100e4395b278f8b99f1dab960b2b3ae01a4c5cb84ac5cdc70f" + ], + "target": "src/Microsoft.OpenApi/Writers/SpecialCharacterStringExtensions.cs", + "line": 152, + "uriBaseId": "file:///D:/a/_work/1/s/", + "memberOf": [ + "default" + ], + "tool": "roslynanalyzers", + "ruleId": "CA1310", + "createdDate": "2026-05-13 00:39:09Z", + "expirationDate": "2026-10-30 00:42:11Z", + "justification": "This error is baselined with an expiration date of 180 days from 2026-05-13 00:42:11Z" + }, + "f6386b2f2aa1886a31fd1b57fa9e476ff5f24efbe144c82246f931e688010861": { + "signature": "f6386b2f2aa1886a31fd1b57fa9e476ff5f24efbe144c82246f931e688010861", + "alternativeSignatures": [ + "eb5bc1ea05b68f4106e441c8d441b39afaea833e5b2cbf6804d34cb869d9ed00", + "bbe095dbf06a503925246de4a84cdc73afdafeddde3dab2440302c40560f811e", + "aaac06605663a64f92dc03d6aacf9a424f2d861eba86f4ffa06cd231479734a8" + ], + "target": "src/Microsoft.OpenApi/Reader/V2/OpenApiDocumentDeserializer.cs", + "line": 179, + "uriBaseId": "file:///D:/a/_work/1/s/", + "memberOf": [ + "default" + ], + "tool": "roslynanalyzers", + "ruleId": "CA1310", + "createdDate": "2026-05-13 00:39:09Z", + "expirationDate": "2026-10-30 00:42:11Z", + "justification": "This error is baselined with an expiration date of 180 days from 2026-05-13 00:42:11Z" + } + } +} \ No newline at end of file From 93448a95d2bea5171acf79fb5f4e35c072031b5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 06:27:52 +0000 Subject: [PATCH 08/12] Bump the coverlet group with 2 updates Bumps coverlet.collector from 10.0.0 to 10.0.1 Bumps coverlet.msbuild from 10.0.0 to 10.0.1 --- updated-dependencies: - dependency-name: coverlet.collector dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: coverlet - dependency-name: coverlet.collector dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: coverlet - dependency-name: coverlet.msbuild dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: coverlet - dependency-name: coverlet.msbuild dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: coverlet ... Signed-off-by: dependabot[bot] --- .../Microsoft.OpenApi.Hidi.Tests.csproj | 4 ++-- .../Microsoft.OpenApi.Readers.Tests.csproj | 4 ++-- test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj index 84f3e3ddd..d0766cb56 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj +++ b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj @@ -13,12 +13,12 @@ - + - + diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index 683a480df..d8ea9ff74 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 7dabac677..427c84eb1 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -8,8 +8,8 @@ - - + + From eb8a215d1e055fabf81ae4238907ebaadb449077 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 14:18:03 +0000 Subject: [PATCH 09/12] Bump Microsoft.SourceLink.GitHub from 10.0.203 to 10.0.300 --- updated-dependencies: - dependency-name: Microsoft.SourceLink.GitHub dependency-version: 10.0.300 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 86e5a6bf9..5770d48f9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -19,6 +19,6 @@ true - + \ No newline at end of file From 91a989fdf412a1267debe925d2d586292fdd297d Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 26 May 2026 07:12:29 -0400 Subject: [PATCH 10/12] fix(library): handle circular schema references Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../References/BaseOpenApiReferenceHolder.cs | 22 +++-- .../Services/OpenApiWalker.cs | 21 ++--- .../Reader/OpenApiModelFactoryTests.cs | 90 +++++++++++++++++++ 3 files changed, 114 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs index 3ea599592..ed2936bd4 100644 --- a/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs +++ b/src/Microsoft.OpenApi/Models/References/BaseOpenApiReferenceHolder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Microsoft.OpenApi; /// @@ -23,13 +24,24 @@ public T? RecursiveTarget { get { - return Target switch { - BaseOpenApiReferenceHolder recursiveTarget => recursiveTarget.RecursiveTarget, - T concrete => concrete, - _ => null - }; + return ResolveRecursiveTarget(new HashSet>()); } } + + private T? ResolveRecursiveTarget(ISet> visitedReferences) + { + if (!visitedReferences.Add(this)) + { + throw new InvalidOperationException($"Circular reference detected while resolving reference: {Reference.ReferenceV3}"); + } + + return Target switch + { + BaseOpenApiReferenceHolder recursiveTarget => recursiveTarget.ResolveRecursiveTarget(visitedReferences), + T concrete => concrete, + _ => null + }; + } /// /// Copy the reference as a target element with overrides. /// diff --git a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs index 01172cdd1..9b9235030 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiWalker.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiWalker.cs @@ -904,11 +904,17 @@ internal void Walk(OpenApiEncoding encoding) /// internal void Walk(IOpenApiSchema? schema, bool isComponent = false) { - if (schema == null || schema is IOpenApiReferenceHolder holder && ProcessAsReference(holder, isComponent)) + if (schema == null) { return; } + if (schema is IOpenApiReferenceHolder holder) + { + Walk(holder); + return; + } + if (_schemaLoop.Contains(schema)) { return; // Loop detected, this schema has already been walked. @@ -1353,19 +1359,6 @@ private void WalkDictionary( } } - /// - /// Identify if an element is just a reference to a component, or an actual component - /// - private bool ProcessAsReference(IOpenApiReferenceHolder referenceableHolder, bool isComponent = false) - { - var isReference = !isComponent || referenceableHolder.UnresolvedReference; - if (isReference) - { - Walk(referenceableHolder); - } - return isReference; - } - private void WalkTags(ISet tags, Action walk) where T : IOpenApiTag { diff --git a/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs b/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs index c3d1f87d1..595daabae 100644 --- a/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs +++ b/test/Microsoft.OpenApi.Tests/Reader/OpenApiModelFactoryTests.cs @@ -9,6 +9,96 @@ namespace Microsoft.OpenApi.Tests.Reader; public class OpenApiModelFactoryTests { + [Fact] + public async Task LoadDocumentWithCircularSchemaPropertyReferencesShouldSucceed() + { + var filePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid():N}.json"); + await File.WriteAllTextAsync(filePath, """ +{ + "openapi": "3.0.0", + "info": { + "title": "Test", + "version": "0.0.1" + }, + "paths": {}, + "components": { + "schemas": { + "A": { + "properties": { + "b": { + "$ref": "#/components/schemas/B" + } + } + }, + "B": { + "properties": { + "a": { + "$ref": "#/components/schemas/A" + } + } + } + } + } +} +"""); + + try + { + var result = await OpenApiDocument.LoadAsync(filePath); + + Assert.NotNull(result.Document); + Assert.Empty(result.Diagnostic.Errors); + + var schemaA = Assert.IsType(result.Document.Components.Schemas["A"]); + var schemaBReference = Assert.IsType(schemaA.Properties["b"]); + Assert.Same(result.Document.Components.Schemas["B"], schemaBReference.Target); + } + finally + { + File.Delete(filePath); + } + } + + [Fact] + public async Task LoadDocumentWithCircularRootSchemaReferencesShouldReturnDiagnosticWarning() + { + var filePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid():N}.json"); + await File.WriteAllTextAsync(filePath, """ +{ + "openapi": "3.0.0", + "info": { + "title": "Test", + "version": "0.0.1" + }, + "paths": {}, + "components": { + "schemas": { + "A": { + "$ref": "#/components/schemas/B" + }, + "B": { + "$ref": "#/components/schemas/A" + } + } + } +} +"""); + + try + { + var result = await OpenApiDocument.LoadAsync(filePath); + + Assert.NotNull(result.Document); + Assert.Empty(result.Diagnostic.Errors); + Assert.Contains(result.Diagnostic.Warnings, + warning => warning.Message.StartsWith("Circular reference detected while resolving reference:", StringComparison.Ordinal)); + } + finally + { + File.Delete(filePath); + } + } + [Fact] public async Task UsesSettingsBaseUrl() { From 18637f9108f57444e39b90a4f50cf27329a88c22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 May 2026 15:03:45 +0000 Subject: [PATCH 11/12] chore(benchmark): refresh benchmark reports Agent-Logs-Url: https://github.com/microsoft/OpenAPI.NET/sessions/edaed9f0-284e-4166-b3d8-5a7bd5022b9c Co-authored-by: baywet <7905502+baywet@users.noreply.github.com> --- .../performance.Descriptions-report-github.md | 26 +++---- .../performance.Descriptions-report.csv | 14 ++-- .../performance.Descriptions-report.html | 26 +++---- .../performance.Descriptions-report.json | 2 +- .../performance.EmptyModels-report-github.md | 70 +++++++++---------- .../performance.EmptyModels-report.csv | 58 +++++++-------- .../performance.EmptyModels-report.html | 68 +++++++++--------- .../performance.EmptyModels-report.json | 2 +- 8 files changed, 133 insertions(+), 133 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 1af965d08..d190a20d0 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md @@ -1,20 +1,20 @@ ``` -BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7840/25H2/2025Update/HudsonValley2) -AMD Ryzen 7 7800X3D 4.20GHz, 1 CPU, 16 logical and 8 physical cores -.NET SDK 8.0.418 - [Host] : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4 - ShortRun : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4 +BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) +Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 logical and 2 physical cores +.NET SDK 10.0.300 + [Host] : .NET 8.0.27 (8.0.27, 8.0.2726.22922), X64 RyuJIT x86-64-v4 + ShortRun : .NET 8.0.27 (8.0.27, 8.0.2726.22922), X64 RyuJIT x86-64-v4 Job=ShortRun IterationCount=3 LaunchCount=1 WarmupCount=3 ``` -| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | -|------------- |-------------:|--------------:|-------------:|-----------:|----------:|----------:|-------------:| -| PetStoreYaml | 261.1 μs | 105.89 μs | 5.80 μs | 5.8594 | - | - | 361.38 KB | -| PetStoreJson | 101.9 μs | 48.20 μs | 2.64 μs | 4.3945 | 0.9766 | - | 223.52 KB | -| GHESYaml | 602,932.7 μs | 170,410.86 μs | 9,340.79 μs | 9000.0000 | 8000.0000 | 2000.0000 | 345336.55 KB | -| GHESJson | 254,976.7 μs | 111,875.43 μs | 6,132.27 μs | 4000.0000 | 3000.0000 | 1000.0000 | 206858.06 KB | -| GHESNextYaml | 729,602.0 μs | 357,122.29 μs | 19,575.08 μs | 13000.0000 | 9000.0000 | 2000.0000 | 541566.37 KB | -| GHESNextJson | 378,208.4 μs | 109,458.45 μs | 5,999.79 μs | 8000.0000 | 5000.0000 | 1000.0000 | 406762.41 KB | +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | +|------------- |---------------:|--------------:|------------:|-----------:|-----------:|----------:|-------------:| +| PetStoreYaml | 480.2 μs | 50.16 μs | 2.75 μs | 11.7188 | - | - | 363.98 KB | +| PetStoreJson | 215.4 μs | 27.68 μs | 1.52 μs | 8.7891 | 1.9531 | - | 225.84 KB | +| GHESYaml | 1,034,639.0 μs | 99,755.13 μs | 5,467.92 μs | 17000.0000 | 14000.0000 | 3000.0000 | 345962.32 KB | +| GHESJson | 414,562.3 μs | 57,822.66 μs | 3,169.46 μs | 8000.0000 | 6000.0000 | 1000.0000 | 207483.96 KB | +| GHESNextYaml | 1,233,870.1 μs | 138,213.19 μs | 7,575.93 μs | 25000.0000 | 15000.0000 | 3000.0000 | 542594.95 KB | +| GHESNextJson | 649,688.9 μs | 72,965.05 μs | 3,999.46 μs | 16000.0000 | 8000.0000 | 1000.0000 | 407786.32 KB | diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv index 963b9ce2e..8ce3ff619 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv @@ -1,7 +1,7 @@ -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;1111111111111111;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;261.1 μs;105.89 μs;5.80 μs;5.8594;0.0000;0.0000;361.38 KB -PetStoreJson;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;101.9 μs;48.20 μs;2.64 μs;4.3945;0.9766;0.0000;223.52 KB -GHESYaml;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"602,932.7 μs";"170,410.86 μs";"9,340.79 μs";9000.0000;8000.0000;2000.0000;345336.55 KB -GHESJson;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"254,976.7 μs";"111,875.43 μs";"6,132.27 μs";4000.0000;3000.0000;1000.0000;206858.06 KB -GHESNextYaml;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"729,602.0 μs";"357,122.29 μs";"19,575.08 μs";13000.0000;9000.0000;2000.0000;541566.37 KB -GHESNextJson;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"378,208.4 μs";"109,458.45 μs";"5,999.79 μs";8000.0000;5000.0000;1000.0000;406762.41 KB +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,480.2 μs,50.16 μs,2.75 μs,11.7188,0.0000,0.0000,363.98 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,215.4 μs,27.68 μs,1.52 μs,8.7891,1.9531,0.0000,225.84 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,034,639.0 μs","99,755.13 μs","5,467.92 μs",17000.0000,14000.0000,3000.0000,345962.32 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,"414,562.3 μs","57,822.66 μs","3,169.46 μs",8000.0000,6000.0000,1000.0000,207483.96 KB +GHESNextYaml,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,233,870.1 μs","138,213.19 μs","7,575.93 μs",25000.0000,15000.0000,3000.0000,542594.95 KB +GHESNextJson,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,"649,688.9 μs","72,965.05 μs","3,999.46 μs",16000.0000,8000.0000,1000.0000,407786.32 KB diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html index a5a17b789..9cd26a52f 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-20260223-221211 +performance.Descriptions-20260526-145612