X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-java-api-generator%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjava%2Fapi%2Fgenerator%2FCompilationTest.java;h=53ce2472609e67828a4f7c76927a454a3d320219;hb=163325d8770b579bb88151521c80efec9eee9bb5;hp=1a965008ad8ab05c9a36181d7f219ec4fdceb72b;hpb=3c9775dd5d6f144df872e6451a07aa55a4e5b7f3;p=mdsal.git diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/CompilationTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/CompilationTest.java index 1a965008ad..53ce247260 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/CompilationTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/CompilationTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import com.google.common.collect.Collections2; @@ -24,6 +25,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.lang.reflect.WildcardType; import java.net.URISyntaxException; import java.net.URL; @@ -31,6 +33,7 @@ import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HexFormat; import java.util.List; import java.util.stream.Collectors; import org.junit.Test; @@ -118,7 +121,7 @@ public class CompilationTest extends BaseCompilationTest { // Test generated 'list links' assertTrue(linksClass.isInterface()); CompilationTestUtils.assertImplementsIfc(linksClass, keyArgsClass); - assertEquals(7, abstractMethods(linksClass).size()); + assertEquals(8, abstractMethods(linksClass).size()); CompilationTestUtils.assertContainsMethod(linksClass, "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.links.Text", "getText", loader); CompilationTestUtils.assertContainsMethod(linksClass, @@ -134,6 +137,56 @@ public class CompilationTest extends BaseCompilationTest { CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir); } + /** + * Test that nonnull getter method is generated for non-presence containers only. + * + * @throws Exception when any exception occurs during the test + */ + @Test + public void testContainerGettersGeneration() throws Exception { + final File sourcesOutputDir = CompilationTestUtils.generatorOutput("containers-gen"); + final File compiledOutputDir = CompilationTestUtils.compilerOutput("containers-gen"); + generateTestSources("/compilation/containers-gen", sourcesOutputDir); + + // Test if all sources were generated from 'module containers' + File parent = new File(sourcesOutputDir, CompilationTestUtils.NS_TEST); + assertTrue(new File(parent, "RootContainer.java").exists()); + assertTrue(new File(parent, "rootcontainer/PresenceContainer.java").exists()); + assertTrue(new File(parent, "rootcontainer/NonPresenceContainer.java").exists()); + CompilationTestUtils.assertFilesCount(parent, 5); + + // Test if sources are compilable + CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir); + + final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); + final Class rootClass = Class.forName(CompilationTestUtils.BASE_PKG + + ".urn.opendaylight.test.rev131008.RootContainer", true, loader); + + // Test generated 'container root' + assertTrue(rootClass.isInterface()); + assertEquals(3, abstractMethods(rootClass).size()); + + // Test generated getter and not-generated nonnull method for presence container + CompilationTestUtils.assertContainsMethod(rootClass, + "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.rootcontainer.PresenceContainer", + "getPresenceContainer", loader); + final var error = assertThrows(AssertionError.class, () -> + CompilationTestUtils.assertContainsMethod(rootClass, + "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.rootcontainer.PresenceContainer", + "nonnullPresenceContainer", loader)); + assertTrue(error.getCause() instanceof NoSuchMethodException); + + // Test generated getter and nonnull methods for non-presence container + CompilationTestUtils.assertContainsMethod(rootClass, + "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.rootcontainer.NonPresenceContainer", + "getNonPresenceContainer", loader); + CompilationTestUtils.assertContainsMethod(rootClass, + "org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev131008.rootcontainer.NonPresenceContainer", + "nonnullNonPresenceContainer", loader); + + CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir); + } + @Test public void testAugmentUnderUsesGeneration() throws Exception { final File sourcesOutputDir = CompilationTestUtils.generatorOutput("augment-under-uses"); @@ -377,8 +430,7 @@ public class CompilationTest extends BaseCompilationTest { assertTrue(new File(parent, "Nodes.java").exists()); assertTrue(new File(parent, "NodesBuilder.java").exists()); assertTrue(new File(parent, "Alg.java").exists()); - assertTrue(new File(parent, "NodesIdUnionBuilder.java").exists()); - CompilationTestUtils.assertFilesCount(parent, 6); + CompilationTestUtils.assertFilesCount(parent, 5); // Test if sources are compilable CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir); @@ -417,7 +469,7 @@ public class CompilationTest extends BaseCompilationTest { final List> lengthConstraints = new ArrayList<>(); lengthConstraints.add(Range.closed(1, 10)); byte[] arg = new byte[] {}; - String expectedMsg = String.format("Invalid length: %s, expected: %s.", Arrays.toString(arg), + String expectedMsg = String.format("Invalid length: %s, expected: %s.", HexFormat.of().formatHex(arg), lengthConstraints); CompilationTestUtils.assertContainsRestrictionCheck(builderObj, method, expectedMsg, arg); @@ -740,7 +792,7 @@ public class CompilationTest extends BaseCompilationTest { generateTestSources("/compilation/union-string-pattern", sourcesOutputDir); CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir); - final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); + final ClassLoader loader = new URLClassLoader(new URL[]{compiledOutputDir.toURI().toURL()}); final Class fooClass = Class.forName(CompilationTestUtils.BASE_PKG + ".foo.norev.Foo", true, loader); final Field patterns = fooClass.getDeclaredField(TypeConstants.PATTERN_CONSTANT_NAME); @@ -749,19 +801,72 @@ public class CompilationTest extends BaseCompilationTest { CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir); } + @Test + public void yangDataCompilation() throws Exception { + final File sourcesOutputDir = CompilationTestUtils.generatorOutput("yang-data-gen"); + final File compiledOutputDir = CompilationTestUtils.compilerOutput("yang-data-gen"); + + generateTestSources("/compilation/yang-data-gen", sourcesOutputDir); + CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir); + + final ClassLoader loader = new URLClassLoader(new URL[]{compiledOutputDir.toURI().toURL()}); + final List artifactNames = List.of( + // module with top level container + "$YangModuleInfoImpl", "YangDataDemoData", "RootContainer", "RootContainerBuilder", + + // yang-data artifacts + "YangDataWithContainer", "YangDataWithContainerBuilder", + "YangDataWithList", "YangDataWithListBuilder", + "YangDataWithLeaf", "YangDataWithLeafBuilder", + "YangDataWithLeafList", "YangDataWithLeafListBuilder", + "YangDataWithAnydata", "YangDataWithAnydataBuilder", + "YangDataWithAnyxml", "YangDataWithAnyxmlBuilder", + + // yang-data content artifacts + "yang.data.with.container.ContainerFromYangData", + "yang.data.with.container.ContainerFromYangDataBuilder", + "yang.data.with.list.ListFromYangData", "yang.data.with.list.ListFromYangDataBuilder", + "yang.data.with.anydata.AnydataFromYangData", "yang.data.with.anyxml.AnyxmlFromYangData", + + // yang-data artifacts using groups + "YangDataWithContainerFromGroup", "YangDataWithContainerFromGroupBuilder", + "YangDataWithListFromGroup", "YangDataWithListFromGroupBuilder", + "YangDataWithLeafFromGroup", "YangDataWithLeafFromGroupBuilder", + "YangDataWithLeafListFromGroup", "YangDataWithLeafListFromGroupBuilder", + "YangDataWithAnydataFromGroup", "YangDataWithAnydataFromGroupBuilder", + "YangDataWithAnyxmlFromGroup", "YangDataWithAnyxmlFromGroupBuilder", + + // group artifacts + "GrpForContainer", "GrpForList", "GrpForLeaf", "GrpForLeafList", "GrpForAnydata", "GrpForAnyxml", + + // group content artifacts + "grp._for.container.ContainerFromGroup", "grp._for.container.ContainerFromGroupBuilder", + "grp._for.list.ListFromGroup", "grp._for.list.ListFromGroupBuilder", + "grp._for.anydata.AnydataFromGroup", "grp._for.anyxml.AnyxmlFromGroup", + + // artifacts for non-ascii template naming: yang data artifact, inner container + builder + "$ľaľaho$20$papľuhu", "$ľaľaho$20$papľuhuBuilder", + "$ľaľaho$20$papľuhu$.LatinNaming", "$ľaľaho$20$papľuhu$.LatinNamingBuilder", + "привет", "приветBuilder", "привет$.CyrillicNaming", "привет$.CyrillicNamingBuilder" + ); + + for (String name : artifactNames) { + final String className = CompilationTestUtils.BASE_PKG + ".urn.test.yang.data.demo.rev220222." + name; + // ensure class source is generated + final String srcPath = className.replace('.', File.separatorChar) + ".java"; + assertTrue(srcPath + " exists", new File(sourcesOutputDir, srcPath).exists()); + // ensure class is loadable + Class.forName(className, true, loader); + } + + CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir); + } + private static void testReturnTypeIdentityref(final Class clazz, final String methodName, final String returnTypeStr) throws NoSuchMethodException { - Method method = clazz.getMethod(methodName); - assertEquals(java.lang.Class.class, method.getReturnType()); - java.lang.reflect.Type returnType = method.getGenericReturnType(); - assertTrue(returnType instanceof ParameterizedType); - final ParameterizedType pt = (ParameterizedType) returnType; - final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments(); - assertEquals(1, parameters.length); - final java.lang.reflect.Type parameter = parameters[0]; - assertTrue(parameter instanceof WildcardType); - final WildcardType wildcardType = (WildcardType) parameter; - assertEquals("? extends " + returnTypeStr, wildcardType.toString()); + Class returnType = clazz.getMethod(methodName).getReturnType(); + assertTrue(returnType.isInterface()); + assertEquals(returnTypeStr, returnType.getName()); } private static void testReturnTypeInstanceIdentitifer(final ClassLoader loader, final Class clazz, @@ -770,12 +875,12 @@ public class CompilationTest extends BaseCompilationTest { final Class rawReturnType = Class.forName("org.opendaylight.yangtools.yang.binding.InstanceIdentifier", true, loader); assertEquals(rawReturnType, method.getReturnType()); - final java.lang.reflect.Type returnType = method.getGenericReturnType(); + final Type returnType = method.getGenericReturnType(); assertTrue(returnType instanceof ParameterizedType); final ParameterizedType pt = (ParameterizedType) returnType; - final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments(); + final Type[] parameters = pt.getActualTypeArguments(); assertEquals(1, parameters.length); - final java.lang.reflect.Type parameter = parameters[0]; + final Type parameter = parameters[0]; assertTrue(parameter instanceof WildcardType); final WildcardType wildcardType = (WildcardType) parameter; assertEquals("?", wildcardType.toString());