From 91959cf2854914c6dfbae68f4f794b4c034b891f Mon Sep 17 00:00:00 2001 From: Mikkel Arentoft Date: Mon, 31 Jan 2022 11:51:59 +0100 Subject: [PATCH 1/2] Fixing the stack overflow exception when rendering details regarding new properties in schemas refering recursingly to each other --- .../openapidiff/core/output/MarkdownRender.java | 6 ++++++ .../openapitools/openapidiff/core/MarkdownRenderTest.java | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java index 0ba345175..ad74bd610 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/output/MarkdownRender.java @@ -11,8 +11,10 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.openapitools.openapidiff.core.model.*; import org.openapitools.openapidiff.core.utils.RefPointer; @@ -35,6 +37,7 @@ public class MarkdownRender implements Render { protected RefPointer> refPointer = new RefPointer<>(RefType.SCHEMAS); protected ChangedOpenApi diff; + protected Set> handledSchemas = new HashSet<>(); /** * A parameter which indicates whether or not metadata (summary and metadata) changes should be * logged in the changelog file. @@ -43,6 +46,7 @@ public class MarkdownRender implements Render { public String render(ChangedOpenApi diff) { this.diff = diff; + this.handledSchemas.clear(); return listEndpoints("What's New", diff.getNewEndpoints()) + listEndpoints("What's Deleted", diff.getMissingEndpoints()) + listEndpoints("What's Deprecated", diff.getDeprecatedEndpoints()) @@ -335,6 +339,8 @@ protected String schema(int deepness, ComposedSchema schema, DiffContext context } protected String schema(int deepness, Schema schema, DiffContext context) { + if (handledSchemas.contains(schema)) return ""; + handledSchemas.add(schema); StringBuilder sb = new StringBuilder(); sb.append(listItem(deepness, "Enum", schema.getEnum())); sb.append(properties(deepness, "Property", schema.getProperties(), true, context)); diff --git a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java index c92a1cd8c..154fef127 100644 --- a/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java +++ b/core/src/test/java/org/openapitools/openapidiff/core/MarkdownRenderTest.java @@ -14,4 +14,11 @@ public void renderDoesNotFailWhenPropertyHasBeenRemoved() { OpenApiCompare.fromLocations("missing_property_1.yaml", "missing_property_2.yaml"); assertThat(render.render(diff)).isNotBlank(); } + + @Test + public void renderDoesNotCauseStackOverflowWithRecursiveDefinitions() { + MarkdownRender render = new MarkdownRender(); + ChangedOpenApi diff = OpenApiCompare.fromLocations("recursive_old.yaml", "recursive_new.yaml"); + assertThat(render.render(diff)).isNotBlank(); + } } From ca255977a28e2b60839841e3af214f2f08e9cc97 Mon Sep 17 00:00:00 2001 From: Mikkel Arentoft Date: Mon, 31 Jan 2022 11:52:29 +0100 Subject: [PATCH 2/2] Adding missing test files --- core/src/test/resources/recursive_new.yaml | 29 ++++++++++++++++++++++ core/src/test/resources/recursive_old.yaml | 29 ++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 core/src/test/resources/recursive_new.yaml create mode 100644 core/src/test/resources/recursive_old.yaml diff --git a/core/src/test/resources/recursive_new.yaml b/core/src/test/resources/recursive_new.yaml new file mode 100644 index 000000000..be1688ebc --- /dev/null +++ b/core/src/test/resources/recursive_new.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.1 +info: + title: recursive test + version: "1.0" +servers: + - url: "http://localhost:8000/" +paths: + /ping: + get: + operationId: ping + responses: + "200": + description: OK + content: + text/plain: + schema: + $ref: "#/components/schemas/A" +components: + schemas: + A: + type: object + properties: + propname2: + $ref: "#/components/schemas/B" + B: + type: object + properties: + propname2: + $ref: "#/components/schemas/A" \ No newline at end of file diff --git a/core/src/test/resources/recursive_old.yaml b/core/src/test/resources/recursive_old.yaml new file mode 100644 index 000000000..83788675c --- /dev/null +++ b/core/src/test/resources/recursive_old.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.1 +info: + title: recursive test + version: "1.0" +servers: + - url: "http://localhost:8000/" +paths: + /ping: + get: + operationId: ping + responses: + "200": + description: OK + content: + text/plain: + schema: + $ref: "#/components/schemas/A" +components: + schemas: + A: + type: object + properties: + propname: + $ref: "#/components/schemas/B" + B: + type: object + properties: + propname: + $ref: "#/components/schemas/A" \ No newline at end of file