2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.sal.java.api.generator.test;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*;
15 import java.lang.annotation.Annotation;
16 import java.lang.reflect.Field;
17 import java.lang.reflect.Method;
18 import java.lang.reflect.ParameterizedType;
19 import java.lang.reflect.WildcardType;
20 import java.math.BigDecimal;
21 import java.math.BigInteger;
23 import java.net.URLClassLoader;
24 import java.util.ArrayList;
25 import java.util.HashSet;
26 import java.util.List;
29 import org.junit.Test;
30 import org.opendaylight.yangtools.sal.binding.model.api.Type;
31 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
32 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
33 import org.opendaylight.yangtools.yang.model.api.Module;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
36 import com.google.common.collect.Range;
39 * Test correct code generation.
42 public class CompilationTest extends BaseCompilationTest {
45 public void testListGeneration() throws Exception {
46 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "list-gen");
47 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
48 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "list-gen");
49 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
51 final List<File> sourceFiles = getSourceFiles("/compilation/list-gen");
52 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
53 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
54 final List<Type> types = bindingGenerator.generateTypes(context);
55 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
56 generator.generateToFile(sourcesOutputDir);
58 // Test if all sources are generated
59 File parent = new File(sourcesOutputDir, NS_TEST);
60 File keyArgs = new File(parent, "KeyArgs.java");
61 File links = new File(parent, "Links.java");
62 File linksBuilder = new File(parent, "LinksBuilder.java");
63 File linksKey = new File(parent, "LinksKey.java");
64 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 assertFilesCount(parent, 6);
72 parent = new File(sourcesOutputDir, NS_TEST + FS + "links");
73 File level = new File(parent, "Level.java");
74 File linkGroup = new File(parent, "LinkGroup.java");
75 File node = new File(parent, "Node.java");
76 File nodeBuilder = new File(parent, "NodeBuilder.java");
77 File nodeList = new File(parent, "NodeList.java");
78 File nodeListBuilder = new File(parent, "NodeListBuilder.java");
79 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 assertFilesCount(parent, 7);
89 // Test if sources are compilable
90 testCompilation(sourcesOutputDir, compiledOutputDir);
92 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
93 Class<?> keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
94 Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
95 Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
97 // Test generated 'grouping key-args'
98 assertTrue(keyArgsClass.isInterface());
99 assertEquals(2, keyArgsClass.getDeclaredMethods().length);
100 assertContainsMethod(keyArgsClass, String.class, "getName");
101 assertContainsMethod(keyArgsClass, Integer.class, "getSize");
103 // Test generated 'list links'
104 assertTrue(linksClass.isInterface());
106 assertEquals(6, linksClass.getDeclaredMethods().length);
107 assertImplementsIfc(linksClass, keyArgsClass);
109 // Test list key constructor arguments ordering
110 assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class);
111 // Test serialVersionUID generation
112 Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE);
113 suid.setAccessible(true);
114 assertEquals(-8829501012356283881L, suid.getLong(null));
116 cleanUp(sourcesOutputDir, compiledOutputDir);
120 public void testAugmentUnderUsesGeneration() throws Exception {
121 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "augment-under-uses");
122 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
123 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "augment-under-uses");
124 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
126 final List<File> sourceFiles = getSourceFiles("/compilation/augment-under-uses");
127 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
128 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
129 final List<Type> types = bindingGenerator.generateTypes(context);
130 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
131 generator.generateToFile(sourcesOutputDir);
133 // Test if all sources were generated from 'module foo'
134 File parent = new File(sourcesOutputDir, NS_FOO);
135 assertTrue(new File(parent, "Object.java").exists());
136 assertTrue(new File(parent, "ClosedObject.java").exists());
137 assertTrue(new File(parent, "OpenObject.java").exists());
138 assertTrue(new File(parent, "ExplicitRouteObject.java").exists());
139 assertTrue(new File(parent, "PathKeySubobject.java").exists());
140 assertFilesCount(parent, 9);
142 parent = new File(parent, "object");
143 assertTrue(new File(parent, "Nodes.java").exists());
144 assertTrue(new File(parent, "NodesBuilder.java").exists());
145 assertFilesCount(parent, 2);
147 parent = new File(sourcesOutputDir, NS_FOO + FS + "closed");
148 assertFilesCount(parent, 1);
150 parent = new File(parent, "object");
151 assertTrue(new File(parent, "Link1.java").exists());
152 assertTrue(new File(parent, "Link1Builder.java").exists());
153 assertFilesCount(parent, 2);
155 parent = new File(sourcesOutputDir, NS_FOO + FS + "open");
156 assertFilesCount(parent, 1);
158 parent = new File(parent, "object");
159 assertTrue(new File(parent, "Nodes1.java").exists());
160 assertTrue(new File(parent, "Nodes1Builder.java").exists());
161 assertFilesCount(parent, 3);
163 parent = new File(parent, "nodes");
164 assertTrue(new File(parent, "Links.java").exists());
165 assertTrue(new File(parent, "LinksBuilder.java").exists());
166 assertFilesCount(parent, 2);
168 parent = new File(sourcesOutputDir, NS_FOO + FS + "explicit");
169 assertFilesCount(parent, 1);
170 parent = new File(parent, "route");
171 assertFilesCount(parent, 1);
172 parent = new File(parent, "object");
173 assertTrue(new File(parent, "Subobjects.java").exists());
174 assertTrue(new File(parent, "SubobjectsBuilder.java").exists());
175 assertFilesCount(parent, 3);
177 parent = new File(parent, "subobjects");
178 assertFilesCount(parent, 1);
179 parent = new File(parent, "subobject");
180 assertFilesCount(parent, 1);
181 parent = new File(parent, "type");
182 assertTrue(new File(parent, "PathKey.java").exists());
183 assertTrue(new File(parent, "PathKeyBuilder.java").exists());
184 assertFilesCount(parent, 3);
186 parent = new File(parent, "path");
187 assertFilesCount(parent, 1);
188 parent = new File(parent, "key");
189 assertTrue(new File(parent, "PathKey.java").exists());
190 assertTrue(new File(parent, "PathKeyBuilder.java").exists());
191 assertFilesCount(parent, 2);
193 // Test if all sources were generated from 'module bar'
194 parent = new File(sourcesOutputDir, NS_BAR);
195 assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists());
196 assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists());
197 assertTrue(new File(parent, "RouteSubobjects.java").exists());
198 assertFilesCount(parent, 5);
200 parent = new File(parent, "route");
201 assertFilesCount(parent, 1);
202 parent = new File(new File(sourcesOutputDir, NS_BAR), "basic");
203 assertFilesCount(parent, 1);
204 parent = new File(parent, "explicit");
205 assertFilesCount(parent, 1);
206 parent = new File(parent, "route");
207 assertFilesCount(parent, 1);
209 parent = new File(parent, "subobjects");
210 assertFilesCount(parent, 2);
211 assertTrue(new File(parent, "SubobjectType.java").exists());
213 parent = new File(parent, "subobject");
214 assertFilesCount(parent, 1);
216 parent = new File(parent, "type");
217 assertTrue(new File(parent, "IpPrefix.java").exists());
218 assertTrue(new File(parent, "IpPrefixBuilder.java").exists());
219 assertTrue(new File(parent, "Label.java").exists());
220 assertTrue(new File(parent, "LabelBuilder.java").exists());
221 assertFilesCount(parent, 4);
223 // Test if sources are compilable
224 testCompilation(sourcesOutputDir, compiledOutputDir);
226 cleanUp(sourcesOutputDir, compiledOutputDir);
230 public void testAugmentOfAugmentGeneration() throws Exception {
231 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "aug-of-aug");
232 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
233 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "aug-of-aug");
234 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
236 final List<File> sourceFiles = getSourceFiles("/compilation/augment-of-augment");
237 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
238 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
239 final List<Type> types = bindingGenerator.generateTypes(context);
240 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
241 generator.generateToFile(sourcesOutputDir);
243 // Test if all sources were generated from 'module foo'
244 File parent = new File(sourcesOutputDir, NS_FOO);
245 File fooListener = new File(parent, "FooListener.java");
246 File pathAttributes = new File(parent, "PathAttributes.java");
247 File update = new File(parent, "Update.java");
248 File updateBuilder = new File(parent, "UpdateBuilder.java");
249 assertTrue(fooListener.exists());
250 assertTrue(pathAttributes.exists());
251 assertTrue(update.exists());
252 assertTrue(updateBuilder.exists());
253 assertFilesCount(parent, 6);
255 parent = new File(sourcesOutputDir, NS_FOO + FS + "path");
256 assertFilesCount(parent, 1);
257 parent = new File(parent, "attributes");
258 assertFilesCount(parent, 2);
259 File origin = new File(parent, "Origin.java");
260 File originBuilder = new File(parent, "OriginBuilder.java");
261 assertTrue(origin.exists());
262 assertTrue(originBuilder.exists());
264 parent = new File(sourcesOutputDir, NS_FOO + FS + "update");
265 assertFilesCount(parent, 2);
266 pathAttributes = new File(parent, "PathAttributes.java");
267 File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
268 assertTrue(pathAttributes.exists());
269 assertTrue(pathAttributesBuilder.exists());
271 // Test if all sources were generated from 'module bar'
272 parent = new File(sourcesOutputDir, NS_BAR);
273 File destination = new File(parent, "Destination.java");
274 File pathAttributes1 = new File(parent, "PathAttributes1.java");
275 File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
276 assertTrue(destination.exists());
277 assertTrue(pathAttributes1.exists());
278 assertTrue(pathAttributes1Builder.exists());
279 assertFilesCount(parent, 5);
281 parent = new File(sourcesOutputDir, NS_BAR + FS + "destination");
282 assertFilesCount(parent, 2);
283 File destinationType = new File(parent, "DestinationType.java");
284 assertTrue(destinationType.exists());
286 parent = new File(parent, "destination");
287 assertFilesCount(parent, 1);
288 parent = new File(parent, "type");
289 assertFilesCount(parent, 2);
290 File destinationIpv4 = new File(parent, "DestinationIp.java");
291 File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
292 assertTrue(destinationIpv4.exists());
293 assertTrue(destinationIpv4Builder.exists());
295 parent = new File(sourcesOutputDir, NS_BAR + FS + "update");
296 assertFilesCount(parent, 1);
297 parent = new File(parent, "path");
298 assertFilesCount(parent, 1);
299 parent = new File(parent, "attributes");
300 File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
301 File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
302 assertTrue(mpUnreachNlri.exists());
303 assertTrue(mpUnreachNlriBuilder.exists());
304 assertFilesCount(parent, 3);
306 parent = new File(parent, "mp");
307 assertFilesCount(parent, 1);
308 parent = new File(parent, "unreach");
309 assertFilesCount(parent, 1);
310 parent = new File(parent, "nlri");
311 File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
312 File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
313 assertTrue(withdrawnRoutes.exists());
314 assertTrue(withdrawnRoutesBuilder.exists());
315 assertFilesCount(parent, 2);
317 // Test if all sources were generated from 'module baz'
318 parent = new File(sourcesOutputDir, NS_BAZ);
319 assertFilesCount(parent, 2);
320 File linkstateDestination = new File(parent, "LinkstateDestination.java");
321 assertTrue(linkstateDestination.exists());
323 parent = new File(sourcesOutputDir, NS_BAZ + FS + "update");
324 assertFilesCount(parent, 1);
325 parent = new File(parent, "path");
326 assertFilesCount(parent, 1);
327 parent = new File(parent, "attributes");
328 assertFilesCount(parent, 1);
329 parent = new File(parent, "mp");
330 assertFilesCount(parent, 1);
331 parent = new File(parent, "unreach");
332 assertFilesCount(parent, 1);
333 parent = new File(parent, "nlri");
334 assertFilesCount(parent, 1);
335 parent = new File(parent, "withdrawn");
336 assertFilesCount(parent, 1);
337 parent = new File(parent, "routes");
338 assertFilesCount(parent, 1);
339 parent = new File(parent, "destination");
340 assertFilesCount(parent, 1);
341 parent = new File(parent, "type");
342 File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
343 File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
344 assertTrue(destinationLinkstate.exists());
345 assertTrue(destinationLinkstateBuilder.exists());
346 assertFilesCount(parent, 3);
347 parent = new File(parent, "destination");
348 assertFilesCount(parent, 1);
349 parent = new File(parent, "linkstate");
350 File links = new File(parent, "Links.java");
351 File linksBuilder = new File(parent, "LinksBuilder.java");
352 assertTrue(links.exists());
353 assertTrue(linksBuilder.exists());
354 assertFilesCount(parent, 3);
355 parent = new File(parent, "links");
356 File source = new File(parent, "Source.java");
357 File sourceBuilder = new File(parent, "SourceBuilder.java");
358 assertTrue(source.exists());
359 assertTrue(sourceBuilder.exists());
360 assertFilesCount(parent, 3);
361 parent = new File(parent, "source");
362 File address = new File(parent, "Address.java");
363 File addressBuilder = new File(parent, "AddressBuilder.java");
364 assertTrue(address.exists());
365 assertTrue(addressBuilder.exists());
366 assertFilesCount(parent, 2);
368 // Test if sources are compilable
369 testCompilation(sourcesOutputDir, compiledOutputDir);
371 cleanUp(sourcesOutputDir, compiledOutputDir);
375 public void testLeafReturnTypes() throws Exception {
376 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "leaf-return-types");
377 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
378 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "leaf-return-types");
379 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
381 final List<File> sourceFiles = getSourceFiles("/compilation/leaf-return-types");
382 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
383 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
384 final List<Type> types = bindingGenerator.generateTypes(context);
385 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
386 generator.generateToFile(sourcesOutputDir);
388 File parent = new File(sourcesOutputDir, NS_TEST);
389 assertTrue(new File(parent, "TestData.java").exists());
390 assertTrue(new File(parent, "Nodes.java").exists());
391 assertTrue(new File(parent, "NodesBuilder.java").exists());
392 assertTrue(new File(parent, "Alg.java").exists());
393 assertTrue(new File(parent, "IdUnionBuilder.java").exists());
394 assertFilesCount(parent, 5);
396 // Test if sources are compilable
397 testCompilation(sourcesOutputDir, compiledOutputDir);
399 String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008";
400 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
401 Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
402 Class<?> builderClass = Class.forName(pkg + ".NodesBuilder", true, loader);
404 // Test methods return type
405 byte[] b = new byte[] {};
406 assertContainsMethod(nodesClass, b.getClass(), "getIdBinary");
407 assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
408 assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
409 assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64");
410 assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty");
411 assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader);
412 testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
413 testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
414 assertContainsMethod(nodesClass, Byte.class, "getId8");
415 assertContainsMethod(nodesClass, Short.class, "getId16");
416 assertContainsMethod(nodesClass, Integer.class, "getId32");
417 assertContainsMethod(nodesClass, Long.class, "getId64");
418 assertContainsMethod(nodesClass, Long.class, "getIdLeafref");
419 assertContainsMethod(nodesClass, String.class, "getIdString");
420 assertContainsMethod(nodesClass, Short.class, "getIdU8");
421 assertContainsMethod(nodesClass, Integer.class, "getIdU16");
422 assertContainsMethod(nodesClass, Long.class, "getIdU32");
423 assertContainsMethod(nodesClass, BigInteger.class, "getIdU64");
424 assertContainsMethod(nodesClass, pkg + ".Nodes$IdUnion", "getIdUnion", loader);
426 Object builderObj = builderClass.newInstance();
428 Method m = assertContainsMethod(builderClass, builderClass, "setIdBinary", b.getClass());
429 List<Range<Integer>> lengthConstraints = new ArrayList<>();
430 lengthConstraints.add(Range.closed(1, 10));
431 Object arg = new byte[] {};
432 String expectedMsg = String.format("Invalid length: {}, expected: {}.", arg, lengthConstraints);
433 assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg);
435 m = assertContainsMethod(builderClass, builderClass, "setIdDecimal64", BigDecimal.class);
436 List<Range<BigDecimal>> rangeConstraints = new ArrayList<>();
437 rangeConstraints.add(Range.closed(new BigDecimal("1.5"), new BigDecimal("5.5")));
438 arg = new BigDecimal("1.4");
439 expectedMsg = String.format("Invalid range: %s, expected: %s.", arg, rangeConstraints);
440 assertContainsRestrictionCheck(builderObj, m, expectedMsg, arg);
442 cleanUp(sourcesOutputDir, compiledOutputDir);
446 public void testGenerationContextReferenceExtension() throws Exception {
447 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "context-reference");
448 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
449 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "context-reference");
450 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
452 final List<File> sourceFiles = getSourceFiles("/compilation/context-reference");
453 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
454 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
455 final List<Type> types = bindingGenerator.generateTypes(context);
456 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
457 generator.generateToFile(sourcesOutputDir);
459 // Test if all sources are generated
460 File fooParent = new File(sourcesOutputDir, NS_FOO);
461 assertFilesCount(fooParent, 3);
462 assertTrue(new File(fooParent, "FooData.java").exists());
463 assertTrue(new File(fooParent, "Nodes.java").exists());
464 assertTrue(new File(fooParent, "NodesBuilder.java").exists());
466 File barParent = new File(sourcesOutputDir, NS_BAR);
467 assertFilesCount(barParent, 1);
468 assertTrue(new File(barParent, "IdentityClass.java").exists());
470 // Test if sources are compilable
471 testCompilation(sourcesOutputDir, compiledOutputDir);
473 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
474 Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
475 Class<?> identityClass = Class
476 .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
480 identityClass.getConstructor();
481 Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
482 assertEquals(baseIdentity, identityClass.getSuperclass());
483 } catch (NoSuchMethodException e) {
484 throw new AssertionError("IdentityClass must have no-arg constructor");
489 Method getId = nodesClass.getMethod("getId");
490 Annotation[] annotations = getId.getAnnotations();
491 assertEquals(1, annotations.length);
492 Annotation routingContext = annotations[0];
493 assertEquals(RoutingContext.class, routingContext.annotationType());
494 } catch (NoSuchMethodException e) {
495 throw new AssertionError("Method getId() not found");
498 cleanUp(sourcesOutputDir, compiledOutputDir);
502 public void compilationTest() throws Exception {
503 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "yang");
504 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
505 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "yang");
506 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
508 final List<File> sourceFiles = getSourceFiles("/yang");
509 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
510 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
511 final List<Type> types = bindingGenerator.generateTypes(context);
512 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
513 generator.generateToFile(sourcesOutputDir);
515 // Test if sources are compilable
516 testCompilation(sourcesOutputDir, compiledOutputDir);
518 cleanUp(sourcesOutputDir, compiledOutputDir);
522 private void testReturnTypeIdentityref(Class<?> clazz, String methodName, String returnTypeStr) throws Exception {
524 java.lang.reflect.Type returnType;
526 method = clazz.getMethod(methodName);
527 assertEquals(java.lang.Class.class, method.getReturnType());
528 returnType = method.getGenericReturnType();
529 assertTrue(returnType instanceof ParameterizedType);
530 ParameterizedType pt = (ParameterizedType) returnType;
531 java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
532 assertEquals(1, parameters.length);
533 java.lang.reflect.Type parameter = parameters[0];
534 assertTrue(parameter instanceof WildcardType);
535 WildcardType wildcardType = (WildcardType) parameter;
536 assertEquals("? extends " + returnTypeStr, wildcardType.toString());
537 } catch (NoSuchMethodException e) {
538 throw new AssertionError("Method '" + methodName + "' not found");
542 private void testReturnTypeInstanceIdentitifer(ClassLoader loader, Class<?> clazz, String methodName)
545 Class<?> rawReturnType;
546 java.lang.reflect.Type returnType;
548 method = clazz.getMethod(methodName);
549 rawReturnType = Class.forName("org.opendaylight.yangtools.yang.binding.InstanceIdentifier", true, loader);
550 assertEquals(rawReturnType, method.getReturnType());
551 returnType = method.getGenericReturnType();
552 assertTrue(returnType instanceof ParameterizedType);
553 ParameterizedType pt = (ParameterizedType) returnType;
554 java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
555 assertEquals(1, parameters.length);
556 java.lang.reflect.Type parameter = parameters[0];
557 assertTrue(parameter instanceof WildcardType);
558 WildcardType wildcardType = (WildcardType) parameter;
559 assertEquals("?", wildcardType.toString());
560 } catch (NoSuchMethodException e) {
561 throw new AssertionError("Method '" + methodName + "' not found");