From: Robert Varga Date: Mon, 3 Jan 2022 12:54:16 +0000 (+0100) Subject: Do not mask single exceptions X-Git-Tag: v8.0.0~92 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F85%2F99185%2F3;p=yangtools.git Do not mask single exceptions If we end up with a single exception, do not wrap it in InferenceException, as we want to correctly identify whether it is a problem with the source or inference. Change-Id: I9963ec5067145b5886a2bf20cba4bd8104794afe Signed-off-by: Robert Varga --- diff --git a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java index 0d1b582140..d34b4e19af 100644 --- a/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java +++ b/parser/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java @@ -386,15 +386,17 @@ final class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeha } } - if (exceptions.isEmpty()) { - return Optional.empty(); + switch (exceptions.size()) { + case 0: + return Optional.empty(); + case 1: + return Optional.of(exceptions.get(0)); + default: + final String message = String.format("Yang model processing phase %s failed", identifier); + final InferenceException ex = new InferenceException(message, root, exceptions.get(0)); + exceptions.listIterator(1).forEachRemaining(ex::addSuppressed); + return Optional.of(ex); } - - final String message = String.format("Yang model processing phase %s failed", identifier); - final InferenceException e = new InferenceException(message, root, exceptions.get(0)); - exceptions.listIterator(1).forEachRemaining(e::addSuppressed); - - return Optional.of(e); } void loadStatements() { diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentToExtensionTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentToExtensionTest.java index bf8edd5e59..c9e9392f0f 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentToExtensionTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/AugmentToExtensionTest.java @@ -7,9 +7,7 @@ */ package org.opendaylight.yangtools.yang.stmt; -import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -18,18 +16,12 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.UsesNode; -import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; public class AugmentToExtensionTest extends AbstractYangTest { @Test public void testIncorrectPath() throws Exception { - // FIXME: this should not be here, or why do we need encapsulation? Add asserts for that - final var cause = assertInferenceExceptionDir("/augment-to-extension-test/incorrect-path", - startsWith("Yang model processing phase EFFECTIVE_MODEL failed [at ")); - - final var firstCause = cause.getCause(); - assertThat(firstCause, instanceOf(InferenceException.class)); - assertThat(firstCause.getMessage(), startsWith("Augment target " + assertInferenceExceptionDir("/augment-to-extension-test/incorrect-path", + startsWith("Augment target " + "'Descendant{qnames=[(uri:augment-module?revision=2014-10-07)my-extension-name-a, input]}'" + " not found [at ")); } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6240Test.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6240Test.java index e10dcfc724..f44361f384 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6240Test.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug6240Test.java @@ -7,29 +7,30 @@ */ package org.opendaylight.yangtools.yang.stmt; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertThrows; -import java.util.Collection; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -public class Bug6240Test { +public class Bug6240Test extends AbstractYangTest { private static final String NS = "bar"; private static final String REV = "2016-07-19"; @Test public void testModels() throws Exception { - final SchemaContext context = StmtTestUtils.parseYangSources("/bugs/bug6240/correct"); - assertNotNull(context); + final var context = assertEffectiveModelDir("/bugs/bug6240/correct"); - final Collection modules = context.getModules(); + final var modules = context.getModules(); assertEquals(2, modules.size()); Module bar = null; @@ -41,27 +42,28 @@ public class Bug6240Test { } assertNotNull(bar); - assertTrue(bar.getDataChildByName(QName.create(NS, REV, "foo-grp-con")) instanceof ContainerSchemaNode); - assertTrue(bar.getDataChildByName(QName.create(NS, REV, "sub-foo-grp-con")) instanceof ContainerSchemaNode); + assertThat(bar.getDataChildByName(QName.create(NS, REV, "foo-grp-con")), instanceOf(ContainerSchemaNode.class)); + assertThat(bar.getDataChildByName(QName.create(NS, REV, "sub-foo-grp-con")), + instanceOf(ContainerSchemaNode.class)); assertEquals(1, bar.getSubmodules().size()); final DataSchemaNode dataChildByName = bar.getDataChildByName(QName.create(NS, REV, "sub-bar-con")); - assertTrue(dataChildByName instanceof ContainerSchemaNode); + assertThat(dataChildByName, instanceOf(ContainerSchemaNode.class)); final ContainerSchemaNode subBarCon = (ContainerSchemaNode) dataChildByName; - assertTrue(subBarCon.getDataChildByName(QName.create(NS, REV, "foo-grp-con")) instanceof ContainerSchemaNode); - assertTrue(subBarCon.getDataChildByName(QName.create(NS, REV, "sub-foo-grp-con")) - instanceof ContainerSchemaNode); + assertThat(subBarCon.getDataChildByName(QName.create(NS, REV, "foo-grp-con")), + instanceOf(ContainerSchemaNode.class)); + assertThat(subBarCon.getDataChildByName(QName.create(NS, REV, "sub-foo-grp-con")), + instanceOf(ContainerSchemaNode.class)); } @Test - public void testInvalidModels() throws Exception { - try { - StmtTestUtils.parseYangSources("/bugs/bug6240/incorrect"); - } catch (final SomeModifiersUnresolvedException e) { - assertTrue(e.getCause().getCause().getMessage().startsWith( - "Grouping '(bar?revision=2016-07-19)foo-imp-grp' was not resolved.")); - } + public void testInvalidModels() { + final var ex = assertThrows(SomeModifiersUnresolvedException.class, + () -> StmtTestUtils.parseYangSources("/bugs/bug6240/incorrect")); + final var cause = ex.getCause(); + assertThat(cause, instanceOf(SourceException.class)); + assertThat(cause.getMessage(), startsWith("Grouping '(bar?revision=2016-07-19)foo-imp-grp' was not resolved.")); } } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug7480Test.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug7480Test.java index bea668a07d..f2224c3c86 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug7480Test.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/Bug7480Test.java @@ -54,7 +54,7 @@ public class Bug7480Test { final var ex = assertThrows(SomeModifiersUnresolvedException.class, () -> parseYangSources("/bugs/bug7480/files-2", "/bugs/bug7480/lib-2")); final String message = ex.getSuppressed().length > 0 - ? ex.getSuppressed()[0].getCause().getMessage() : ex.getCause().getCause().getMessage(); + ? ex.getSuppressed()[0].getMessage() : ex.getCause().getMessage(); assertThat(message, startsWith("Imported module [missing-lib] was not found.")); } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java index 954b74c878..648f644f36 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/DeviationResolutionTest.java @@ -268,7 +268,7 @@ public class DeviationResolutionTest { final ReactorException ex = assertThrows(ReactorException.class, () -> TestUtils.parseYangSource( "/deviation-resolution-test/foo-invalid-deviation-path.yang", "/deviation-resolution-test/bar.yang")); - final Throwable cause = ex.getCause().getCause(); + final Throwable cause = ex.getCause(); assertThat(cause, instanceOf(InferenceException.class)); assertThat(cause.getMessage(), startsWith( "Deviation target 'Absolute{qnames=[(bar?revision=2017-01-20)invalid, path]}' not found")); diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionBorderCaseTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionBorderCaseTest.java index 4e40aa701d..d645e185f2 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionBorderCaseTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionBorderCaseTest.java @@ -80,7 +80,7 @@ public class OpenconfigVersionBorderCaseTest { public void borderCaseInvalidMajorTest() throws Exception { final ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/border-case/border-case-invalid-major", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(5.5.5)].")); } @@ -88,7 +88,7 @@ public class OpenconfigVersionBorderCaseTest { public void borderCaseInvalidMinorTest() { final ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/border-case/border-case-invalid-minor", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(5.5.5)].")); } @@ -96,7 +96,7 @@ public class OpenconfigVersionBorderCaseTest { public void borderCaseInvalidPatchTest() throws Exception { final ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/border-case/border-case-invalid-patch", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(5.5.5)].")); } } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionDefaultsTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionDefaultsTest.java index 4254595aa7..1f1e23ceb2 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionDefaultsTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionDefaultsTest.java @@ -7,17 +7,17 @@ */ package org.opendaylight.yangtools.yang.stmt.openconfigver; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertThrows; import java.util.Optional; import org.junit.Test; import org.opendaylight.yangtools.concepts.SemVer; import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode; import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration; import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; @@ -30,7 +30,7 @@ public class OpenconfigVersionDefaultsTest { @Test public void defaultsTest() throws Exception { - SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/defaults/defaults", SEMVER); + final var context = StmtTestUtils.parseYangSources("/openconfig-version/defaults/defaults", SEMVER); assertNotNull(context); Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next(); @@ -42,7 +42,7 @@ public class OpenconfigVersionDefaultsTest { @Test public void defaultMajorValidTest() throws Exception { - SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/defaults/default-major-valid", + final var context = StmtTestUtils.parseYangSources("/openconfig-version/defaults/default-major-valid", SEMVER); assertNotNull(context); @@ -55,12 +55,9 @@ public class OpenconfigVersionDefaultsTest { @Test public void defaultMajorInvalidTest() throws Exception { - try { - StmtTestUtils.parseYangSources("/openconfig-version/defaults/default-major-invalid", SEMVER); - fail("Test should fail due to invalid openconfig version"); - } catch (ReactorException e) { - assertTrue(e.getCause().getCause().getMessage() - .startsWith("Unable to find module compatible with requested import [bar(0.0.1)].")); - } + final var ex = assertThrows(ReactorException.class, + () -> StmtTestUtils.parseYangSources("/openconfig-version/defaults/default-major-invalid", SEMVER)); + assertThat(ex.getCause().getMessage(), + startsWith("Unable to find module compatible with requested import [bar(0.0.1)].")); } } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionImportTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionImportTest.java index 02457ddf77..d9ea7a976e 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionImportTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionImportTest.java @@ -43,7 +43,7 @@ public class OpenconfigVersionImportTest { public void importInvalidDeprecatedTest1() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/import/import-invalid-deprecated-1", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), startsWith( + assertThat(ex.getCause().getMessage(), startsWith( "Unable to find module compatible with requested import [openconfig-extensions(1.0.0)].")); } @@ -51,7 +51,7 @@ public class OpenconfigVersionImportTest { public void importInvalidDeprecatedTest2() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/import/import-invalid-deprecated-2", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), startsWith( + assertThat(ex.getCause().getMessage(), startsWith( "Unable to find module compatible with requested import [openconfig-extensions(0.9.9)].")); } @@ -59,7 +59,7 @@ public class OpenconfigVersionImportTest { public void importInvalidNotsufficientTest1() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/import/import-invalid-notsufficient-1", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), startsWith( + assertThat(ex.getCause().getMessage(), startsWith( "Unable to find module compatible with requested import [openconfig-extensions(2.0.0)].")); } @@ -67,7 +67,7 @@ public class OpenconfigVersionImportTest { public void importInvalidNotsufficientTest2() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/import/import-invalid-notsufficient-2", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), startsWith( + assertThat(ex.getCause().getMessage(), startsWith( "Unable to find module compatible with requested import [openconfig-extensions(2.0.5)].")); } } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionMultipleImportTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionMultipleImportTest.java index 7c0209356e..a9febc3c41 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionMultipleImportTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionMultipleImportTest.java @@ -30,18 +30,18 @@ public class OpenconfigVersionMultipleImportTest { .build(); @Test - public void multipleInvalidDeprecatedTest() throws Exception { + public void multipleInvalidDeprecatedTest() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/multiple/multiple-invalid-deprecated", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(1.0.0)].")); } @Test - public void multipleInvalidNosufficientTest() throws Exception { + public void multipleInvalidNosufficientTest() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/multiple/multiple-invalid-nosufficient", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(2.5.5)].")); } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionTest.java index 577649e400..639c36a1e1 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/OpenconfigVersionTest.java @@ -108,18 +108,18 @@ public class OpenconfigVersionTest { } @Test - public void basicImportErrTest1() throws Exception { + public void basicImportErrTest1() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/basic-import-invalid-1", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(0.1.2)].")); } @Test - public void basicImportErrTest2() throws Exception { + public void basicImportErrTest2() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYangSources("/openconfig-version/basic-import-invalid-2", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(0.1.2)].")); } diff --git a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/yin/YinOpenconfigVersionTest.java b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/yin/YinOpenconfigVersionTest.java index b2e8469a1c..99ef806473 100644 --- a/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/yin/YinOpenconfigVersionTest.java +++ b/parser/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/openconfigver/yin/YinOpenconfigVersionTest.java @@ -62,10 +62,10 @@ public class YinOpenconfigVersionTest { } @Test - public void basicImportErrTest1() throws URISyntaxException, SAXException, IOException { + public void basicImportErrTest1() { ReactorException ex = assertThrows(ReactorException.class, () -> StmtTestUtils.parseYinSources("/openconfig-version/yin-input/basic-import-invalid", SEMVER)); - assertThat(ex.getCause().getCause().getMessage(), + assertThat(ex.getCause().getMessage(), startsWith("Unable to find module compatible with requested import [bar(0.1.2)].")); } }