diff --git a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java index 41425bca06..b185a7c944 100644 --- a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java +++ b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java @@ -14,10 +14,14 @@ import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.tags.Tag; +import io.swagger.v3.parser.OpenAPIV3Parser; import io.swagger.v3.parser.converter.SwaggerConverter; +import io.swagger.v3.parser.core.extensions.SwaggerParserExtension; import io.swagger.v3.parser.core.models.AuthorizationValue; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; + +import org.testng.Assert; import org.testng.annotations.Test; import java.io.IOException; @@ -923,4 +927,42 @@ public void testConvertFormDataAsObjectSchema() throws Exception { assertEquals(companiesSchema.getClass(), ObjectSchema.class); } + + /** + * A clone (almost) of {@link OpenAPIV3Parser#readContents(String, List, ParseOptions)}. + */ + private OpenAPI read(String location, List auths, ParseOptions resolve, final List parserExtensions) { + if (location == null) { + return null; + } + SwaggerParseResult parsed; + for (SwaggerParserExtension extension : parserExtensions) { + parsed = extension.readLocation(location, auths, resolve); + if (parsed.getMessages() != null) { + for (String message : parsed.getMessages()) { + // LOGGER.info("{}: {}", extension, message); + } + } + final OpenAPI result = parsed.getOpenAPI(); + if (result != null) { + return result; + } + } + return null; + } + + /** + * Tests an NPE when bother the old and new parser are on the classpath. The only way to test this is cloning the + * {@link OpenAPIV3Parser#readContents(String, List, ParseOptions)} to see the NPE when we pass in the extentions. Instead of, for example, mocking the call + * to {@link io.swagger.v3.parser.OpenAPIV3Parser.getExtensions()}. + */ + @Test + public void testIssue2046() { + ParseOptions options = new ParseOptions(); + options.setResolve(true); + // This should not throw an NPE: + final OpenAPI openAPI = read("I/do/not/exist/on/the/file/system/I/really/do/not.yaml", null, options, Arrays.asList(new SwaggerConverter())); + Assert.assertNull(openAPI); + } + } diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java index ac3a7f2c41..bcf0af8a4c 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java @@ -122,8 +122,10 @@ public OpenAPI read(String location, List auths, ParseOption SwaggerParseResult parsed; for (SwaggerParserExtension extension : parserExtensions) { parsed = extension.readLocation(location, auths, resolve); - for (String message : parsed.getMessages()) { - LOGGER.info("{}: {}", extension, message); + if (parsed.getMessages() != null) { + for (String message : parsed.getMessages()) { + LOGGER.info("{}: {}", extension, message); + } } final OpenAPI result = parsed.getOpenAPI(); if (result != null) {