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.HashSet;
25 import java.util.List;
28 import org.junit.Test;
29 import org.opendaylight.yangtools.sal.binding.model.api.Type;
30 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
31 import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
32 import org.opendaylight.yangtools.yang.model.api.Module;
33 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
36 * Test correct code generation.
39 public class CompilationTest extends BaseCompilationTest {
42 public void testListGeneration() throws Exception {
43 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "list-gen");
44 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
45 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "list-gen");
46 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
48 final List<File> sourceFiles = getSourceFiles("/compilation/list-gen");
49 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
50 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
51 final List<Type> types = bindingGenerator.generateTypes(context);
52 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
53 generator.generateToFile(sourcesOutputDir);
55 // Test if all sources are generated
56 File parent = new File(sourcesOutputDir, NS_TEST);
57 File keyArgs = new File(parent, "KeyArgs.java");
58 File links = new File(parent, "Links.java");
59 File linksBuilder = new File(parent, "LinksBuilder.java");
60 File linksKey = new File(parent, "LinksKey.java");
61 File testData = new File(parent, "TestData.java");
62 assertTrue(keyArgs.exists());
63 assertTrue(links.exists());
64 assertTrue(linksBuilder.exists());
65 assertTrue(linksKey.exists());
66 assertTrue(testData.exists());
67 testFilesCount(parent, 6);
69 parent = new File(sourcesOutputDir, NS_TEST + FS + "links");
70 File level = new File(parent, "Level.java");
71 File linkGroup = new File(parent, "LinkGroup.java");
72 File node = new File(parent, "Node.java");
73 File nodeBuilder = new File(parent, "NodeBuilder.java");
74 File nodeList = new File(parent, "NodeList.java");
75 File nodeListBuilder = new File(parent, "NodeListBuilder.java");
76 File nodesType = new File(parent, "NodesType.java");
77 assertTrue(level.exists());
78 assertTrue(linkGroup.exists());
79 assertTrue(node.exists());
80 assertTrue(nodeBuilder.exists());
81 assertTrue(nodeList.exists());
82 assertTrue(nodeListBuilder.exists());
83 assertTrue(nodesType.exists());
84 testFilesCount(parent, 7);
86 // Test if sources are compilable
87 testCompilation(sourcesOutputDir, compiledOutputDir);
89 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
90 Class<?> keyArgsClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.KeyArgs", true, loader);
91 Class<?> linksClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.Links", true, loader);
92 Class<?> linksKeyClass = Class.forName(BASE_PKG + ".urn.opendaylight.test.rev131008.LinksKey", true, loader);
94 // Test generated 'grouping key-args'
95 assertTrue(keyArgsClass.isInterface());
96 assertEquals(2, keyArgsClass.getDeclaredMethods().length);
97 assertContainsMethod(keyArgsClass, String.class, "getName");
98 assertContainsMethod(keyArgsClass, Integer.class, "getSize");
100 // Test generated 'list links'
101 assertTrue(linksClass.isInterface());
103 assertEquals(6, linksClass.getDeclaredMethods().length);
104 testImplementsIfc(linksClass, keyArgsClass);
106 // Test list key constructor arguments ordering
107 assertContainsConstructor(linksKeyClass, Byte.class, String.class, Integer.class);
108 // Test serialVersionUID generation
109 Field suid = assertContainsField(linksKeyClass, "serialVersionUID", Long.TYPE);
110 suid.setAccessible(true);
111 assertEquals(-8829501012356283881L, suid.getLong(null));
113 cleanUp(sourcesOutputDir, compiledOutputDir);
117 public void testAugmentUnderUsesGeneration() throws Exception {
118 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "augment-under-uses");
119 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
120 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "augment-under-uses");
121 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
123 final List<File> sourceFiles = getSourceFiles("/compilation/augment-under-uses");
124 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
125 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
126 final List<Type> types = bindingGenerator.generateTypes(context);
127 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
128 generator.generateToFile(sourcesOutputDir);
130 // Test if all sources were generated from 'module foo'
131 File parent = new File(sourcesOutputDir, NS_FOO);
132 assertTrue(new File(parent, "Object.java").exists());
133 assertTrue(new File(parent, "OpenObject.java").exists());
134 assertTrue(new File(parent, "ExplicitRouteObject.java").exists());
135 assertTrue(new File(parent, "PathKeySubobject.java").exists());
136 testFilesCount(parent, 7);
138 parent = new File(parent, "object");
139 assertTrue(new File(parent, "Nodes.java").exists());
140 assertTrue(new File(parent, "NodesBuilder.java").exists());
141 testFilesCount(parent, 2);
143 parent = new File(sourcesOutputDir, NS_FOO + FS + "open");
144 testFilesCount(parent, 1);
146 parent = new File(parent, "object");
147 assertTrue(new File(parent, "Nodes1.java").exists());
148 assertTrue(new File(parent, "Nodes1Builder.java").exists());
149 testFilesCount(parent, 3);
151 parent = new File(parent, "nodes");
152 assertTrue(new File(parent, "Links.java").exists());
153 assertTrue(new File(parent, "LinksBuilder.java").exists());
154 testFilesCount(parent, 2);
156 parent = new File(sourcesOutputDir, NS_FOO + FS + "explicit");
157 testFilesCount(parent, 1);
158 parent = new File(parent, "route");
159 testFilesCount(parent, 1);
160 parent = new File(parent, "object");
161 assertTrue(new File(parent, "Subobjects.java").exists());
162 assertTrue(new File(parent, "SubobjectsBuilder.java").exists());
163 testFilesCount(parent, 3);
165 parent = new File(parent, "subobjects");
166 testFilesCount(parent, 1);
167 parent = new File(parent, "subobject");
168 testFilesCount(parent, 1);
169 parent = new File(parent, "type");
170 assertTrue(new File(parent, "PathKey.java").exists());
171 assertTrue(new File(parent, "PathKeyBuilder.java").exists());
172 testFilesCount(parent, 3);
174 parent = new File(parent, "path");
175 testFilesCount(parent, 1);
176 parent = new File(parent, "key");
177 assertTrue(new File(parent, "PathKey.java").exists());
178 assertTrue(new File(parent, "PathKeyBuilder.java").exists());
179 testFilesCount(parent, 2);
181 // Test if all sources were generated from 'module bar'
182 parent = new File(sourcesOutputDir, NS_BAR);
183 assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists());
184 assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists());
185 testFilesCount(parent, 3);
187 parent = new File(parent, "basic");
188 testFilesCount(parent, 1);
189 parent = new File(parent, "explicit");
190 testFilesCount(parent, 1);
191 parent = new File(parent, "route");
192 testFilesCount(parent, 1);
194 parent = new File(parent, "subobjects");
195 testFilesCount(parent, 2);
196 assertTrue(new File(parent, "SubobjectType.java").exists());
198 parent = new File(parent, "subobject");
199 testFilesCount(parent, 1);
201 parent = new File(parent, "type");
202 assertTrue(new File(parent, "IpPrefix.java").exists());
203 assertTrue(new File(parent, "IpPrefixBuilder.java").exists());
204 assertTrue(new File(parent, "Label.java").exists());
205 assertTrue(new File(parent, "LabelBuilder.java").exists());
206 testFilesCount(parent, 4);
208 // Test if sources are compilable
209 testCompilation(sourcesOutputDir, compiledOutputDir);
211 cleanUp(sourcesOutputDir, compiledOutputDir);
215 public void testAugmentOfAugmentGeneration() throws Exception {
216 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "aug-of-aug");
217 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
218 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "aug-of-aug");
219 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
221 final List<File> sourceFiles = getSourceFiles("/compilation/augment-of-augment");
222 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
223 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
224 final List<Type> types = bindingGenerator.generateTypes(context);
225 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
226 generator.generateToFile(sourcesOutputDir);
228 // Test if all sources were generated from 'module foo'
229 File parent = new File(sourcesOutputDir, NS_FOO);
230 File fooListener = new File(parent, "FooListener.java");
231 File pathAttributes = new File(parent, "PathAttributes.java");
232 File update = new File(parent, "Update.java");
233 File updateBuilder = new File(parent, "UpdateBuilder.java");
234 assertTrue(fooListener.exists());
235 assertTrue(pathAttributes.exists());
236 assertTrue(update.exists());
237 assertTrue(updateBuilder.exists());
238 testFilesCount(parent, 6);
240 parent = new File(sourcesOutputDir, NS_FOO + FS + "path");
241 testFilesCount(parent, 1);
242 parent = new File(parent, "attributes");
243 testFilesCount(parent, 2);
244 File origin = new File(parent, "Origin.java");
245 File originBuilder = new File(parent, "OriginBuilder.java");
246 assertTrue(origin.exists());
247 assertTrue(originBuilder.exists());
249 parent = new File(sourcesOutputDir, NS_FOO + FS + "update");
250 testFilesCount(parent, 2);
251 pathAttributes = new File(parent, "PathAttributes.java");
252 File pathAttributesBuilder = new File(parent, "PathAttributesBuilder.java");
253 assertTrue(pathAttributes.exists());
254 assertTrue(pathAttributesBuilder.exists());
256 // Test if all sources were generated from 'module bar'
257 parent = new File(sourcesOutputDir, NS_BAR);
258 File destination = new File(parent, "Destination.java");
259 File pathAttributes1 = new File(parent, "PathAttributes1.java");
260 File pathAttributes1Builder = new File(parent, "PathAttributes1Builder.java");
261 assertTrue(destination.exists());
262 assertTrue(pathAttributes1.exists());
263 assertTrue(pathAttributes1Builder.exists());
264 testFilesCount(parent, 5);
266 parent = new File(sourcesOutputDir, NS_BAR + FS + "destination");
267 testFilesCount(parent, 2);
268 File destinationType = new File(parent, "DestinationType.java");
269 assertTrue(destinationType.exists());
271 parent = new File(parent, "destination");
272 testFilesCount(parent, 1);
273 parent = new File(parent, "type");
274 testFilesCount(parent, 2);
275 File destinationIpv4 = new File(parent, "DestinationIp.java");
276 File destinationIpv4Builder = new File(parent, "DestinationIpBuilder.java");
277 assertTrue(destinationIpv4.exists());
278 assertTrue(destinationIpv4Builder.exists());
280 parent = new File(sourcesOutputDir, NS_BAR + FS + "update");
281 testFilesCount(parent, 1);
282 parent = new File(parent, "path");
283 testFilesCount(parent, 1);
284 parent = new File(parent, "attributes");
285 File mpUnreachNlri = new File(parent, "MpUnreachNlri.java");
286 File mpUnreachNlriBuilder = new File(parent, "MpUnreachNlriBuilder.java");
287 assertTrue(mpUnreachNlri.exists());
288 assertTrue(mpUnreachNlriBuilder.exists());
289 testFilesCount(parent, 3);
291 parent = new File(parent, "mp");
292 testFilesCount(parent, 1);
293 parent = new File(parent, "unreach");
294 testFilesCount(parent, 1);
295 parent = new File(parent, "nlri");
296 File withdrawnRoutes = new File(parent, "WithdrawnRoutes.java");
297 File withdrawnRoutesBuilder = new File(parent, "WithdrawnRoutesBuilder.java");
298 assertTrue(withdrawnRoutes.exists());
299 assertTrue(withdrawnRoutesBuilder.exists());
300 testFilesCount(parent, 2);
302 // Test if all sources were generated from 'module baz'
303 parent = new File(sourcesOutputDir, NS_BAZ);
304 testFilesCount(parent, 2);
305 File linkstateDestination = new File(parent, "LinkstateDestination.java");
306 assertTrue(linkstateDestination.exists());
308 parent = new File(sourcesOutputDir, NS_BAZ + FS + "update");
309 testFilesCount(parent, 1);
310 parent = new File(parent, "path");
311 testFilesCount(parent, 1);
312 parent = new File(parent, "attributes");
313 testFilesCount(parent, 1);
314 parent = new File(parent, "mp");
315 testFilesCount(parent, 1);
316 parent = new File(parent, "unreach");
317 testFilesCount(parent, 1);
318 parent = new File(parent, "nlri");
319 testFilesCount(parent, 1);
320 parent = new File(parent, "withdrawn");
321 testFilesCount(parent, 1);
322 parent = new File(parent, "routes");
323 testFilesCount(parent, 1);
324 parent = new File(parent, "destination");
325 testFilesCount(parent, 1);
326 parent = new File(parent, "type");
327 File destinationLinkstate = new File(parent, "DestinationLinkstate.java");
328 File destinationLinkstateBuilder = new File(parent, "DestinationLinkstateBuilder.java");
329 assertTrue(destinationLinkstate.exists());
330 assertTrue(destinationLinkstateBuilder.exists());
331 testFilesCount(parent, 3);
332 parent = new File(parent, "destination");
333 testFilesCount(parent, 1);
334 parent = new File(parent, "linkstate");
335 File links = new File(parent, "Links.java");
336 File linksBuilder = new File(parent, "LinksBuilder.java");
337 assertTrue(links.exists());
338 assertTrue(linksBuilder.exists());
339 testFilesCount(parent, 3);
340 parent = new File(parent, "links");
341 File source = new File(parent, "Source.java");
342 File sourceBuilder = new File(parent, "SourceBuilder.java");
343 assertTrue(source.exists());
344 assertTrue(sourceBuilder.exists());
345 testFilesCount(parent, 3);
346 parent = new File(parent, "source");
347 File address = new File(parent, "Address.java");
348 File addressBuilder = new File(parent, "AddressBuilder.java");
349 assertTrue(address.exists());
350 assertTrue(addressBuilder.exists());
351 testFilesCount(parent, 2);
353 // Test if sources are compilable
354 testCompilation(sourcesOutputDir, compiledOutputDir);
356 cleanUp(sourcesOutputDir, compiledOutputDir);
360 public void testLeafReturnTypes() throws Exception {
361 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "leaf-return-types");
362 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
363 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "leaf-return-types");
364 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
366 final List<File> sourceFiles = getSourceFiles("/compilation/leaf-return-types");
367 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
368 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
369 final List<Type> types = bindingGenerator.generateTypes(context);
370 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
371 generator.generateToFile(sourcesOutputDir);
373 File parent = new File(sourcesOutputDir, NS_TEST);
374 testFilesCount(parent, 4);
375 assertTrue(new File(parent, "TestData.java").exists());
376 assertTrue(new File(parent, "Nodes.java").exists());
377 assertTrue(new File(parent, "NodesBuilder.java").exists());
378 assertTrue(new File(parent, "Alg.java").exists());
380 // Test if sources are compilable
381 testCompilation(sourcesOutputDir, compiledOutputDir);
383 String pkg = BASE_PKG + ".urn.opendaylight.test.rev131008";
384 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
385 Class<?> nodesClass = Class.forName(pkg + ".Nodes", true, loader);
387 // Test methods return type
388 byte[] b = new byte[] {};
389 assertContainsMethod(nodesClass, b.getClass(), "getIdBinary");
390 assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
391 assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
392 assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64");
393 assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty");
394 assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader);
395 testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
396 testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
397 assertContainsMethod(nodesClass, Byte.class, "getId8");
398 assertContainsMethod(nodesClass, Short.class, "getId16");
399 assertContainsMethod(nodesClass, Integer.class, "getId32");
400 assertContainsMethod(nodesClass, Long.class, "getId64");
401 assertContainsMethod(nodesClass, Long.class, "getIdLeafref");
402 assertContainsMethod(nodesClass, String.class, "getIdString");
403 assertContainsMethod(nodesClass, Short.class, "getIdU8");
404 assertContainsMethod(nodesClass, Integer.class, "getIdU16");
405 assertContainsMethod(nodesClass, Long.class, "getIdU32");
406 assertContainsMethod(nodesClass, BigInteger.class, "getIdU64");
407 assertContainsMethod(nodesClass, pkg + ".Nodes$IdUnion", "getIdUnion", loader);
409 cleanUp(sourcesOutputDir, compiledOutputDir);
413 public void testGenerationContextReferenceExtension() throws Exception {
414 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "context-reference");
415 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
416 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "context-reference");
417 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
419 final List<File> sourceFiles = getSourceFiles("/compilation/context-reference");
420 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
421 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
422 final List<Type> types = bindingGenerator.generateTypes(context);
423 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
424 generator.generateToFile(sourcesOutputDir);
426 // Test if all sources are generated
427 File fooParent = new File(sourcesOutputDir, NS_FOO);
428 testFilesCount(fooParent, 3);
429 assertTrue(new File(fooParent, "FooData.java").exists());
430 assertTrue(new File(fooParent, "Nodes.java").exists());
431 assertTrue(new File(fooParent, "NodesBuilder.java").exists());
433 File barParent = new File(sourcesOutputDir, NS_BAR);
434 testFilesCount(barParent, 1);
435 assertTrue(new File(barParent, "IdentityClass.java").exists());
437 // Test if sources are compilable
438 testCompilation(sourcesOutputDir, compiledOutputDir);
440 ClassLoader loader = new URLClassLoader(new URL[] { compiledOutputDir.toURI().toURL() });
441 Class<?> nodesClass = Class.forName(BASE_PKG + ".urn.opendaylight.foo.rev131008.Nodes", true, loader);
442 Class<?> identityClass = Class
443 .forName(BASE_PKG + ".urn.opendaylight.bar.rev131008.IdentityClass", true, loader);
447 identityClass.getConstructor();
448 Class<?> baseIdentity = Class.forName("org.opendaylight.yangtools.yang.binding.BaseIdentity", true, loader);
449 assertEquals(baseIdentity, identityClass.getSuperclass());
450 } catch (NoSuchMethodException e) {
451 throw new AssertionError("IdentityClass must have no-arg constructor");
456 Method getId = nodesClass.getMethod("getId");
457 Annotation[] annotations = getId.getAnnotations();
458 assertEquals(1, annotations.length);
459 Annotation routingContext = annotations[0];
460 assertEquals(RoutingContext.class, routingContext.annotationType());
461 } catch (NoSuchMethodException e) {
462 throw new AssertionError("Method getId() not found");
465 cleanUp(sourcesOutputDir, compiledOutputDir);
469 public void compilationTest() throws Exception {
470 final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "yang");
471 assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
472 final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "yang");
473 assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
475 final List<File> sourceFiles = getSourceFiles("/yang");
476 final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
477 final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
478 final List<Type> types = bindingGenerator.generateTypes(context);
479 final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
480 generator.generateToFile(sourcesOutputDir);
482 // Test if sources are compilable
483 testCompilation(sourcesOutputDir, compiledOutputDir);
485 cleanUp(sourcesOutputDir, compiledOutputDir);
489 private void testReturnTypeIdentityref(Class<?> clazz, String methodName, String returnTypeStr) throws Exception {
491 java.lang.reflect.Type returnType;
493 method = clazz.getMethod(methodName);
494 assertEquals(java.lang.Class.class, method.getReturnType());
495 returnType = method.getGenericReturnType();
496 assertTrue(returnType instanceof ParameterizedType);
497 ParameterizedType pt = (ParameterizedType) returnType;
498 java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
499 assertEquals(1, parameters.length);
500 java.lang.reflect.Type parameter = parameters[0];
501 assertTrue(parameter instanceof WildcardType);
502 WildcardType wildcardType = (WildcardType) parameter;
503 assertEquals("? extends " + returnTypeStr, wildcardType.toString());
504 } catch (NoSuchMethodException e) {
505 throw new AssertionError("Method '" + methodName + "' not found");
509 private void testReturnTypeInstanceIdentitifer(ClassLoader loader, Class<?> clazz, String methodName)
512 Class<?> rawReturnType;
513 java.lang.reflect.Type returnType;
515 method = clazz.getMethod(methodName);
516 rawReturnType = Class.forName("org.opendaylight.yangtools.yang.binding.InstanceIdentifier", true, loader);
517 assertEquals(rawReturnType, method.getReturnType());
518 returnType = method.getGenericReturnType();
519 assertTrue(returnType instanceof ParameterizedType);
520 ParameterizedType pt = (ParameterizedType) returnType;
521 java.lang.reflect.Type[] parameters = pt.getActualTypeArguments();
522 assertEquals(1, parameters.length);
523 java.lang.reflect.Type parameter = parameters[0];
524 assertTrue(parameter instanceof WildcardType);
525 WildcardType wildcardType = (WildcardType) parameter;
526 assertEquals("?", wildcardType.toString());
527 } catch (NoSuchMethodException e) {
528 throw new AssertionError("Method '" + methodName + "' not found");