2 * Copyright (c) 2016 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.mdsal.binding.yang.types;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.Mockito.doReturn;
15 import com.google.common.collect.Range;
16 import java.util.List;
17 import java.util.Optional;
19 import org.junit.AfterClass;
20 import org.junit.BeforeClass;
21 import org.junit.Ignore;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mock;
25 import org.mockito.junit.MockitoJUnitRunner;
26 import org.opendaylight.mdsal.binding.generator.spi.TypeProvider;
27 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
28 import org.opendaylight.mdsal.binding.model.api.Enumeration;
29 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
30 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
31 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
32 import org.opendaylight.mdsal.binding.model.api.Restrictions;
33 import org.opendaylight.mdsal.binding.model.api.Type;
34 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
35 import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil;
36 import org.opendaylight.mdsal.binding.model.util.ReferencedTypeImpl;
37 import org.opendaylight.mdsal.binding.model.util.generated.type.builder.CodegenGeneratedTOBuilder;
38 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
39 import org.opendaylight.yangtools.yang.common.QName;
40 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
41 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
42 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
43 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
44 import org.opendaylight.yangtools.yang.model.api.Module;
45 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
46 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
47 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
48 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
49 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
50 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
51 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
54 * Test suite for testing public methods in TypeProviderImpl class.
56 * @see org.opendaylight.mdsal.binding.yang.types.AbstractTypeProvider
57 * @author Lukas Sedlak <lsedlak@cisco.com>
59 @RunWith(MockitoJUnitRunner.class)
60 public class TypeProviderTest {
62 private static SchemaContext SCHEMA_CONTEXT;
63 private static Module TEST_TYPE_PROVIDER;
66 private SchemaPath schemaPath;
69 private SchemaNode schemaNode;
72 public static void beforeClass() {
73 SCHEMA_CONTEXT = TypeProviderModel.createTestContext();
74 TEST_TYPE_PROVIDER = resolveModule(TypeProviderModel.TEST_TYPE_PROVIDER_MODULE_NAME);
78 public static void afterClass() {
79 TEST_TYPE_PROVIDER = null;
80 SCHEMA_CONTEXT = null;
83 private static Module resolveModule(final String moduleName) {
84 return SCHEMA_CONTEXT.findModules(moduleName).iterator().next();
87 @Test(expected = IllegalArgumentException.class)
88 public void typeProviderInstanceWithNullSchemaContextTest() {
89 new RuntimeTypeProvider(null);
92 @Test(expected = IllegalArgumentException.class)
93 public void putReferencedTypeWithNullSchemaPathParamTest() {
94 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
96 provider.putReferencedType(null, null);
97 provider.putReferencedType(this.schemaPath, null);
100 @Test(expected = IllegalArgumentException.class)
101 public void putReferencedTypeWithNullRefTypeParamTest() {
102 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
104 provider.putReferencedType(this.schemaPath, null);
108 public void getAdditionalTypesTest() {
109 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
111 assertNotNull(provider.getAdditionalTypes());
114 @Test(expected = IllegalArgumentException.class)
115 public void javaTypeForSchemaDefinitionTypeNullTypedefTest() {
116 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
118 provider.javaTypeForSchemaDefinitionType(null, null, null);
121 @Test(expected = IllegalArgumentException.class)
122 public void javaTypeForSchemaDefinitionTypeTypedefNullQNameTest() {
123 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
125 final TestIntegerTypeDefinition testTypedef = new TestIntegerTypeDefinition();
126 provider.javaTypeForSchemaDefinitionType(testTypedef, null, null);
129 private static LeafSchemaNode provideLeafNodeFromTopLevelContainer(final Module module, final String containerName,
130 final String leafNodeName) {
131 final QName containerNode = QName.create(module.getQNameModule(), containerName);
132 final DataSchemaNode rootNode = module.getDataChildByName(containerNode);
133 assertNotNull("Container foo is not present in root of module " + module.getName(), rootNode);
134 assertTrue(rootNode instanceof DataNodeContainer);
136 final QName leafNode = QName.create(module.getQNameModule(), leafNodeName);
137 final DataNodeContainer rootContainer = (DataNodeContainer) rootNode;
138 final DataSchemaNode node = rootContainer.getDataChildByName(leafNode);
140 assertTrue(node instanceof LeafSchemaNode);
141 return (LeafSchemaNode) node;
144 private static LeafListSchemaNode provideLeafListNodeFromTopLevelContainer(final Module module,
145 final String containerName, final String leafListNodeName) {
146 final QName containerNode = QName.create(module.getQNameModule(), containerName);
147 final DataSchemaNode rootNode = module.getDataChildByName(containerNode);
148 assertNotNull("Container foo is not present in root of module " + module.getName(), rootNode);
149 assertTrue(rootNode instanceof DataNodeContainer);
151 final DataNodeContainer rootContainer = (DataNodeContainer) rootNode;
152 final QName leafListNode = QName.create(module.getQNameModule(), leafListNodeName);
153 final DataSchemaNode node = rootContainer.getDataChildByName(leafListNode);
155 assertTrue(node instanceof LeafListSchemaNode);
156 return (LeafListSchemaNode) node;
160 public void javaTypeForSchemaDefinitionExtTypeTest() {
161 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
162 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo",
165 final TypeDefinition<?> leafType = leaf.getType();
166 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
167 assertNotNull(result);
168 assertTrue(result instanceof GeneratedTransferObject);
170 final GeneratedTransferObject genTO = (GeneratedTransferObject) result;
171 assertEquals("base-yang-types", genTO.getModuleName());
172 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914",
173 genTO.getPackageName());
174 assertEquals("YangInt8", genTO.getName());
175 assertEquals(1, genTO.getProperties().size());
179 public void javaTypeForSchemaDefinitionRestrictedExtTypeTest() {
180 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
181 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo",
182 "restricted-int8-type");
184 final TypeDefinition<?> leafType = leaf.getType();
185 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(leafType);
187 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf, restrictions);
188 assertNotNull(result);
189 assertTrue(result instanceof GeneratedTransferObject);
191 final GeneratedTransferObject genTO = (GeneratedTransferObject) result;
192 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914",
193 genTO.getPackageName());
194 assertEquals("YangInt8Restricted", genTO.getName());
195 assertEquals(1, genTO.getProperties().size());
196 final Optional<? extends RangeConstraint<?>> rangeConstraints = genTO.getRestrictions().getRangeConstraint();
198 assertTrue(rangeConstraints.isPresent());
199 final Range<?> constraint = rangeConstraints.get().getAllowedRanges().asRanges().iterator().next();
200 assertEquals((byte) 1, constraint.lowerEndpoint());
201 assertEquals((byte) 100, constraint.upperEndpoint());
205 public void javaTypeForSchemaDefinitionEmptyStringPatternTypeTest() {
206 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
208 final Module testTypeProvider = resolveModule("test-type-provider");
209 final TypeDefinition<?> emptyPatternString = resolveTypeDefinitionFromModule(testTypeProvider,
210 "empty-pattern-string");
212 assertNotNull(emptyPatternString);
213 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(emptyPatternString);
215 Type result = provider.javaTypeForSchemaDefinitionType(emptyPatternString, emptyPatternString, restrictions);
216 assertNotNull(result);
217 assertTrue(result instanceof GeneratedTransferObject);
219 result = provider.generatedTypeForExtendedDefinitionType(emptyPatternString, emptyPatternString);
220 assertNotNull(result);
221 assertTrue(result instanceof GeneratedTransferObject);
224 private static TypeDefinition<?> resolveTypeDefinitionFromModule(final Module module, final String typedefName) {
225 TypeDefinition<?> result = null;
226 final Set<TypeDefinition<?>> typeDefs = module.getTypeDefinitions();
227 for (final TypeDefinition<?> typedef : typeDefs) {
228 if (typedef.getQName().getLocalName().equals(typedefName)) {
235 // FIXME: Remove @Ignore annotation once the bug https://bugs.opendaylight.org/show_bug.cgi?id=1862 is fixed
238 public void bug1862RestrictedTypedefTransformationTest() {
239 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
240 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo",
241 "bug-1862-restricted-typedef");
243 final TypeDefinition<?> leafType = leaf.getType();
244 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(leafType);
245 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf, restrictions);
246 assertNotNull(result);
247 assertTrue(result instanceof GeneratedTransferObject);
248 //TODO: complete test after bug 1862 is fixed
252 public void javaTypeForSchemaDefinitionEnumExtTypeTest() {
253 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
254 LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo", "resolve-enum-leaf");
255 TypeDefinition<?> leafType = leaf.getType();
256 Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
257 assertNotNull(result);
258 assertTrue(result instanceof Enumeration);
260 final Enumeration enumType = (Enumeration) result;
261 final List<Enumeration.Pair> enumValues = enumType.getValues();
262 assertTrue(!enumValues.isEmpty());
263 assertEquals("a", enumValues.get(0).getName());
264 assertEquals("b", enumValues.get(1).getName());
265 assertEquals("A", enumValues.get(0).getMappedName());
266 assertEquals("B", enumValues.get(1).getMappedName());
268 leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo", "resolve-direct-use-of-enum");
269 leafType = leaf.getType();
270 result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
271 assertNotNull(result);
272 assertTrue(result instanceof ConcreteType);
274 assertEquals("java.lang", result.getPackageName());
275 assertEquals("Enum", result.getName());
279 public void javaTypeForSchemaDefinitionLeafrefExtTypeTest() {
280 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
281 LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "bar", "leafref-value");
282 TypeDefinition<?> leafType = leaf.getType();
283 final Type leafrefResolvedType1 = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
284 assertNotNull(leafrefResolvedType1);
285 assertTrue(leafrefResolvedType1 instanceof GeneratedTransferObject);
287 final Module module = resolveModule("test-type-provider-b");
288 final QName leafNode = QName.create(module.getQNameModule(), "id");
289 final DataSchemaNode rootNode = module.getDataChildByName(leafNode);
290 assertNotNull("leaf id is not present in root of module " + module.getName(), rootNode);
291 assertTrue(rootNode instanceof LeafSchemaNode);
292 leaf = (LeafSchemaNode) rootNode;
293 leafType = leaf.getType();
295 final Type leafrefResolvedType2 = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
296 assertNotNull(leafrefResolvedType2);
297 assertTrue(leafrefResolvedType2 instanceof GeneratedTransferObject);
301 public void javaTypeForSchemaDefinitionLeafrefToEnumTypeTest() {
302 final AbstractTypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
304 setReferencedTypeForTypeProvider(provider);
306 final Module module = resolveModule("test-type-provider-b");
308 final QName leafNode = QName.create(module.getQNameModule(), "enum");
309 final DataSchemaNode enumNode = module.getDataChildByName(leafNode);
310 assertNotNull("leaf enum is not present in root of module " + module.getName(), enumNode);
311 assertTrue(enumNode instanceof LeafSchemaNode);
312 final LeafSchemaNode leaf = (LeafSchemaNode) enumNode;
313 final TypeDefinition<?> leafType = leaf.getType();
315 final Type leafrefResolvedType1 = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
316 assertNotNull(leafrefResolvedType1);
317 assertTrue(leafrefResolvedType1 instanceof ReferencedTypeImpl);
319 final QName leafListNode = QName.create(module.getQNameModule(), "enums");
320 final DataSchemaNode enumListNode = module.getDataChildByName(leafListNode);
321 assertNotNull("leaf-list enums is not present in root of module " + module.getName(), enumNode);
322 assertTrue(enumListNode instanceof LeafListSchemaNode);
323 final LeafListSchemaNode leafList = (LeafListSchemaNode) enumListNode;
324 final TypeDefinition<?> leafListType = leafList.getType();
326 final Type leafrefResolvedType2 = provider.javaTypeForSchemaDefinitionType(leafListType, leafList);
327 assertNotNull(leafrefResolvedType2);
328 assertTrue(leafrefResolvedType2 instanceof ParameterizedType);
331 private static void setReferencedTypeForTypeProvider(final AbstractTypeProvider provider) {
332 final LeafSchemaNode enumLeafNode = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo",
333 "resolve-direct-use-of-enum");
334 final TypeDefinition<?> enumLeafTypedef = enumLeafNode.getType();
335 Type enumType = provider.javaTypeForSchemaDefinitionType(enumLeafTypedef, enumLeafNode);
337 Type refType = new ReferencedTypeImpl(enumType.getIdentifier());
338 provider.putReferencedType(enumLeafNode.getPath(), refType);
340 final LeafListSchemaNode enumListNode = provideLeafListNodeFromTopLevelContainer(TEST_TYPE_PROVIDER,
341 "foo", "list-of-enums");
342 final TypeDefinition<?> enumLeafListTypedef = enumListNode.getType();
343 enumType = provider.javaTypeForSchemaDefinitionType(enumLeafListTypedef, enumListNode);
345 refType = new ReferencedTypeImpl(enumType.getIdentifier());
346 provider.putReferencedType(enumListNode.getPath(), refType);
350 public void javaTypeForSchemaDefinitionConditionalLeafrefTest() {
351 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
352 final Module module = resolveModule("test-type-provider-b");
354 final QName leafrefNode = QName.create(module.getQNameModule(), "conditional-leafref");
355 final DataSchemaNode condLeaf = module.getDataChildByName(leafrefNode);
356 assertNotNull("leaf conditional-leafref is not present in root of module " + module.getName(), condLeaf);
357 assertTrue(condLeaf instanceof LeafSchemaNode);
358 final LeafSchemaNode leaf = (LeafSchemaNode) condLeaf;
359 final TypeDefinition<?> leafType = leaf.getType();
361 final Type resultType = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
362 assertNotNull(resultType);
363 assertTrue(resultType instanceof ConcreteType);
364 assertEquals("java.lang", resultType.getPackageName());
365 assertEquals("Object", resultType.getName());
368 @Test(expected = IllegalArgumentException.class)
369 public void javaTypeForSchemaDefinitionInvalidLeafrefPathTest() {
370 final TypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
371 final Module module = resolveModule("test-type-provider-b");
373 final QName leafrefNode = QName.create(module.getQNameModule(), "unreslovable-leafref");
374 final DataSchemaNode condLeaf = module.getDataChildByName(leafrefNode);
375 assertNotNull("leaf unreslovable-leafref is not present in root of module " + module.getName(), condLeaf);
376 assertTrue(condLeaf instanceof LeafSchemaNode);
377 final LeafSchemaNode leaf = (LeafSchemaNode) condLeaf;
378 final TypeDefinition<?> leafType = leaf.getType();
380 provider.javaTypeForSchemaDefinitionType(leafType, leaf);
383 @Test(expected = IllegalArgumentException.class)
384 public void provideTypeForLeafrefWithNullLeafrefTypeTest() {
385 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
387 provider.provideTypeForLeafref(null, null, false);
390 @Test(expected = IllegalArgumentException.class)
391 public void provideTypeForLeafrefWithNullLeafrefTypePathStatementTest() {
392 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
394 final LeafrefTypeWithNullXpath leafrePath = new LeafrefTypeWithNullXpath();
395 provider.provideTypeForLeafref(leafrePath, this.schemaNode, false);
398 @Test(expected = IllegalStateException.class)
399 public void provideTypeForLeafrefWithNullParentModuleTest() {
400 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
401 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "bar",
403 final TypeDefinition<?> leafType = leaf.getType();
404 assertTrue(leafType instanceof LeafrefTypeDefinition);
405 doReturn(null).when(this.schemaNode).getPath();
406 provider.provideTypeForLeafref((LeafrefTypeDefinition) leafType, this.schemaNode, false);
410 public void javaTypeForSchemaDefinitionIdentityrefExtTypeTest() {
411 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
412 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo", "crypto");
413 final TypeDefinition<?> leafType = leaf.getType();
415 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
416 assertNotNull(result);
417 assertTrue(result instanceof ParameterizedType);
421 public void javaTypeForSchemaDefinitionForExtUnionWithSimpleTypesTest() {
422 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
423 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "use-of-unions",
424 "simple-int-types-union");
425 final TypeDefinition<?> leafType = leaf.getType();
427 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
428 assertNotNull(result);
429 assertTrue(result instanceof GeneratedTransferObject);
430 assertEquals("YangUnion", result.getName());
431 //TODO: write additional asserts to compare whole GeneratedTrasnferObject against yang union definition
435 public void javaTypeForSchemaDefinitionForExtComplexUnionWithInnerUnionTypesTest() {
436 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
437 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "use-of-unions",
439 final TypeDefinition<?> leafType = leaf.getType();
441 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
442 assertNotNull(result);
443 assertTrue(result instanceof GeneratedTransferObject);
444 assertEquals("ComplexUnion", result.getName());
445 //TODO: write additional asserts to compare whole GeneratedTrasnferObject against yang union definition
449 public void javaTypeForSchemaDefinitionForExtUnionWithInnerUnionAndSimpleTypeTest() {
450 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
451 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "use-of-unions",
452 "complex-string-int-union");
453 final TypeDefinition<?> leafType = leaf.getType();
455 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
456 assertNotNull(result);
457 assertTrue(result instanceof GeneratedTransferObject);
458 assertEquals("ComplexStringIntUnion", result.getName());
459 //TODO: write additional asserts to compare whole GeneratedTrasnferObject against yang union definition
463 public void provideGeneratedTOBuilderForUnionTypeDefWithInnerUnionTypesTest() {
464 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
466 final TypeDefinition<?> unionTypeDef = resolveTypeDefinitionFromModule(TEST_TYPE_PROVIDER, "complex-union");
468 assertNotNull(unionTypeDef);
469 assertTrue(unionTypeDef.getBaseType() instanceof UnionTypeDefinition);
470 GeneratedTOBuilder unionTypeBuilder = provider.provideGeneratedTOBuilderForUnionTypeDef(
471 JavaTypeName.create("test.package.name", BindingMapping.getClassName(unionTypeDef.getQName())),
472 (UnionTypeDefinition)unionTypeDef.getBaseType(), unionTypeDef);
474 assertNotNull(unionTypeBuilder);
476 GeneratedTransferObject unionType = unionTypeBuilder.build();
477 assertEquals("ComplexUnion", unionType.getName());
481 public void provideGeneratedTOBuilderForUnionTypeDefWithInnerUnionAndSimpleTypeTest() {
482 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
484 final TypeDefinition<?> unionTypeDef = resolveTypeDefinitionFromModule(TEST_TYPE_PROVIDER,
485 "complex-string-int-union");
487 assertNotNull(unionTypeDef);
488 assertTrue(unionTypeDef.getBaseType() instanceof UnionTypeDefinition);
489 final GeneratedTOBuilder unionTypeBuilder = provider.provideGeneratedTOBuilderForUnionTypeDef(
490 JavaTypeName.create("test.package.name", BindingMapping.getClassName(unionTypeDef.getQName())),
491 (UnionTypeDefinition)unionTypeDef.getBaseType(), unionTypeDef);
493 assertNotNull(unionTypeBuilder);
495 final GeneratedTransferObject unionType = unionTypeBuilder.build();
496 assertEquals("ComplexStringIntUnion", unionType.getName());
500 public void generatedTypeForExtendedDefinitionTypeTest() {
501 final AbstractTypeProvider provider = new CodegenTypeProvider(SCHEMA_CONTEXT);
503 final Module baseYangTypes = resolveModule("base-yang-types");
504 final Set<TypeDefinition<?>> typeDefs = baseYangTypes.getTypeDefinitions();
506 Type yangBoolean = null;
507 Type yangEmpty = null;
508 Type yangEnumeration = null;
509 Type yangInt8 = null;
510 Type yangInt8Restricted = null;
511 Type yangInt16 = null;
512 Type yangInt32 = null;
513 Type yangInt64 = null;
514 Type yangString = null;
515 Type yangDecimal = null;
516 Type yangUint8 = null;
517 Type yangUint16 = null;
518 Type yangUint32 = null;
519 Type yangUint64 = null;
520 Type yangUnion = null;
521 Type yangBinary = null;
522 Type yangBits = null;
523 Type yangInstanceIdentifier = null;
525 for (final TypeDefinition<?> typedef : typeDefs) {
526 final Type type = provider.generatedTypeForExtendedDefinitionType(typedef, typedef);
527 if (type instanceof GeneratedTransferObject) {
528 if (type.getName().equals("YangBoolean")) {
530 } else if (type.getName().equals("YangEmpty")) {
532 } else if (type.getName().equals("YangInt8")) {
534 } else if (type.getName().equals("YangInt8Restricted")) {
535 yangInt8Restricted = type;
536 } else if (type.getName().equals("YangInt16")) {
538 } else if (type.getName().equals("YangInt32")) {
540 } else if (type.getName().equals("YangInt64")) {
542 } else if (type.getName().equals("YangString")) {
544 } else if (type.getName().equals("YangDecimal64")) {
546 } else if (type.getName().equals("YangUint8")) {
548 } else if (type.getName().equals("YangUint16")) {
550 } else if (type.getName().equals("YangUint32")) {
552 } else if (type.getName().equals("YangUint64")) {
554 } else if (type.getName().equals("YangUnion")) {
556 } else if (type.getName().equals("YangBinary")) {
558 } else if (type.getName().equals("YangInstanceIdentifier")) {
559 yangInstanceIdentifier = type;
560 } else if (type.getName().equals("YangBits")) {
563 } else if (type instanceof Enumeration) {
564 if (type.getName().equals("YangEnumeration")) {
565 yangEnumeration = type;
570 assertNotNull(yangBoolean);
571 assertNotNull(yangEmpty);
572 assertNotNull(yangEnumeration);
573 assertNotNull(yangInt8);
574 assertNotNull(yangInt8Restricted);
575 assertNotNull(yangInt16);
576 assertNotNull(yangInt32);
577 assertNotNull(yangInt64);
578 assertNotNull(yangString);
579 assertNotNull(yangDecimal);
580 assertNotNull(yangUint8);
581 assertNotNull(yangUint16);
582 assertNotNull(yangUint32);
583 assertNotNull(yangUint64);
584 assertNotNull(yangUnion);
585 assertNotNull(yangBinary);
586 assertNotNull(yangBits);
587 assertNotNull(yangInstanceIdentifier);
590 @Test(expected = IllegalArgumentException.class)
591 public void generatedTypeForExtendedDefinitionTypeWithTypedefNullTest() {
592 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
593 provider.generatedTypeForExtendedDefinitionType(null, null);
596 @Test(expected = IllegalArgumentException.class)
597 public void generatedTypeForExtendedDefinitionTypeWithTypedefQNameNullTest() {
598 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
599 final TestIntegerTypeDefinition testInt = new TestIntegerTypeDefinition();
600 provider.generatedTypeForExtendedDefinitionType(testInt, testInt);
604 public void generatedTypeForExtendedDefinitionTypeWithInnerExtendedTypeTest() {
605 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
607 final Module baseYangTypes = resolveModule("test-type-provider");
608 final TypeDefinition<?> extYangInt8Typedef = resolveTypeDefinitionFromModule(baseYangTypes,
609 "extended-yang-int8");
610 assertNotNull(extYangInt8Typedef);
611 final Type extType = provider.generatedTypeForExtendedDefinitionType(extYangInt8Typedef, extYangInt8Typedef);
612 assertNotNull(extType);
613 assertTrue(extType instanceof GeneratedTransferObject);
617 public void generatedTypeForExtendedDefinitionTypeWithLeafrefBaseTypeTest() {
618 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
620 final Module baseYangTypes = resolveModule("test-type-provider");
621 final TypeDefinition<?> barItemLeafrefId = resolveTypeDefinitionFromModule(baseYangTypes,
622 "bar-item-leafref-id");
623 assertNotNull(barItemLeafrefId);
624 final Type extType = provider.generatedTypeForExtendedDefinitionType(barItemLeafrefId, barItemLeafrefId);
625 assertEquals(null, extType);
629 public void generatedTypeForExtendedDefinitionTypeWithIdentityrefBaseTypeTest() {
630 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
632 final Module baseYangTypes = resolveModule("test-type-provider");
634 final TypeDefinition<?> aesIdentityrefType = resolveTypeDefinitionFromModule(baseYangTypes,
635 "aes-identityref-type");
637 assertNotNull(aesIdentityrefType);
638 final Type extType = provider.generatedTypeForExtendedDefinitionType(aesIdentityrefType, aesIdentityrefType);
639 assertEquals(null, extType);
642 @Test(expected = NullPointerException.class)
643 public void provideGeneratedTOBuilderForBitsTypeDefinitionWithNullTypedefTest() {
644 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
645 provider.provideGeneratedTOBuilderForBitsTypeDefinition(JavaTypeName.create("foo", "foo"), null, "foo");
649 public void getConstructorPropertyNameTest() {
650 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
652 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo",
654 final TypeDefinition<?> leafType = leaf.getType();
656 final String ctorPropertyName = provider.getConstructorPropertyName(leafType);
657 assertEquals("value", ctorPropertyName);
659 final String emptyStringName = provider.getConstructorPropertyName(leaf);
660 assertTrue(emptyStringName.isEmpty());
664 public void getParamNameFromTypeTest() {
665 final TypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
667 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "foo",
669 final TypeDefinition<?> leafType = leaf.getType();
671 final String paramName = provider.getParamNameFromType(leafType);
672 assertEquals("yangInt8", paramName);
676 public void addUnitsToGenTOTest() {
677 final GeneratedTOBuilder builder = new CodegenGeneratedTOBuilder(
678 JavaTypeName.create("test.package", "TestBuilder"));
680 CodegenTypeProvider.addUnitsToGenTO(builder, null);
681 GeneratedTransferObject genTO = builder.build();
682 assertTrue(genTO.getConstantDefinitions().isEmpty());
684 CodegenTypeProvider.addUnitsToGenTO(builder, "");
685 genTO = builder.build();
686 assertTrue(genTO.getConstantDefinitions().isEmpty());
688 CodegenTypeProvider.addUnitsToGenTO(builder, "125");
689 genTO = builder.build();
690 assertTrue(!genTO.getConstantDefinitions().isEmpty());
691 assertEquals(1, genTO.getConstantDefinitions().size());
692 assertEquals("_UNITS", genTO.getConstantDefinitions().get(0).getName());
693 assertEquals(genTO.getConstantDefinitions().get(0).getValue(), "\"125\"");
696 @Test(expected = NullPointerException.class)
697 public void getTypeDefaultConstructionLeafTypeNullTest() {
698 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
699 final TestLeafSchemaNode leafSchemaNode = new TestLeafSchemaNode();
700 provider.getTypeDefaultConstruction(leafSchemaNode, null);
703 @Test(expected = NullPointerException.class)
704 public void getTypeDefaultConstructionDefaultValueNullTest() {
705 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
706 final LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("yang-boolean");
707 provider.getTypeDefaultConstruction(leaf, null);
710 private static LeafSchemaNode provideLeafForGetDefaultConstructionTestCase(final String leafName) {
711 return provideLeafNodeFromTopLevelContainer(TEST_TYPE_PROVIDER, "construction-type-test", leafName);
714 @Test(expected = UnsupportedOperationException.class)
715 public void getTypeDefaultConstructionDefaultValueForInstanceIdentifierTest() {
716 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
717 final LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("foo-container-id");
718 provider.getTypeDefaultConstruction(leaf, "NAN");
721 @Test(expected = UnsupportedOperationException.class)
722 public void getTypeDefaultConstructionDefaultValueForIdentityrefTest() {
723 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
724 final LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("aes-identityref-type");
725 provider.getTypeDefaultConstruction(leaf, "NAN");
729 public void getTypeDefaultConstructionDefaultValueTest() {
730 final AbstractTypeProvider provider = new RuntimeTypeProvider(SCHEMA_CONTEXT);
732 LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("yang-boolean");
733 String result = provider.getTypeDefaultConstruction(leaf, "true");
734 assertNotNull(result);
735 assertTrue(!result.isEmpty());
736 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
737 + "YangBoolean(java.lang.Boolean.TRUE)", result);
739 leaf = provideLeafForGetDefaultConstructionTestCase("yang-empty");
740 result = provider.getTypeDefaultConstruction(leaf, "true");
741 assertNotNull(result);
742 assertTrue(!result.isEmpty());
743 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
744 + "YangEmpty(java.lang.Boolean.TRUE)", result);
746 leaf = provideLeafForGetDefaultConstructionTestCase("yang-enumeration");
747 result = provider.getTypeDefaultConstruction(leaf, "a");
748 assertNotNull(result);
749 assertTrue(!result.isEmpty());
750 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
751 + "YangEnumeration.A", result);
753 leaf = provideLeafForGetDefaultConstructionTestCase("direct-use-of-enum");
754 result = provider.getTypeDefaultConstruction(leaf, "y");
755 assertNotNull(result);
756 assertTrue(!result.isEmpty());
757 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912."
758 + "construction.type.test.DirectUseOfEnum.Y", result);
760 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int8");
761 result = provider.getTypeDefaultConstruction(leaf, "17");
762 assertNotNull(result);
763 assertTrue(!result.isEmpty());
764 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
765 + "YangInt8(java.lang.Byte.valueOf(\"17\"))", result);
767 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int8-restricted");
768 result = provider.getTypeDefaultConstruction(leaf, "99");
769 assertNotNull(result);
770 assertTrue(!result.isEmpty());
771 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
772 + "YangInt8Restricted(java.lang.Byte.valueOf(\"99\"))", result);
774 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int16");
775 result = provider.getTypeDefaultConstruction(leaf, "1024");
776 assertNotNull(result);
777 assertTrue(!result.isEmpty());
778 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
779 + "YangInt16(java.lang.Short.valueOf(\"1024\"))", result);
781 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int32");
782 result = provider.getTypeDefaultConstruction(leaf, "1048576");
783 assertNotNull(result);
784 assertTrue(!result.isEmpty());
785 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
786 + "YangInt32(java.lang.Integer.valueOf(\"1048576\"))", result);
788 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int64");
789 result = provider.getTypeDefaultConstruction(leaf, "1099511627776");
790 assertNotNull(result);
791 assertTrue(!result.isEmpty());
792 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
793 + "YangInt64(java.lang.Long.valueOf(\"1099511627776\"))", result);
795 leaf = provideLeafForGetDefaultConstructionTestCase("yang-string");
796 result = provider.getTypeDefaultConstruction(leaf, "TEST");
797 assertNotNull(result);
798 assertTrue(!result.isEmpty());
799 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
800 + "YangString(\"TEST\")", result);
802 leaf = provideLeafForGetDefaultConstructionTestCase("yang-decimal64");
803 result = provider.getTypeDefaultConstruction(leaf, "1274.25");
804 assertNotNull(result);
805 assertTrue(!result.isEmpty());
806 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
807 + "YangDecimal64(new java.math.BigDecimal(\"1274.25\"))", result);
809 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint8");
810 result = provider.getTypeDefaultConstruction(leaf, "128");
811 assertNotNull(result);
812 assertTrue(!result.isEmpty());
813 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
814 + "YangUint8(java.lang.Short.valueOf(\"128\"))", result);
816 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint16");
817 result = provider.getTypeDefaultConstruction(leaf, "1048576");
818 assertNotNull(result);
819 assertTrue(!result.isEmpty());
820 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
821 + "YangUint16(java.lang.Integer.valueOf(\"1048576\"))", result);
823 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint32");
824 result = provider.getTypeDefaultConstruction(leaf, "1099511627776");
825 assertNotNull(result);
826 assertTrue(!result.isEmpty());
827 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
828 + "YangUint32(java.lang.Long.valueOf(\"1099511627776\"))", result);
830 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint64");
831 result = provider.getTypeDefaultConstruction(leaf, "1208925819614629174706176");
832 assertNotNull(result);
833 assertTrue(!result.isEmpty());
834 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
835 + "YangUint64(new java.math.BigInteger(\"1208925819614629174706176\"))", result);
837 //FIXME: Is this correct scenario and correct result?
838 leaf = provideLeafForGetDefaultConstructionTestCase("complex-union");
839 result = provider.getTypeDefaultConstruction(leaf, "75");
840 assertNotNull(result);
841 assertTrue(!result.isEmpty());
842 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912."
843 + "ComplexUnion(\"null\".toCharArray())", result);
845 //FIXME: Is this correct scenario and correct result?
846 leaf = provideLeafForGetDefaultConstructionTestCase("complex-string-int-union");
847 result = provider.getTypeDefaultConstruction(leaf, "TEST_UNION_STRING_DEFAULT");
848 assertNotNull(result);
849 assertTrue(!result.isEmpty());
850 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912."
851 + "ComplexStringIntUnion(\"null\".toCharArray())", result);
853 leaf = provideLeafForGetDefaultConstructionTestCase("simple-int-types-union");
854 result = provider.getTypeDefaultConstruction(leaf, "2048");
855 assertNotNull(result);
856 assertTrue(!result.isEmpty());
857 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
858 + "YangUnion(\"null\".toCharArray())", result);
861 leaf = provideLeafForGetDefaultConstructionTestCase("direct-union-leaf");
862 result = provider.getTypeDefaultConstruction(leaf);
863 assertNotNull(result);
864 assertTrue(!result.isEmpty());
865 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912."
866 + "DirectUnionLeaf(\"128\".toCharArray())", result);
868 final Module module = resolveModule("test-type-provider");
869 final QName leafUnionNode = QName.create(module.getQNameModule(), "root-union-leaf");
870 DataSchemaNode rootNode = module.getDataChildByName(leafUnionNode);
871 assertNotNull("leaf root-union-leaf is not present in root of module " + module.getName(), rootNode);
872 assertTrue(rootNode instanceof LeafSchemaNode);
873 leaf = (LeafSchemaNode) rootNode;
874 result = provider.getTypeDefaultConstruction(leaf);
875 assertNotNull(result);
876 assertTrue(!result.isEmpty());
877 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912."
878 + "TestTypeProviderData.RootUnionLeaf(\"256\".toCharArray())", result);
880 leaf = provideLeafForGetDefaultConstructionTestCase("yang-binary");
881 result = provider.getTypeDefaultConstruction(leaf, "0xffffff");
882 assertNotNull(result);
883 assertTrue(!result.isEmpty());
884 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
885 + "YangBinary(new byte[] {-45, 23, -33, 125, -9, -33})", result);
887 final QName leafBitsNode = QName.create(module.getQNameModule(), "root-bits-leaf");
888 rootNode = module.getDataChildByName(leafBitsNode);
889 assertNotNull("leaf bits-leaf is not present in root of module " + module.getName(), rootNode);
890 assertTrue(rootNode instanceof LeafSchemaNode);
891 leaf = (LeafSchemaNode) rootNode;
892 result = provider.getTypeDefaultConstruction(leaf);
893 assertNotNull(result);
894 assertTrue(!result.isEmpty());
895 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912."
896 + "TestTypeProviderData.RootBitsLeaf(true, false, false)", result);
898 leaf = provideLeafForGetDefaultConstructionTestCase("yang-bits");
899 result = provider.getTypeDefaultConstruction(leaf, "only-10-Mb");
900 assertNotNull(result);
901 assertTrue(!result.isEmpty());
902 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
903 + "YangBits(false, false, true)", result);
905 leaf = provideLeafForGetDefaultConstructionTestCase("bar-id");
906 result = provider.getTypeDefaultConstruction(leaf, "128");
907 assertNotNull(result);
908 assertTrue(!result.isEmpty());
909 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
910 + "YangInt16(java.lang.Short.valueOf(\"128\"))", result);
912 leaf = provideLeafForGetDefaultConstructionTestCase("foo-leafref-value");
913 result = provider.getTypeDefaultConstruction(leaf, "32");
914 assertNotNull(result);
915 assertTrue(!result.isEmpty());
916 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914."
917 + "YangInt8(java.lang.Byte.valueOf(\"32\"))", result);
919 leaf = provideLeafForGetDefaultConstructionTestCase("foo-cond-bar-item");
920 result = provider.getTypeDefaultConstruction(leaf, "10");
921 assertNotNull(result);
922 assertTrue(!result.isEmpty());
923 assertEquals("new java.lang.Object()", result);