X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=code-generator%2Fbinding-java-api-generator%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fsal%2Fjava%2Fapi%2Fgenerator%2Ftest%2FCompilationTest.java;h=7d45f8f3e44855df84b677a700604123cbdff82d;hb=be1abcbd20819f2adc6b0b4413acc2580a6a1dd5;hp=579b0978a3a3e436119c9562a3ef6c99fc7a5d48;hpb=db53530f72a6852fafb8d99fb1012d27d1616562;p=mdsal.git diff --git a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java index 579b0978a3..7d45f8f3e4 100644 --- a/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java +++ b/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java @@ -9,12 +9,33 @@ package org.opendaylight.yangtools.sal.java.api.generator.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*; - +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.BASE_PKG; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.COMPILER_OUTPUT_PATH; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.FS; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.GENERATOR_OUTPUT_PATH; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_BAR; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_BAZ; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_FOO; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_TEST; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsConstructor; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsField; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsMethod; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsRestrictionCheck; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertFilesCount; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertImplementsIfc; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertImplementsParameterizedIfc; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.cleanUp; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.getSourceFiles; +import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.testCompilation; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Range; import java.io.File; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.WildcardType; import java.math.BigDecimal; @@ -22,25 +43,39 @@ import java.math.BigInteger; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; -import java.util.HashSet; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.List; -import java.util.Set; - import org.junit.Test; import org.opendaylight.yangtools.sal.binding.model.api.Type; import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile; +import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; -import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import com.google.common.collect.Range; - /** * Test correct code generation. * */ public class CompilationTest extends BaseCompilationTest { + /* + * Java 8 allows JaCoCo to hook onto interfaces, as well as + * generating a default implementation. We only want to check + * abstract methods. + */ + private static Collection abstractMethods(final Class clazz) { + // Filter out + return Collections2.filter(Arrays.asList(clazz.getDeclaredMethods()), new Predicate() { + @Override + public boolean apply(final Method input) { + return Modifier.isAbstract(input.getModifiers()); + } + }); + } + @Test public void testListGeneration() throws Exception { final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "list-gen"); @@ -48,20 +83,15 @@ public class CompilationTest extends BaseCompilationTest { final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "list-gen"); assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); - final List sourceFiles = getSourceFiles("/compilation/list-gen"); - final Set modulesToBuild = parser.parseYangModels(sourceFiles); - final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); - final List types = bindingGenerator.generateTypes(context); - final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); - generator.generateToFile(sourcesOutputDir); + generateTestSources("/compilation/list-gen", sourcesOutputDir); // Test if all sources are generated File parent = new File(sourcesOutputDir, NS_TEST); - File keyArgs = new File(parent, "KeyArgs.java"); - File links = new File(parent, "Links.java"); - File linksBuilder = new File(parent, "LinksBuilder.java"); - File linksKey = new File(parent, "LinksKey.java"); - File testData = new File(parent, "TestData.java"); + final File keyArgs = new File(parent, "KeyArgs.java"); + final File links = new File(parent, "Links.java"); + final File linksBuilder = new File(parent, "LinksBuilder.java"); + final File linksKey = new File(parent, "LinksKey.java"); + final File testData = new File(parent, "TestData.java"); assertTrue(keyArgs.exists()); assertTrue(links.exists()); assertTrue(linksBuilder.exists()); @@ -70,13 +100,13 @@ public class CompilationTest extends BaseCompilationTest { assertFilesCount(parent, 6); parent = new File(sourcesOutputDir, NS_TEST + FS + "links"); - File level = new File(parent, "Level.java"); - File linkGroup = new File(parent, "LinkGroup.java"); - File node = new File(parent, "Node.java"); - File nodeBuilder = new File(parent, "NodeBuilder.java"); - File nodeList = new File(parent, "NodeList.java"); - File nodeListBuilder = new File(parent, "NodeListBuilder.java"); - File nodesType = new File(parent, "NodesType.java"); + final File level = new File(parent, "Level.java"); + final File linkGroup = new File(parent, "LinkGroup.java"); + final File node = new File(parent, "Node.java"); + final File nodeBuilder = new File(parent, "NodeBuilder.java"); + final File nodeList = new File(parent, "NodeList.java"); + final File nodeListBuilder = new File(parent, "NodeListBuilder.java"); + final File nodesType = new File(parent, "NodesType.java"); assertTrue(level.exists()); assertTrue(linkGroup.exists()); assertTrue(node.exists()); @@ -89,27 +119,27 @@ public class CompilationTest extends BaseCompilationTest { // Test if sources are compilable testCompilation(sourcesOutputDir, compiledOutputDir); - ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); - Class keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader); - Class linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader); - Class linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader); + final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); + final Class keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader); + final Class linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader); + final Class linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader); // Test generated 'grouping key-args' assertTrue(keyArgsClass.isInterface()); - assertEquals(2, keyArgsClass.getDeclaredMethods().length); assertContainsMethod(keyArgsClass, String.class, "getName"); assertContainsMethod(keyArgsClass, Integer.class, "getSize"); + assertEquals(2, abstractMethods(keyArgsClass).size()); // Test generated 'list links' assertTrue(linksClass.isInterface()); - // TODO: anyxml - assertEquals(6, linksClass.getDeclaredMethods().length); assertImplementsIfc(linksClass, keyArgsClass); + // TODO: anyxml + assertEquals(6, abstractMethods(linksClass).size()); // Test list key constructor arguments ordering assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class); // Test serialVersionUID generation - Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE); + final Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE); suid.setAccessible(true); assertEquals(-8829501012356283881L, suid.getLong(null)); @@ -123,26 +153,30 @@ public class CompilationTest extends BaseCompilationTest { final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "augment-under-uses"); assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); - final List sourceFiles = getSourceFiles("/compilation/augment-under-uses"); - final Set modulesToBuild = parser.parseYangModels(sourceFiles); - final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); - final List types = bindingGenerator.generateTypes(context); - final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); - generator.generateToFile(sourcesOutputDir); + generateTestSources("/compilation/augment-under-uses", sourcesOutputDir); // Test if all sources were generated from 'module foo' File parent = new File(sourcesOutputDir, NS_FOO); assertTrue(new File(parent, "Object.java").exists()); + assertTrue(new File(parent, "ClosedObject.java").exists()); assertTrue(new File(parent, "OpenObject.java").exists()); assertTrue(new File(parent, "ExplicitRouteObject.java").exists()); assertTrue(new File(parent, "PathKeySubobject.java").exists()); - assertFilesCount(parent, 7); + assertFilesCount(parent, 9); parent = new File(parent, "object"); assertTrue(new File(parent, "Nodes.java").exists()); assertTrue(new File(parent, "NodesBuilder.java").exists()); assertFilesCount(parent, 2); + parent = new File(sourcesOutputDir, NS_FOO + FS + "closed"); + assertFilesCount(parent, 1); + + parent = new File(parent, "object"); + assertTrue(new File(parent, "Link1.java").exists()); + assertTrue(new File(parent, "Link1Builder.java").exists()); + assertFilesCount(parent, 2); + parent = new File(sourcesOutputDir, NS_FOO + FS + "open"); assertFilesCount(parent, 1); @@ -185,9 +219,12 @@ public class CompilationTest extends BaseCompilationTest { parent = new File(sourcesOutputDir, NS_BAR); assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists()); assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists()); - assertFilesCount(parent, 3); + assertTrue(new File(parent, "RouteSubobjects.java").exists()); + assertFilesCount(parent, 5); - parent = new File(parent, "basic"); + parent = new File(parent, "route"); + assertFilesCount(parent, 1); + parent = new File(new File(sourcesOutputDir, NS_BAR), "basic"); assertFilesCount(parent, 1); parent = new File(parent, "explicit"); assertFilesCount(parent, 1); @@ -221,19 +258,14 @@ public class CompilationTest extends BaseCompilationTest { final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "aug-of-aug"); assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); - final List sourceFiles = getSourceFiles("/compilation/augment-of-augment"); - final Set modulesToBuild = parser.parseYangModels(sourceFiles); - final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); - final List types = bindingGenerator.generateTypes(context); - final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); - generator.generateToFile(sourcesOutputDir); + generateTestSources("/compilation/augment-of-augment", sourcesOutputDir); // Test if all sources were generated from 'module foo' File parent = new File(sourcesOutputDir, NS_FOO); - File fooListener = new File(parent, "FooListener.java"); + final File fooListener = new File(parent, "FooListener.java"); File pathAttributes = new File(parent, "PathAttributes.java"); - File update = new File(parent, "Update.java"); - File updateBuilder = new File(parent, "UpdateBuilder.java"); + final File update = new File(parent, "Update.java"); + final File updateBuilder = new File(parent, "UpdateBuilder.java"); assertTrue(fooListener.exists()); assertTrue(pathAttributes.exists()); assertTrue(update.exists()); @@ -244,23 +276,23 @@ public class CompilationTest extends BaseCompilationTest { assertFilesCount(parent, 1); parent = new File(parent, "attributes"); assertFilesCount(parent, 2); - File origin = new File(parent, "Origin.java"); - File originBuilder = new File(parent, "OriginBuilder.java"); + final File origin = new File(parent, "Origin.java"); + final File originBuilder = new File(parent, "OriginBuilder.java"); assertTrue(origin.exists()); assertTrue(originBuilder.exists()); parent = new File(sourcesOutputDir, NS_FOO + FS + "update"); assertFilesCount(parent, 2); pathAttributes = new File(parent, "PathAttributes.java"); - File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java"); + final File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java"); assertTrue(pathAttributes.exists()); assertTrue(pathAttributesBuilder.exists()); // Test if all sources were generated from 'module bar' parent = new File(sourcesOutputDir, NS_BAR); - File destination = new File(parent, "Destination.java"); - File pathAttributes1 = new File(parent, "PathAttributes1.java"); - File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java"); + final File destination = new File(parent, "Destination.java"); + final File pathAttributes1 = new File(parent, "PathAttributes1.java"); + final File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java"); assertTrue(destination.exists()); assertTrue(pathAttributes1.exists()); assertTrue(pathAttributes1Builder.exists()); @@ -268,15 +300,15 @@ public class CompilationTest extends BaseCompilationTest { parent = new File(sourcesOutputDir, NS_BAR + FS + "destination"); assertFilesCount(parent, 2); - File destinationType = new File(parent, "DestinationType.java"); + final File destinationType = new File(parent, "DestinationType.java"); assertTrue(destinationType.exists()); parent = new File(parent, "destination"); assertFilesCount(parent, 1); parent = new File(parent, "type"); assertFilesCount(parent, 2); - File destinationIpv4 = new File(parent, "DestinationIp.java"); - File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java"); + final File destinationIpv4 = new File(parent, "DestinationIp.java"); + final File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java"); assertTrue(destinationIpv4.exists()); assertTrue(destinationIpv4Builder.exists()); @@ -285,8 +317,8 @@ public class CompilationTest extends BaseCompilationTest { parent = new File(parent, "path"); assertFilesCount(parent, 1); parent = new File(parent, "attributes"); - File mpUnreachNlri = new File(parent, "MpUnreachNlri.java"); - File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java"); + final File mpUnreachNlri = new File(parent, "MpUnreachNlri.java"); + final File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java"); assertTrue(mpUnreachNlri.exists()); assertTrue(mpUnreachNlriBuilder.exists()); assertFilesCount(parent, 3); @@ -296,8 +328,8 @@ public class CompilationTest extends BaseCompilationTest { parent = new File(parent, "unreach"); assertFilesCount(parent, 1); parent = new File(parent, "nlri"); - File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java"); - File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java"); + final File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java"); + final File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java"); assertTrue(withdrawnRoutes.exists()); assertTrue(withdrawnRoutesBuilder.exists()); assertFilesCount(parent, 2); @@ -305,7 +337,7 @@ public class CompilationTest extends BaseCompilationTest { // Test if all sources were generated from 'module baz' parent = new File(sourcesOutputDir, NS_BAZ); assertFilesCount(parent, 2); - File linkstateDestination = new File(parent, "LinkstateDestination.java"); + final File linkstateDestination = new File(parent, "LinkstateDestination.java"); assertTrue(linkstateDestination.exists()); parent = new File(sourcesOutputDir, NS_BAZ + FS + "update"); @@ -327,28 +359,28 @@ public class CompilationTest extends BaseCompilationTest { parent = new File(parent, "destination"); assertFilesCount(parent, 1); parent = new File(parent, "type"); - File destinationLinkstate = new File(parent, "DestinationLinkstate.java"); - File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java"); + final File destinationLinkstate = new File(parent, "DestinationLinkstate.java"); + final File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java"); assertTrue(destinationLinkstate.exists()); assertTrue(destinationLinkstateBuilder.exists()); assertFilesCount(parent, 3); parent = new File(parent, "destination"); assertFilesCount(parent, 1); parent = new File(parent, "linkstate"); - File links = new File(parent, "Links.java"); - File linksBuilder = new File(parent, "LinksBuilder.java"); + final File links = new File(parent, "Links.java"); + final File linksBuilder = new File(parent, "LinksBuilder.java"); assertTrue(links.exists()); assertTrue(linksBuilder.exists()); assertFilesCount(parent, 3); parent = new File(parent, "links"); - File source = new File(parent, "Source.java"); - File sourceBuilder = new File(parent, "SourceBuilder.java"); + final File source = new File(parent, "Source.java"); + final File sourceBuilder = new File(parent, "SourceBuilder.java"); assertTrue(source.exists()); assertTrue(sourceBuilder.exists()); assertFilesCount(parent, 3); parent = new File(parent, "source"); - File address = new File(parent, "Address.java"); - File addressBuilder = new File(parent, "AddressBuilder.java"); + final File address = new File(parent, "Address.java"); + final File addressBuilder = new File(parent, "AddressBuilder.java"); assertTrue(address.exists()); assertTrue(addressBuilder.exists()); assertFilesCount(parent, 2); @@ -366,31 +398,26 @@ public class CompilationTest extends BaseCompilationTest { final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "leaf-return-types"); assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); - final List sourceFiles = getSourceFiles("/compilation/leaf-return-types"); - final Set modulesToBuild = parser.parseYangModels(sourceFiles); - final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); - final List types = bindingGenerator.generateTypes(context); - final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); - generator.generateToFile(sourcesOutputDir); + generateTestSources("/compilation/leaf-return-types", sourcesOutputDir); - File parent = new File(sourcesOutputDir, NS_TEST); + final File parent = new File(sourcesOutputDir, NS_TEST); assertTrue(new File(parent, "TestData.java").exists()); 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, "IdUnionBuilder.java").exists()); + assertTrue(new File(parent, "NodesIdUnionBuilder.java").exists()); assertFilesCount(parent, 5); // Test if sources are compilable testCompilation(sourcesOutputDir, compiledOutputDir); - String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008"; - ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); - Class nodesClass = Class.forName(pkg + ".Nodes", true, loader); - Class builderClass = Class.forName(pkg + ".NodesBuilder", true, loader); + final String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008"; + final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); + final Class nodesClass = Class.forName(pkg + ".Nodes", true, loader); + final Class builderClass = Class.forName(pkg + ".NodesBuilder", true, loader); // Test methods return type - byte[] b = new byte[] {}; + final byte[] b = new byte[] {}; assertContainsMethod(nodesClass, b.getClass(), "getIdBinary"); assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader); assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean"); @@ -411,21 +438,21 @@ public class CompilationTest extends BaseCompilationTest { assertContainsMethod(nodesClass, BigInteger.class, "getIdU64"); assertContainsMethod(nodesClass, pkg + ".Nodes$IdUnion", "getIdUnion", loader); - Object builderObj = builderClass.newInstance(); + final Object builderObj = builderClass.newInstance(); Method m = assertContainsMethod(builderClass, builderClass, "setIdBinary", b.getClass()); - List> lengthConstraints = new ArrayList<>(); + final List> lengthConstraints = new ArrayList<>(); lengthConstraints.add(Range.closed(1, 10)); - Object arg = new byte[] {}; - String expectedMsg = String.format("Invalid length: {}, expected: {}.", arg, lengthConstraints); + byte[] arg = new byte[] {}; + String expectedMsg = String.format("Invalid length: %s, expected: %s.", Arrays.toString(arg), lengthConstraints); assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg); m = assertContainsMethod(builderClass, builderClass, "setIdDecimal64", BigDecimal.class); - List> rangeConstraints = new ArrayList<>(); + final List> rangeConstraints = new ArrayList<>(); rangeConstraints.add(Range.closed(new BigDecimal("1.5"), new BigDecimal("5.5"))); - arg = new BigDecimal("1.4"); - expectedMsg = String.format("Invalid range: %s, expected: %s.", arg, rangeConstraints); - assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg); + Object arg1 = new BigDecimal("1.4"); + expectedMsg = String.format("Invalid range: %s, expected: %s.", arg1, rangeConstraints); + assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg1); cleanUp(sourcesOutputDir, compiledOutputDir); } @@ -437,49 +464,44 @@ public class CompilationTest extends BaseCompilationTest { final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "context-reference"); assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); - final List sourceFiles = getSourceFiles("/compilation/context-reference"); - final Set modulesToBuild = parser.parseYangModels(sourceFiles); - final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); - final List types = bindingGenerator.generateTypes(context); - final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); - generator.generateToFile(sourcesOutputDir); + generateTestSources("/compilation/context-reference", sourcesOutputDir); // Test if all sources are generated - File fooParent = new File(sourcesOutputDir, NS_FOO); + final File fooParent = new File(sourcesOutputDir, NS_FOO); assertFilesCount(fooParent, 3); assertTrue(new File(fooParent, "FooData.java").exists()); assertTrue(new File(fooParent, "Nodes.java").exists()); assertTrue(new File(fooParent, "NodesBuilder.java").exists()); - File barParent = new File(sourcesOutputDir, NS_BAR); + final File barParent = new File(sourcesOutputDir, NS_BAR); assertFilesCount(barParent, 1); assertTrue(new File(barParent, "IdentityClass.java").exists()); // Test if sources are compilable testCompilation(sourcesOutputDir, compiledOutputDir); - ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); - Class nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader); - Class identityClass = Class + final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); + final Class nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader); + final Class identityClass = Class .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader); // test identity try { identityClass.getConstructor(); - Class baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader); + final Class baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader); assertEquals(baseIdentity, identityClass.getSuperclass()); - } catch (NoSuchMethodException e) { + } catch (final NoSuchMethodException e) { throw new AssertionError("IdentityClass must have no-arg constructor"); } // Test annotation try { - Method getId = nodesClass.getMethod("getId"); - Annotation[] annotations = getId.getAnnotations(); + final Method getId = nodesClass.getMethod("getId"); + final Annotation[] annotations = getId.getAnnotations(); assertEquals(1, annotations.length); - Annotation routingContext = annotations[0]; + final Annotation routingContext = annotations[0]; assertEquals(RoutingContext.class, routingContext.annotationType()); - } catch (NoSuchMethodException e) { + } catch (final NoSuchMethodException e) { throw new AssertionError("Method getId() not found"); } @@ -493,12 +515,7 @@ public class CompilationTest extends BaseCompilationTest { final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "yang"); assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); - final List sourceFiles = getSourceFiles("/yang"); - final Set modulesToBuild = parser.parseYangModels(sourceFiles); - final SchemaContext context = parser.resolveSchemaContext(modulesToBuild); - final List types = bindingGenerator.generateTypes(context); - final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types)); - generator.generateToFile(sourcesOutputDir); + generateTestSources("/yang", sourcesOutputDir); // Test if sources are compilable testCompilation(sourcesOutputDir, compiledOutputDir); @@ -506,8 +523,97 @@ public class CompilationTest extends BaseCompilationTest { cleanUp(sourcesOutputDir, compiledOutputDir); } + @Test + public void testBug586() throws Exception { + final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug586"); + assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir()); + final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug586"); + assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); + + generateTestSources("/compilation/bug586", sourcesOutputDir); + + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); + + cleanUp(sourcesOutputDir, compiledOutputDir); + } + + /** + * Test handling nested uses-augmentations. + * + * @throws Exception + */ + @Test + public void testBug1172() throws Exception { + final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug1172"); + assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir()); + final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug1172"); + assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); + + generateTestSources("/compilation/bug1172", sourcesOutputDir); + + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); + + cleanUp(sourcesOutputDir, compiledOutputDir); + } + + /** + * Test if class generated for node from grouping implements ChildOf. + * + * @throws Exception + */ + @Test + public void testBug1377() throws Exception { + final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug1377"); + assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir()); + final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug1377"); + assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); + + generateTestSources("/compilation/bug1377", sourcesOutputDir); + + // Test if sources are compilable + testCompilation(sourcesOutputDir, compiledOutputDir); + + final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() }); + final Class outputActionClass = Class.forName(BASE_PKG + + ".urn.test.foo.rev140717.action.action.output.action._case.OutputAction", true, loader); + final Class actionClass = Class.forName(BASE_PKG + ".urn.test.foo.rev140717.Action", true, loader); + + // Test generated 'container output-action' + assertTrue(outputActionClass.isInterface()); + assertImplementsParameterizedIfc(outputActionClass, ChildOf.class.toString(), actionClass.getCanonicalName()); + + cleanUp(sourcesOutputDir, compiledOutputDir); + } + + @Test + public void classNamesColisionTest() throws Exception { + final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "class-name-collision"); + assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir()); + final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "class-name-collision"); + assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir()); + + generateTestSources("/compilation/class-name-collision", sourcesOutputDir); + testCompilation(sourcesOutputDir, compiledOutputDir); + cleanUp(sourcesOutputDir, compiledOutputDir); + } + + private void generateTestSources(final String resourceDirPath, final File sourcesOutputDir) throws Exception { + final List sourceFiles = getSourceFiles(resourceDirPath); + final SchemaContext context = parser.parseFiles(sourceFiles); + final List types = bindingGenerator.generateTypes(context); + Collections.sort(types, new Comparator() { + @Override + public int compare(final Type o1, final Type o2) { + return o2.getName().compareTo(o1.getName()); + } + }); + final GeneratorJavaFile generator = new GeneratorJavaFile(ImmutableSet.copyOf(types)); + generator.generateToFile(sourcesOutputDir); + } - private void testReturnTypeIdentityref(Class clazz, String methodName, String returnTypeStr) throws Exception { + private static void testReturnTypeIdentityref(final Class clazz, final String methodName, final String returnTypeStr) throws Exception { Method method; java.lang.reflect.Type returnType; try { @@ -515,19 +621,19 @@ public class CompilationTest extends BaseCompilationTest { assertEquals(java.lang.Class.class, method.getReturnType()); returnType = method.getGenericReturnType(); assertTrue(returnType instanceof ParameterizedType); - ParameterizedType pt = (ParameterizedType) returnType; - java.lang.reflect.Type[] parameters = pt.getActualTypeArguments(); + final ParameterizedType pt = (ParameterizedType) returnType; + final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments(); assertEquals(1, parameters.length); - java.lang.reflect.Type parameter = parameters[0]; + final java.lang.reflect.Type parameter = parameters[0]; assertTrue(parameter instanceof WildcardType); - WildcardType wildcardType = (WildcardType) parameter; + final WildcardType wildcardType = (WildcardType) parameter; assertEquals("? extends " + returnTypeStr, wildcardType.toString()); - } catch (NoSuchMethodException e) { + } catch (final NoSuchMethodException e) { throw new AssertionError("Method '" + methodName + "' not found"); } } - private void testReturnTypeInstanceIdentitifer(ClassLoader loader, Class clazz, String methodName) + private static void testReturnTypeInstanceIdentitifer(final ClassLoader loader, final Class clazz, final String methodName) throws Exception { Method method; Class rawReturnType; @@ -538,14 +644,14 @@ public class CompilationTest extends BaseCompilationTest { assertEquals(rawReturnType, method.getReturnType()); returnType = method.getGenericReturnType(); assertTrue(returnType instanceof ParameterizedType); - ParameterizedType pt = (ParameterizedType) returnType; - java.lang.reflect.Type[] parameters = pt.getActualTypeArguments(); + final ParameterizedType pt = (ParameterizedType) returnType; + final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments(); assertEquals(1, parameters.length); - java.lang.reflect.Type parameter = parameters[0]; + final java.lang.reflect.Type parameter = parameters[0]; assertTrue(parameter instanceof WildcardType); - WildcardType wildcardType = (WildcardType) parameter; + final WildcardType wildcardType = (WildcardType) parameter; assertEquals("?", wildcardType.toString()); - } catch (NoSuchMethodException e) { + } catch (final NoSuchMethodException e) { throw new AssertionError("Method '" + methodName + "' not found"); } }