df86d87863878f783b4af78178ff160567d9edc6
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / test / java / org / opendaylight / mdsal / binding / java / api / generator / test / CompilationTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.java.api.generator.test;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertTrue;
13
14 import com.google.common.collect.Collections2;
15 import com.google.common.collect.ImmutableList;
16 import com.google.common.collect.Range;
17 import java.io.File;
18 import java.lang.annotation.Annotation;
19 import java.lang.reflect.Field;
20 import java.lang.reflect.Method;
21 import java.lang.reflect.Modifier;
22 import java.lang.reflect.ParameterizedType;
23 import java.lang.reflect.WildcardType;
24 import java.math.BigDecimal;
25 import java.math.BigInteger;
26 import java.net.URL;
27 import java.net.URLClassLoader;
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 import java.util.Collection;
31 import java.util.List;
32 import org.junit.Test;
33 import org.opendaylight.yangtools.yang.binding.ChildOf;
34 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
35
36 /**
37  * Test correct code generation.
38  *
39  */
40 public class CompilationTest extends BaseCompilationTest {
41
42     /*
43      * Java 8 allows JaCoCo to hook onto interfaces, as well as
44      * generating a default implementation. We only want to check
45      * abstract methods.
46      */
47     private static Collection<Method> abstractMethods(final Class<?> clazz) {
48         // Filter out
49         return Collections2.filter(Arrays.asList(clazz.getDeclaredMethods()), input -> Modifier.isAbstract(input.getModifiers()));
50     }
51
52     @Test
53     public void testListGeneration() throws Exception {
54         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("list-gen");
55         final File compiledOutputDir = CompilationTestUtils.compilerOutput("list-gen");
56         generateTestSources("/compilation/list-gen", sourcesOutputDir);
57
58         // Test if all sources are generated
59         File parent = new File(sourcesOutputDir, CompilationTestUtils.NS_TEST);
60         final File keyArgs = new File(parent, "KeyArgs.java");
61         final File links = new File(parent, "Links.java");
62         final File linksBuilder = new File(parent, "LinksBuilder.java");
63         final File linksKey = new File(parent, "LinksKey.java");
64         final File testData = new File(parent, "TestData.java");
65         assertTrue(keyArgs.exists());
66         assertTrue(links.exists());
67         assertTrue(linksBuilder.exists());
68         assertTrue(linksKey.exists());
69         assertTrue(testData.exists());
70         CompilationTestUtils.assertFilesCount(parent, 6);
71
72         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_TEST + CompilationTestUtils.FS + "links");
73         final File level = new File(parent, "Level.java");
74         final File linkGroup = new File(parent, "LinkGroup.java");
75         final File node = new File(parent, "Node.java");
76         final File nodeBuilder = new File(parent, "NodeBuilder.java");
77         final File nodeList = new File(parent, "NodeList.java");
78         final File nodeListBuilder = new File(parent, "NodeListBuilder.java");
79         final File nodesType = new File(parent, "NodesType.java");
80         assertTrue(level.exists());
81         assertTrue(linkGroup.exists());
82         assertTrue(node.exists());
83         assertTrue(nodeBuilder.exists());
84         assertTrue(nodeList.exists());
85         assertTrue(nodeListBuilder.exists());
86         assertTrue(nodesType.exists());
87         CompilationTestUtils.assertFilesCount(parent, 7);
88
89         // Test if sources are compilable
90         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
91
92         final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
93         final Class<?> keyArgsClass = Class.forName(CompilationTestUtils.BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
94         final Class<?> linksClass = Class.forName(CompilationTestUtils.BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
95         final Class<?> linksKeyClass = Class.forName(CompilationTestUtils.BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
96
97         // Test generated 'grouping key-args'
98         assertTrue(keyArgsClass.isInterface());
99         CompilationTestUtils.assertContainsMethod(keyArgsClass, String.class, "getName");
100         CompilationTestUtils.assertContainsMethod(keyArgsClass, Integer.class, "getSize");
101         assertEquals(2, abstractMethods(keyArgsClass).size());
102
103         // Test generated 'list links'
104         assertTrue(linksClass.isInterface());
105         CompilationTestUtils.assertImplementsIfc(linksClass, keyArgsClass);
106         // TODO: anyxml
107         assertEquals(6, abstractMethods(linksClass).size());
108
109         // Test list key constructor arguments ordering
110         CompilationTestUtils.assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class);
111         // Test serialVersionUID generation
112         final Field suid = CompilationTestUtils.assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE);
113         suid.setAccessible(true);
114         assertEquals(-8829501012356283881L, suid.getLong(null));
115
116         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
117     }
118
119     @Test
120     public void testAugmentUnderUsesGeneration() throws Exception {
121         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("augment-under-uses");
122         final File compiledOutputDir = CompilationTestUtils.compilerOutput("augment-under-uses");
123         generateTestSources("/compilation/augment-under-uses", sourcesOutputDir);
124
125         // Test if all sources were generated from 'module foo'
126         File parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO);
127         assertTrue(new File(parent, "Object.java").exists());
128         assertTrue(new File(parent, "ClosedObject.java").exists());
129         assertTrue(new File(parent, "OpenObject.java").exists());
130         assertTrue(new File(parent, "ExplicitRouteObject.java").exists());
131         assertTrue(new File(parent, "PathKeySubobject.java").exists());
132         CompilationTestUtils.assertFilesCount(parent, 9);
133
134         parent = new File(parent, "object");
135         assertTrue(new File(parent, "Nodes.java").exists());
136         assertTrue(new File(parent, "NodesBuilder.java").exists());
137         CompilationTestUtils.assertFilesCount(parent, 2);
138
139         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO + CompilationTestUtils.FS + "closed");
140         CompilationTestUtils.assertFilesCount(parent, 1);
141
142         parent = new File(parent, "object");
143         assertTrue(new File(parent, "Link1.java").exists());
144         assertTrue(new File(parent, "Link1Builder.java").exists());
145         CompilationTestUtils.assertFilesCount(parent, 2);
146
147         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO + CompilationTestUtils.FS + "open");
148         CompilationTestUtils.assertFilesCount(parent, 1);
149
150         parent = new File(parent, "object");
151         assertTrue(new File(parent, "Nodes1.java").exists());
152         assertTrue(new File(parent, "Nodes1Builder.java").exists());
153         CompilationTestUtils.assertFilesCount(parent, 3);
154
155         parent = new File(parent, "nodes");
156         assertTrue(new File(parent, "Links.java").exists());
157         assertTrue(new File(parent, "LinksBuilder.java").exists());
158         CompilationTestUtils.assertFilesCount(parent, 2);
159
160         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO + CompilationTestUtils.FS + "explicit");
161         CompilationTestUtils.assertFilesCount(parent, 1);
162         parent = new File(parent, "route");
163         CompilationTestUtils.assertFilesCount(parent, 1);
164         parent = new File(parent, "object");
165         assertTrue(new File(parent, "Subobjects.java").exists());
166         assertTrue(new File(parent, "SubobjectsBuilder.java").exists());
167         CompilationTestUtils.assertFilesCount(parent, 3);
168
169         parent = new File(parent, "subobjects");
170         CompilationTestUtils.assertFilesCount(parent, 1);
171         parent = new File(parent, "subobject");
172         CompilationTestUtils.assertFilesCount(parent, 1);
173         parent = new File(parent, "type");
174         assertTrue(new File(parent, "PathKey.java").exists());
175         assertTrue(new File(parent, "PathKeyBuilder.java").exists());
176         CompilationTestUtils.assertFilesCount(parent, 3);
177
178         parent = new File(parent, "path");
179         CompilationTestUtils.assertFilesCount(parent, 1);
180         parent = new File(parent, "key");
181         assertTrue(new File(parent, "PathKey.java").exists());
182         assertTrue(new File(parent, "PathKeyBuilder.java").exists());
183         CompilationTestUtils.assertFilesCount(parent, 2);
184
185         // Test if all sources were generated from 'module bar'
186         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR);
187         assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists());
188         assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists());
189         assertTrue(new File(parent, "RouteSubobjects.java").exists());
190         CompilationTestUtils.assertFilesCount(parent, 5);
191
192         parent = new File(parent, "route");
193         CompilationTestUtils.assertFilesCount(parent, 1);
194         parent = new File(new File(sourcesOutputDir, CompilationTestUtils.NS_BAR), "basic");
195         CompilationTestUtils.assertFilesCount(parent, 1);
196         parent = new File(parent, "explicit");
197         CompilationTestUtils.assertFilesCount(parent, 1);
198         parent = new File(parent, "route");
199         CompilationTestUtils.assertFilesCount(parent, 1);
200
201         parent = new File(parent, "subobjects");
202         CompilationTestUtils.assertFilesCount(parent, 2);
203         assertTrue(new File(parent, "SubobjectType.java").exists());
204
205         parent = new File(parent, "subobject");
206         CompilationTestUtils.assertFilesCount(parent, 1);
207
208         parent = new File(parent, "type");
209         assertTrue(new File(parent, "IpPrefix.java").exists());
210         assertTrue(new File(parent, "IpPrefixBuilder.java").exists());
211         assertTrue(new File(parent, "Label.java").exists());
212         assertTrue(new File(parent, "LabelBuilder.java").exists());
213         CompilationTestUtils.assertFilesCount(parent, 4);
214
215         // Test if sources are compilable
216         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
217
218         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
219     }
220
221     @Test
222     public void testAugmentOfAugmentGeneration() throws Exception {
223         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("aug-of-aug");
224         final File compiledOutputDir = CompilationTestUtils.compilerOutput("aug-of-aug");
225         generateTestSources("/compilation/augment-of-augment", sourcesOutputDir);
226
227         // Test if all sources were generated from 'module foo'
228         File parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO);
229         final File fooListener = new File(parent, "FooListener.java");
230         File pathAttributes = new File(parent, "PathAttributes.java");
231         final File update = new File(parent, "Update.java");
232         final File updateBuilder = new File(parent, "UpdateBuilder.java");
233         assertTrue(fooListener.exists());
234         assertTrue(pathAttributes.exists());
235         assertTrue(update.exists());
236         assertTrue(updateBuilder.exists());
237         CompilationTestUtils.assertFilesCount(parent, 6);
238
239         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO + CompilationTestUtils.FS + "path");
240         CompilationTestUtils.assertFilesCount(parent, 1);
241         parent = new File(parent, "attributes");
242         CompilationTestUtils.assertFilesCount(parent, 2);
243         final File origin = new File(parent, "Origin.java");
244         final File originBuilder = new File(parent, "OriginBuilder.java");
245         assertTrue(origin.exists());
246         assertTrue(originBuilder.exists());
247
248         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO + CompilationTestUtils.FS + "update");
249         CompilationTestUtils.assertFilesCount(parent, 2);
250         pathAttributes = new File(parent, "PathAttributes.java");
251         final File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
252         assertTrue(pathAttributes.exists());
253         assertTrue(pathAttributesBuilder.exists());
254
255         // Test if all sources were generated from 'module bar'
256         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR);
257         final File destination = new File(parent, "Destination.java");
258         final File pathAttributes1 = new File(parent, "PathAttributes1.java");
259         final File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
260         assertTrue(destination.exists());
261         assertTrue(pathAttributes1.exists());
262         assertTrue(pathAttributes1Builder.exists());
263         CompilationTestUtils.assertFilesCount(parent, 5);
264
265         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR + CompilationTestUtils.FS + "destination");
266         CompilationTestUtils.assertFilesCount(parent, 2);
267         final File destinationType = new File(parent, "DestinationType.java");
268         assertTrue(destinationType.exists());
269
270         parent = new File(parent, "destination");
271         CompilationTestUtils.assertFilesCount(parent, 1);
272         parent = new File(parent, "type");
273         CompilationTestUtils.assertFilesCount(parent, 2);
274         final File destinationIpv4 = new File(parent, "DestinationIp.java");
275         final File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
276         assertTrue(destinationIpv4.exists());
277         assertTrue(destinationIpv4Builder.exists());
278
279         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR + CompilationTestUtils.FS + "update");
280         CompilationTestUtils.assertFilesCount(parent, 1);
281         parent = new File(parent, "path");
282         CompilationTestUtils.assertFilesCount(parent, 1);
283         parent = new File(parent, "attributes");
284         final File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
285         final File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
286         assertTrue(mpUnreachNlri.exists());
287         assertTrue(mpUnreachNlriBuilder.exists());
288         CompilationTestUtils.assertFilesCount(parent, 3);
289
290         parent = new File(parent, "mp");
291         CompilationTestUtils.assertFilesCount(parent, 1);
292         parent = new File(parent, "unreach");
293         CompilationTestUtils.assertFilesCount(parent, 1);
294         parent = new File(parent, "nlri");
295         final File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
296         final File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
297         assertTrue(withdrawnRoutes.exists());
298         assertTrue(withdrawnRoutesBuilder.exists());
299         CompilationTestUtils.assertFilesCount(parent, 2);
300
301         // Test if all sources were generated from 'module baz'
302         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAZ);
303         CompilationTestUtils.assertFilesCount(parent, 2);
304         final File linkstateDestination = new File(parent, "LinkstateDestination.java");
305         assertTrue(linkstateDestination.exists());
306
307         parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAZ + CompilationTestUtils.FS + "update");
308         CompilationTestUtils.assertFilesCount(parent, 1);
309         parent = new File(parent, "path");
310         CompilationTestUtils.assertFilesCount(parent, 1);
311         parent = new File(parent, "attributes");
312         CompilationTestUtils.assertFilesCount(parent, 1);
313         parent = new File(parent, "mp");
314         CompilationTestUtils.assertFilesCount(parent, 1);
315         parent = new File(parent, "unreach");
316         CompilationTestUtils.assertFilesCount(parent, 1);
317         parent = new File(parent, "nlri");
318         CompilationTestUtils.assertFilesCount(parent, 1);
319         parent = new File(parent, "withdrawn");
320         CompilationTestUtils.assertFilesCount(parent, 1);
321         parent = new File(parent, "routes");
322         CompilationTestUtils.assertFilesCount(parent, 1);
323         parent = new File(parent, "destination");
324         CompilationTestUtils.assertFilesCount(parent, 1);
325         parent = new File(parent, "type");
326         final File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
327         final File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
328         assertTrue(destinationLinkstate.exists());
329         assertTrue(destinationLinkstateBuilder.exists());
330         CompilationTestUtils.assertFilesCount(parent, 3);
331         parent = new File(parent, "destination");
332         CompilationTestUtils.assertFilesCount(parent, 1);
333         parent = new File(parent, "linkstate");
334         final File links = new File(parent, "Links.java");
335         final File linksBuilder = new File(parent, "LinksBuilder.java");
336         assertTrue(links.exists());
337         assertTrue(linksBuilder.exists());
338         CompilationTestUtils.assertFilesCount(parent, 3);
339         parent = new File(parent, "links");
340         final File source = new File(parent, "Source.java");
341         final File sourceBuilder = new File(parent, "SourceBuilder.java");
342         assertTrue(source.exists());
343         assertTrue(sourceBuilder.exists());
344         CompilationTestUtils.assertFilesCount(parent, 3);
345         parent = new File(parent, "source");
346         final File address = new File(parent, "Address.java");
347         final File addressBuilder = new File(parent, "AddressBuilder.java");
348         assertTrue(address.exists());
349         assertTrue(addressBuilder.exists());
350         CompilationTestUtils.assertFilesCount(parent, 2);
351
352         // Test if sources are compilable
353         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
354
355         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
356     }
357
358     @Test
359     public void testLeafReturnTypes() throws Exception {
360         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("leaf-return-types");
361         final File compiledOutputDir = CompilationTestUtils.compilerOutput("leaf-return-types");
362         generateTestSources("/compilation/leaf-return-types", sourcesOutputDir);
363
364         final File parent = new File(sourcesOutputDir, CompilationTestUtils.NS_TEST);
365         assertTrue(new File(parent, "TestData.java").exists());
366         assertTrue(new File(parent, "Nodes.java").exists());
367         assertTrue(new File(parent, "NodesBuilder.java").exists());
368         assertTrue(new File(parent, "Alg.java").exists());
369         assertTrue(new File(parent, "NodesIdUnionBuilder.java").exists());
370         CompilationTestUtils.assertFilesCount(parent, 5);
371
372         // Test if sources are compilable
373         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
374
375         final String pkg = CompilationTestUtils.BASE_PKG + ".urn.opendaylight.test.rev131008";
376         final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
377         final Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
378         final Class<?> builderClass = Class.forName(pkg + ".NodesBuilder", true, loader);
379
380         // Test methods return type
381         final byte[] b = new byte[] {};
382         CompilationTestUtils.assertContainsMethod(nodesClass, b.getClass(), "getIdBinary");
383         CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
384         CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
385         CompilationTestUtils.assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64");
386         CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty");
387         CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader);
388         testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
389         testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
390         CompilationTestUtils.assertContainsMethod(nodesClass, Byte.class, "getId8");
391         CompilationTestUtils.assertContainsMethod(nodesClass, Short.class, "getId16");
392         CompilationTestUtils.assertContainsMethod(nodesClass, Integer.class, "getId32");
393         CompilationTestUtils.assertContainsMethod(nodesClass, Long.class, "getId64");
394         CompilationTestUtils.assertContainsMethod(nodesClass, Long.class, "getIdLeafref");
395         CompilationTestUtils.assertContainsMethod(nodesClass, String.class, "getIdString");
396         CompilationTestUtils.assertContainsMethod(nodesClass, Short.class, "getIdU8");
397         CompilationTestUtils.assertContainsMethod(nodesClass, Integer.class, "getIdU16");
398         CompilationTestUtils.assertContainsMethod(nodesClass, Long.class, "getIdU32");
399         CompilationTestUtils.assertContainsMethod(nodesClass, BigInteger.class, "getIdU64");
400         CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdUnion", "getIdUnion", loader);
401
402         final Object builderObj = builderClass.newInstance();
403
404         Method m = CompilationTestUtils.assertContainsMethod(builderClass, builderClass, "setIdBinary", b.getClass());
405         final List<Range<Integer>> lengthConstraints = new ArrayList<>();
406         lengthConstraints.add(Range.closed(1, 10));
407         byte[] arg = new byte[] {};
408         String expectedMsg = String.format("Invalid length: %s, expected: %s.", Arrays.toString(arg), lengthConstraints);
409         CompilationTestUtils.assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg);
410
411         m = CompilationTestUtils.assertContainsMethod(builderClass, builderClass, "setIdDecimal64", BigDecimal.class);
412         final List<Range<BigDecimal>> rangeConstraints = new ArrayList<>();
413         rangeConstraints.add(Range.closed(new BigDecimal("1.5"), new BigDecimal("5.5")));
414         Object arg1 = new BigDecimal("1.4");
415         expectedMsg = String.format("Invalid range: %s, expected: %s.", arg1, rangeConstraints);
416         CompilationTestUtils.assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg1);
417
418         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
419     }
420
421     @Test
422     public void testGenerationContextReferenceExtension() throws Exception {
423         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("context-reference");
424         final File compiledOutputDir = CompilationTestUtils.compilerOutput("context-reference");
425         generateTestSources("/compilation/context-reference", sourcesOutputDir);
426
427         // Test if all sources are generated
428         final File fooParent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO);
429         CompilationTestUtils.assertFilesCount(fooParent, 3);
430         assertTrue(new File(fooParent, "FooData.java").exists());
431         assertTrue(new File(fooParent, "Nodes.java").exists());
432         assertTrue(new File(fooParent, "NodesBuilder.java").exists());
433
434         final File barParent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR);
435         CompilationTestUtils.assertFilesCount(barParent, 1);
436         assertTrue(new File(barParent, "IdentityClass.java").exists());
437
438         // Test if sources are compilable
439         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
440
441         final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
442         final Class<?> nodesClass = Class.forName(CompilationTestUtils.BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
443         final Class<?> identityClass = Class
444                 .forName(CompilationTestUtils.BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
445
446         // test identity
447         final Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
448         assertEquals(ImmutableList.of(baseIdentity), Arrays.asList(identityClass.getInterfaces()));
449
450         // Test annotation
451         try {
452             final Method getId = nodesClass.getMethod("getId");
453             final Annotation[] annotations = getId.getAnnotations();
454             assertEquals(1, annotations.length);
455             final Annotation routingContext = annotations[0];
456             assertEquals(RoutingContext.class, routingContext.annotationType());
457         } catch (final NoSuchMethodException e) {
458             throw new AssertionError("Method getId() not found");
459         }
460
461         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
462     }
463
464     @Test
465     public void compilationTest() throws Exception {
466         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("yang");
467         final File compiledOutputDir = CompilationTestUtils.compilerOutput("yang");
468         generateTestSources("/yang", sourcesOutputDir);
469
470         // Test if sources are compilable
471         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
472
473         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
474     }
475
476     @Test
477     public void testBug586() throws Exception {
478         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("bug586");
479         final File compiledOutputDir = CompilationTestUtils.compilerOutput("bug586");
480         generateTestSources("/compilation/bug586", sourcesOutputDir);
481
482         // Test if sources are compilable
483         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
484
485         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
486     }
487
488     @Test
489     public void testBug4760() throws Exception {
490         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("bug4760");
491         final File compiledOutputDir = CompilationTestUtils.compilerOutput("bug4760");
492         generateTestSources("/compilation/bug4760", sourcesOutputDir);
493
494         // Test if sources are compilable
495         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
496
497         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
498     }
499
500     /**
501      * Test handling nested uses-augmentations.
502      *
503      * @throws Exception
504      */
505     @Test
506     public void testBug1172() throws Exception {
507         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("bug1172");
508         final File compiledOutputDir = CompilationTestUtils.compilerOutput("bug1172");
509         generateTestSources("/compilation/bug1172", sourcesOutputDir);
510
511         // Test if sources are compilable
512         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
513
514         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
515     }
516
517     @Test
518     public void testBug5461() throws Exception {
519         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("bug5461");
520         final File compiledOutputDir = CompilationTestUtils.compilerOutput("bug5461");
521         generateTestSources("/compilation/bug5461", sourcesOutputDir);
522
523         // Test if sources are compilable
524         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
525
526         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
527     }
528
529     @Test
530     public void testBug5882() throws Exception {
531         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("bug5882");
532         final File compiledOutputDir = CompilationTestUtils.compilerOutput("bug5882");
533         generateTestSources("/compilation/bug5882", sourcesOutputDir);
534
535         // Test if sources are compilable
536         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
537
538         final File parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BUG5882);
539         assertTrue(new File(parent, "FooData.java").exists());
540         assertTrue(new File(parent, "TypedefCurrent.java").exists());
541         assertTrue(new File(parent, "TypedefDeprecated.java").exists());
542
543         final String pkg = CompilationTestUtils.BASE_PKG + ".urn.yang.foo.rev160102";
544         final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
545         final Class<?> cls = loader.loadClass(pkg + ".FooData");
546         final Class<?> clsContainer = loader.loadClass(pkg + ".ContainerMain");
547         final Class<?> clsTypedefDepr = loader.loadClass(pkg + ".TypedefDeprecated");
548         final Class<?> clsTypedefCur = loader.loadClass(pkg + ".TypedefCurrent");
549         final Class<?> clsGroupingDepr = loader.loadClass(pkg + ".GroupingDeprecated");
550         final Class<?> clsGroupingCur = loader.loadClass(pkg + ".GroupingCurrent");
551         final Class<?> clsTypeDef1 = loader.loadClass(pkg + ".Typedef1");
552         final Class<?> clsTypeDef2 = loader.loadClass(pkg + ".Typedef2");
553         final Class<?> clsTypeDef3 = loader.loadClass(pkg + ".Typedef3");
554         assertTrue(clsTypedefDepr.getAnnotations()[0].toString().contains("Deprecated"));
555         assertTrue(clsTypedefCur.getAnnotations().length == 0);
556         assertTrue(clsGroupingDepr.getAnnotations()[0].toString().contains("Deprecated"));
557         assertTrue(clsGroupingCur.getAnnotations().length == 0);
558         assertTrue(clsTypeDef1.getAnnotations().length == 0);
559         assertTrue(clsTypeDef3.getAnnotations().length == 0);
560         assertTrue(clsTypeDef2.getAnnotations()[0].toString().contains("Deprecated"));
561
562         /*methods inside container*/
563         assertTrue(clsContainer.getMethod("getContainerMainLeafDepr").isAnnotationPresent(Deprecated.class));
564         assertTrue(clsContainer.getMethod("getContainerMainListDepr").isAnnotationPresent(Deprecated.class));
565         assertTrue(clsContainer.getMethod("getContainerMainChoiceDepr").isAnnotationPresent(Deprecated.class));
566         assertFalse(clsContainer.getMethod("getContainerMainLeafCurrent").isAnnotationPresent(Deprecated.class));
567         assertFalse(clsContainer.getMethod("getContainerMainListCurrent").isAnnotationPresent(Deprecated.class));
568         assertFalse(clsContainer.getMethod("getContainerMainChoiceCur").isAnnotationPresent(Deprecated.class));
569
570         /*methods inside module*/
571         assertTrue(cls.getMethod("getContainerMainLeafDepr").isAnnotationPresent(Deprecated.class));
572         assertTrue(cls.getMethod("getContainerMainListDepr").isAnnotationPresent(Deprecated.class));
573         assertTrue(cls.getMethod("getContainerMainChoiceDepr").isAnnotationPresent(Deprecated.class));
574         assertFalse(cls.getMethod("getContainerMainLeafCurrent").isAnnotationPresent(Deprecated.class));
575         assertFalse(cls.getMethod("getContainerMainListCurrent").isAnnotationPresent(Deprecated.class));
576         assertFalse(cls.getMethod("getContainerMainChoiceCur").isAnnotationPresent(Deprecated.class));
577         assertTrue(cls.getMethod("getLeafDeprecated").isAnnotationPresent(Deprecated.class));
578
579         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
580     }
581
582     /**
583      * Test if class generated for node from grouping implements ChildOf.
584      *
585      * @throws Exception
586      */
587     @Test
588     public void testBug1377() throws Exception {
589         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("bug1377");
590         final File compiledOutputDir = CompilationTestUtils.compilerOutput("bug1377");
591
592         generateTestSources("/compilation/bug1377", sourcesOutputDir);
593
594         // Test if sources are compilable
595         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
596
597         final ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
598         final Class<?> outputActionClass = Class.forName(CompilationTestUtils.BASE_PKG
599                 + ".urn.test.foo.rev140717.action.action.output.action._case.OutputAction", true, loader);
600         final Class<?> actionClass = Class.forName(CompilationTestUtils.BASE_PKG + ".urn.test.foo.rev140717.Action", true, loader);
601
602         // Test generated 'container output-action'
603         assertTrue(outputActionClass.isInterface());
604         CompilationTestUtils.assertImplementsParameterizedIfc(outputActionClass, ChildOf.class.toString(), actionClass.getCanonicalName());
605
606         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
607     }
608
609     @Test
610     public void testMdsal327() throws Exception {
611         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("mdsal327");
612         final File compiledOutputDir = CompilationTestUtils.compilerOutput("mdsal327");
613         generateTestSources("/compilation/mdsal327", sourcesOutputDir);
614         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
615         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
616     }
617
618     @Test
619     public void classNamesColisionTest() throws Exception {
620         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("class-name-collision");
621         final File compiledOutputDir = CompilationTestUtils.compilerOutput("class-name-collision");
622         generateTestSources("/compilation/class-name-collision", sourcesOutputDir);
623         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
624         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
625     }
626
627     @Test
628     public void innerEnumerationNameCollisionTest() throws Exception {
629         final File sourcesOutputDir = CompilationTestUtils.generatorOutput("mdsal321");
630         final File compiledOutputDir = CompilationTestUtils.compilerOutput("mdsal321");
631         generateTestSources("/compilation/mdsal321", sourcesOutputDir);
632         CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
633         CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
634     }
635
636     private static void testReturnTypeIdentityref(final Class<?> clazz, final String methodName,
637             final String returnTypeStr) throws Exception {
638         Method method;
639         java.lang.reflect.Type returnType;
640         try {
641             method = clazz.getMethod(methodName);
642             assertEquals(java.lang.Class.class, method.getReturnType());
643             returnType = method.getGenericReturnType();
644             assertTrue(returnType instanceof ParameterizedType);
645             final ParameterizedType pt = (ParameterizedType) returnType;
646             final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
647             assertEquals(1, parameters.length);
648             final java.lang.reflect.Type parameter = parameters[0];
649             assertTrue(parameter instanceof WildcardType);
650             final WildcardType wildcardType = (WildcardType) parameter;
651             assertEquals("? extends " + returnTypeStr, wildcardType.toString());
652         } catch (final NoSuchMethodException e) {
653             throw new AssertionError("Method '" + methodName + "' not found");
654         }
655     }
656
657     private static void testReturnTypeInstanceIdentitifer(final ClassLoader loader, final Class<?> clazz,
658             final String methodName) throws Exception {
659         Method method;
660         Class<?> rawReturnType;
661         java.lang.reflect.Type returnType;
662         try {
663             method = clazz.getMethod(methodName);
664             rawReturnType = Class.forName("org.opendaylight.yangtools.yang.binding.InstanceIdentifier", true, loader);
665             assertEquals(rawReturnType, method.getReturnType());
666             returnType = method.getGenericReturnType();
667             assertTrue(returnType instanceof ParameterizedType);
668             final ParameterizedType pt = (ParameterizedType) returnType;
669             final java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
670             assertEquals(1, parameters.length);
671             final java.lang.reflect.Type parameter = parameters[0];
672             assertTrue(parameter instanceof WildcardType);
673             final WildcardType wildcardType = (WildcardType) parameter;
674             assertEquals("?", wildcardType.toString());
675         } catch (final NoSuchMethodException e) {
676             throw new AssertionError("Method '" + methodName + "' not found");
677         }
678     }
679
680 }