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
9 package org.opendaylight.mdsal.binding.yang.types;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Mockito.doReturn;
16 import com.google.common.collect.Range;
17 import java.util.List;
18 import java.util.Optional;
20 import org.junit.Before;
21 import org.junit.Ignore;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.junit.runners.JUnit4;
25 import org.mockito.Mock;
26 import org.mockito.MockitoAnnotations;
27 import org.opendaylight.mdsal.binding.generator.spi.TypeProvider;
28 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
29 import org.opendaylight.mdsal.binding.model.api.Enumeration;
30 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
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.GeneratedTOBuilderImpl;
38 import org.opendaylight.yangtools.yang.common.QName;
39 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
40 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
41 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
42 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
43 import org.opendaylight.yangtools.yang.model.api.Module;
44 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
45 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
46 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
47 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
48 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
49 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
50 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
51 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
52 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
55 * Test suite for testing public methods in TypeProviderImpl class
57 * @see org.opendaylight.mdsal.binding.yang.types.TypeProviderImpl
59 * @author Lukas Sedlak <lsedlak@cisco.com>
61 @RunWith(JUnit4.class)
62 public class TypeProviderTest {
64 private SchemaContext schemaContext;
65 private Set<Module> schemaModules;
66 private Module testTypeProviderModule;
69 private SchemaPath schemaPath;
72 private SchemaNode schemaNode;
75 public void setUp() throws SourceException, ReactorException {
76 MockitoAnnotations.initMocks(this);
77 this.schemaContext = TypeProviderModel.createTestContext();
78 assertNotNull(this.schemaContext);
79 this.schemaModules = this.schemaContext.getModules();
80 assertNotNull(this.schemaModules);
81 this.testTypeProviderModule = resolveModule(TypeProviderModel.TEST_TYPE_PROVIDER_MODULE_NAME);
82 assertNotNull(this.testTypeProviderModule);
85 private Module resolveModule(final String moduleName) {
86 assertNotNull(moduleName);
87 for (final Module m : this.schemaModules) {
88 if (moduleName.equals(m.getName())) {
92 assertTrue("Unable to resolve module " + moduleName + ". No module present within Schema Context!" , false);
96 @Test(expected = IllegalArgumentException.class)
97 public void typeProviderInstanceWithNullSchemaContextTest() {
98 final TypeProvider provider = new TypeProviderImpl(null);
101 @Test(expected = IllegalArgumentException.class)
102 public void putReferencedTypeWithNullSchemaPathParamTest() {
103 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
105 ((TypeProviderImpl) provider).putReferencedType(null, null);
106 ((TypeProviderImpl) provider).putReferencedType(this.schemaPath, null);
109 @Test(expected = IllegalArgumentException.class)
110 public void putReferencedTypeWithNullRefTypeParamTest() {
111 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
113 ((TypeProviderImpl) provider).putReferencedType(this.schemaPath, null);
117 public void getAdditionalTypesTest() {
118 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
120 assertNotNull(((TypeProviderImpl) provider).getAdditionalTypes());
123 @Test(expected = IllegalArgumentException.class)
124 public void javaTypeForSchemaDefinitionTypeNullTypedefTest() {
125 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
127 provider.javaTypeForSchemaDefinitionType(null, null, null);
130 @Test(expected = IllegalArgumentException.class)
131 public void javaTypeForSchemaDefinitionTypeTypedefNullQNameTest() {
132 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
134 final TestIntegerTypeDefinition testTypedef = new TestIntegerTypeDefinition();
135 provider.javaTypeForSchemaDefinitionType(testTypedef, null, null);
138 private static LeafSchemaNode provideLeafNodeFromTopLevelContainer(final Module module, final String containerName, final String leafNodeName) {
139 final QName containerNode = QName.create(module.getQNameModule(), containerName);
140 final DataSchemaNode rootNode = module.getDataChildByName(containerNode);
141 assertNotNull("Container foo is not present in root of module "+ module.getName(), rootNode);
142 assertTrue(rootNode instanceof DataNodeContainer);
144 final QName leafNode = QName.create(module.getQNameModule(), leafNodeName);
145 final DataNodeContainer rootContainer = (DataNodeContainer) rootNode;
146 final DataSchemaNode node = rootContainer.getDataChildByName(leafNode);
148 assertTrue(node instanceof LeafSchemaNode);
149 return (LeafSchemaNode) node;
152 private static LeafListSchemaNode provideLeafListNodeFromTopLevelContainer(final Module module, final String containerName, final String leafListNodeName) {
153 final QName containerNode = QName.create(module.getQNameModule(), containerName);
154 final DataSchemaNode rootNode = module.getDataChildByName(containerNode);
155 assertNotNull("Container foo is not present in root of module " + module.getName(), rootNode);
156 assertTrue(rootNode instanceof DataNodeContainer);
158 final DataNodeContainer rootContainer = (DataNodeContainer) rootNode;
159 final QName leafListNode = QName.create(module.getQNameModule(), leafListNodeName);
160 final DataSchemaNode node = rootContainer.getDataChildByName(leafListNode);
162 assertTrue(node instanceof LeafListSchemaNode);
163 return (LeafListSchemaNode) node;
167 public void javaTypeForSchemaDefinitionExtTypeTest() {
168 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
169 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "yang-int8-type");
171 final TypeDefinition<?> leafType = leaf.getType();
172 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
173 assertNotNull(result);
174 assertTrue(result instanceof GeneratedTransferObject);
176 final GeneratedTransferObject genTO = (GeneratedTransferObject) result;
177 assertEquals("base-yang-types", genTO.getModuleName());
178 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914", genTO.getPackageName());
179 assertEquals("YangInt8", genTO.getName());
180 assertEquals(1, genTO.getProperties().size());
184 public void javaTypeForSchemaDefinitionRestrictedExtTypeTest() {
185 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
186 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "restricted-int8-type");
188 final TypeDefinition<?> leafType = leaf.getType();
189 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(leafType);
191 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf, restrictions);
192 assertNotNull(result);
193 assertTrue(result instanceof GeneratedTransferObject);
195 final GeneratedTransferObject genTO = (GeneratedTransferObject) result;
196 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914", genTO.getPackageName());
197 assertEquals("YangInt8Restricted", genTO.getName());
198 assertEquals(1, genTO.getProperties().size());
199 final Optional<? extends RangeConstraint<?>> rangeConstraints = genTO.getRestrictions().getRangeConstraint();
201 assertTrue(rangeConstraints.isPresent());
202 final Range<?> constraint = rangeConstraints.get().getAllowedRanges().asRanges().iterator().next();
203 assertEquals((byte) 1, constraint.lowerEndpoint());
204 assertEquals((byte) 100, constraint.upperEndpoint());
208 public void javaTypeForSchemaDefinitionEmptyStringPatternTypeTest() {
209 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
211 final Module testTypeProvider = resolveModule("test-type-provider");
212 final TypeDefinition<?> emptyPatternString = resolveTypeDefinitionFromModule(testTypeProvider, "empty-pattern-string");
214 assertNotNull(emptyPatternString);
215 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(emptyPatternString);
217 Type result = provider.javaTypeForSchemaDefinitionType(emptyPatternString, emptyPatternString, restrictions);
218 assertNotNull(result);
219 assertTrue(result instanceof GeneratedTransferObject);
221 result = provider.generatedTypeForExtendedDefinitionType(emptyPatternString, emptyPatternString);
222 assertNotNull(result);
223 assertTrue(result instanceof GeneratedTransferObject);
226 private static TypeDefinition<?> resolveTypeDefinitionFromModule(final Module module, final String typedefName) {
227 TypeDefinition<?> result = null;
228 final Set<TypeDefinition<?>> typeDefs = module.getTypeDefinitions();
229 for (final TypeDefinition<?> typedef : typeDefs) {
230 if (typedef.getQName().getLocalName().equals(typedefName)) {
238 * FIXME: Remove @Ignore annotation once the bug https://bugs.opendaylight.org/show_bug.cgi?id=1862 is fixed
242 public void bug1862RestrictedTypedefTransformationTest() {
243 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
244 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "bug-1862-restricted-typedef");
246 final TypeDefinition<?> leafType = leaf.getType();
247 final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(leafType);
248 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf, restrictions);
249 assertNotNull(result);
250 assertTrue(result instanceof GeneratedTransferObject);
251 //TODO: complete test after bug 1862 is fixed
255 public void javaTypeForSchemaDefinitionEnumExtTypeTest() {
256 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
257 LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "resolve-enum-leaf");
258 TypeDefinition<?> leafType = leaf.getType();
259 Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
260 assertNotNull(result);
261 assertTrue(result instanceof Enumeration);
263 final Enumeration enumType = (Enumeration) result;
264 final List<Enumeration.Pair> enumValues = enumType.getValues();
265 assertTrue(!enumValues.isEmpty());
266 assertEquals("a", enumValues.get(0).getName());
267 assertEquals("b", enumValues.get(1).getName());
268 assertEquals("A", enumValues.get(0).getMappedName());
269 assertEquals("B", enumValues.get(1).getMappedName());
271 leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "resolve-direct-use-of-enum");
272 leafType = leaf.getType();
273 result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
274 assertNotNull(result);
275 assertTrue(result instanceof ConcreteType);
277 assertEquals("java.lang", result.getPackageName());
278 assertEquals("Enum", result.getName());
282 public void javaTypeForSchemaDefinitionLeafrefExtTypeTest() {
283 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
284 LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "bar", "leafref-value");
285 TypeDefinition<?> leafType = leaf.getType();
286 final Type leafrefResolvedType1 = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
287 assertNotNull(leafrefResolvedType1);
288 assertTrue(leafrefResolvedType1 instanceof GeneratedTransferObject);
290 final Module module = resolveModule("test-type-provider-b");
291 final QName leafNode = QName.create(module.getQNameModule(), "id");
292 final DataSchemaNode rootNode = module.getDataChildByName(leafNode);
293 assertNotNull("leaf id is not present in root of module "+ module.getName(), rootNode);
294 assertTrue(rootNode instanceof LeafSchemaNode);
295 leaf = (LeafSchemaNode) rootNode;
296 leafType = leaf.getType();
298 final Type leafrefResolvedType2 = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
299 assertNotNull(leafrefResolvedType2);
300 assertTrue(leafrefResolvedType2 instanceof GeneratedTransferObject);
304 public void javaTypeForSchemaDefinitionLeafrefToEnumTypeTest() {
305 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
307 setReferencedTypeForTypeProvider(provider);
309 final Module module = resolveModule("test-type-provider-b");
311 final QName leafNode = QName.create(module.getQNameModule(), "enum");
312 final DataSchemaNode enumNode = module.getDataChildByName(leafNode);
313 assertNotNull("leaf enum is not present in root of module " + module.getName(), enumNode);
314 assertTrue(enumNode instanceof LeafSchemaNode);
315 final LeafSchemaNode leaf = (LeafSchemaNode) enumNode;
316 final TypeDefinition<?> leafType = leaf.getType();
318 final Type leafrefResolvedType1 = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
319 assertNotNull(leafrefResolvedType1);
320 assertTrue(leafrefResolvedType1 instanceof ReferencedTypeImpl);
322 final QName leafListNode = QName.create(module.getQNameModule(), "enums");
323 final DataSchemaNode enumListNode = module.getDataChildByName(leafListNode);
324 assertNotNull("leaf-list enums is not present in root of module " + module.getName(), enumNode);
325 assertTrue(enumListNode instanceof LeafListSchemaNode);
326 final LeafListSchemaNode leafList = (LeafListSchemaNode) enumListNode;
327 final TypeDefinition<?> leafListType = leafList.getType();
329 final Type leafrefResolvedType2 = provider.javaTypeForSchemaDefinitionType(leafListType, leafList);
330 assertNotNull(leafrefResolvedType2);
331 assertTrue(leafrefResolvedType2 instanceof ParameterizedType);
334 private void setReferencedTypeForTypeProvider(final TypeProvider provider) {
335 final LeafSchemaNode enumLeafNode = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo",
336 "resolve-direct-use-of-enum");
337 final TypeDefinition<?> enumLeafTypedef = enumLeafNode.getType();
338 Type enumType = provider.javaTypeForSchemaDefinitionType(enumLeafTypedef, enumLeafNode);
340 Type refType = new ReferencedTypeImpl(enumType.getPackageName(), enumType.getName());
341 ((TypeProviderImpl) provider).putReferencedType(enumLeafNode.getPath(), refType);
343 final LeafListSchemaNode enumListNode = provideLeafListNodeFromTopLevelContainer(this.testTypeProviderModule,
344 "foo", "list-of-enums");
345 final TypeDefinition<?> enumLeafListTypedef = enumListNode.getType();
346 enumType = provider.javaTypeForSchemaDefinitionType(enumLeafListTypedef, enumListNode);
348 refType = new ReferencedTypeImpl(enumType.getPackageName(), enumType.getPackageName());
349 ((TypeProviderImpl) provider).putReferencedType(enumListNode.getPath(), refType);
353 public void javaTypeForSchemaDefinitionConditionalLeafrefTest() {
354 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
355 final Module module = resolveModule("test-type-provider-b");
357 final QName leafrefNode = QName.create(module.getQNameModule(), "conditional-leafref");
358 final DataSchemaNode condLeaf = module.getDataChildByName(leafrefNode);
359 assertNotNull("leaf conditional-leafref is not present in root of module "+ module.getName(), condLeaf);
360 assertTrue(condLeaf instanceof LeafSchemaNode);
361 final LeafSchemaNode leaf = (LeafSchemaNode) condLeaf;
362 final TypeDefinition<?> leafType = leaf.getType();
364 final Type resultType = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
365 assertNotNull(resultType);
366 assertTrue(resultType instanceof ConcreteType);
367 assertEquals("java.lang", resultType.getPackageName());
368 assertEquals("Object", resultType.getName());
371 @Test(expected = IllegalArgumentException.class)
372 public void javaTypeForSchemaDefinitionInvalidLeafrefPathTest() {
373 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
374 final Module module = resolveModule("test-type-provider-b");
376 final QName leafrefNode = QName.create(module.getQNameModule(), "unreslovable-leafref");
377 final DataSchemaNode condLeaf = module.getDataChildByName(leafrefNode);
378 assertNotNull("leaf unreslovable-leafref is not present in root of module "+ module.getName(), condLeaf);
379 assertTrue(condLeaf instanceof LeafSchemaNode);
380 final LeafSchemaNode leaf = (LeafSchemaNode) condLeaf;
381 final TypeDefinition<?> leafType = leaf.getType();
383 provider.javaTypeForSchemaDefinitionType(leafType, leaf);
386 @Test(expected = IllegalArgumentException.class)
387 public void provideTypeForLeafrefWithNullLeafrefTypeTest() {
388 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
390 provider.provideTypeForLeafref(null, null);
393 @Test(expected = IllegalArgumentException.class)
394 public void provideTypeForLeafrefWithNullLeafrefTypePathStatementTest() {
395 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
397 final LeafrefTypeWithNullXpath leafrePath = new LeafrefTypeWithNullXpath();
398 provider.provideTypeForLeafref(leafrePath, this.schemaNode);
401 @Test(expected = IllegalStateException.class)
402 public void provideTypeForLeafrefWithNullParentModuleTest() {
403 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
404 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "bar", "leafref-value");
405 final TypeDefinition<?> leafType = leaf.getType();
406 assertTrue(leafType instanceof LeafrefTypeDefinition);
407 doReturn(null).when(this.schemaNode).getPath();
408 provider.provideTypeForLeafref((LeafrefTypeDefinition) leafType, this.schemaNode);
412 public void javaTypeForSchemaDefinitionIdentityrefExtTypeTest() {
413 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
414 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "crypto");
415 final TypeDefinition<?> leafType = leaf.getType();
417 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
418 assertNotNull(result);
419 assertTrue(result instanceof ParameterizedType);
423 public void javaTypeForSchemaDefinitionForExtUnionWithSimpleTypesTest() {
424 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
425 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "use-of-unions", "simple-int-types-union");
426 final TypeDefinition<?> leafType = leaf.getType();
428 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
429 assertNotNull(result);
430 assertTrue(result instanceof GeneratedTransferObject);
431 assertEquals("YangUnion", result.getName());
432 //TODO: write additional asserts to compare whole GeneratedTrasnferObject against yang union definition
436 public void javaTypeForSchemaDefinitionForExtComplexUnionWithInnerUnionTypesTest() {
437 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
438 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "use-of-unions", "complex-union");
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 TypeProviderImpl(this.schemaContext);
451 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "use-of-unions", "complex-string-int-union");
452 final TypeDefinition<?> leafType = leaf.getType();
454 final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf);
455 assertNotNull(result);
456 assertTrue(result instanceof GeneratedTransferObject);
457 assertEquals("ComplexStringIntUnion", result.getName());
458 //TODO: write additional asserts to compare whole GeneratedTrasnferObject against yang union definition
462 public void provideGeneratedTOBuilderForUnionTypeDefWithInnerUnionTypesTest() {
463 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
465 final Module testTypeProvider = resolveModule("test-type-provider");
466 final TypeDefinition<?> unionTypeDef = resolveTypeDefinitionFromModule(testTypeProvider, "complex-union");
468 assertNotNull(unionTypeDef);
469 assertTrue(unionTypeDef.getBaseType() instanceof UnionTypeDefinition);
470 GeneratedTOBuilder unionTypeBuilder = provider.provideGeneratedTOBuilderForUnionTypeDef("test.package.name",
471 (UnionTypeDefinition)unionTypeDef.getBaseType(), "ComplexUnionType", unionTypeDef);
473 assertNotNull(unionTypeBuilder);
475 GeneratedTransferObject unionType = unionTypeBuilder.toInstance();
476 assertEquals("ComplexUnionType", unionType.getName());
478 unionTypeBuilder = provider.provideGeneratedTOBuilderForUnionTypeDef("test.package.name",
479 (UnionTypeDefinition)unionTypeDef.getBaseType(), "", unionTypeDef);
481 assertNotNull(unionTypeBuilder);
483 unionType = unionTypeBuilder.toInstance();
484 assertEquals("Union", unionType.getName());
486 unionTypeBuilder = provider.provideGeneratedTOBuilderForUnionTypeDef("test.package.name",
487 (UnionTypeDefinition)unionTypeDef.getBaseType(), null, unionTypeDef);
489 assertNotNull(unionTypeBuilder);
491 unionType = unionTypeBuilder.toInstance();
492 assertEquals("Union", unionType.getName());
496 public void provideGeneratedTOBuilderForUnionTypeDefWithInnerUnionAndSimpleTypeTest() {
497 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
499 final Module testTypeProvider = resolveModule("test-type-provider");
500 final TypeDefinition<?> unionTypeDef = resolveTypeDefinitionFromModule(testTypeProvider, "complex-string-int-union");
502 assertNotNull(unionTypeDef);
503 assertTrue(unionTypeDef.getBaseType() instanceof UnionTypeDefinition);
504 final GeneratedTOBuilder unionTypeBuilder = provider.provideGeneratedTOBuilderForUnionTypeDef("test.package.name",
505 (UnionTypeDefinition)unionTypeDef.getBaseType(), "ComplexStringIntUnionType", unionTypeDef);
507 assertNotNull(unionTypeBuilder);
509 final GeneratedTransferObject unionType = unionTypeBuilder.toInstance();
510 assertEquals("ComplexStringIntUnionType", unionType.getName());
514 public void generatedTypeForExtendedDefinitionTypeTest() {
515 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
517 final Module baseYangTypes = resolveModule("base-yang-types");
518 final Set<TypeDefinition<?>> typeDefs = baseYangTypes.getTypeDefinitions();
520 Type yangBoolean = null;
521 Type yangEmpty = null;
522 Type yangEnumeration = null;
523 Type yangInt8 = null;
524 Type yangInt8Restricted = null;
525 Type yangInt16 = null;
526 Type yangInt32 = null;
527 Type yangInt64 = null;
528 Type yangString = null;
529 Type yangDecimal = null;
530 Type yangUint8 = null;
531 Type yangUint16 = null;
532 Type yangUint32 = null;
533 Type yangUint64 = null;
534 Type yangUnion = null;
535 Type yangBinary = null;
536 Type yangBits = null;
537 Type yangInstanceIdentifier = null;
539 for (final TypeDefinition<?> typedef : typeDefs) {
540 final Type type = provider.generatedTypeForExtendedDefinitionType(typedef, typedef);
541 if (type instanceof GeneratedTransferObject) {
542 if (type.getName().equals("YangBoolean")) {
544 } else if (type.getName().equals("YangEmpty")) {
546 } else if (type.getName().equals("YangInt8")) {
548 } else if (type.getName().equals("YangInt8Restricted")) {
549 yangInt8Restricted = type;
550 } else if (type.getName().equals("YangInt16")) {
552 } else if (type.getName().equals("YangInt32")) {
554 } else if (type.getName().equals("YangInt64")) {
556 } else if (type.getName().equals("YangString")) {
558 } else if (type.getName().equals("YangDecimal64")) {
560 } else if (type.getName().equals("YangUint8")) {
562 } else if (type.getName().equals("YangUint16")) {
564 } else if (type.getName().equals("YangUint32")) {
566 } else if (type.getName().equals("YangUint64")) {
568 } else if (type.getName().equals("YangUnion")) {
570 } else if (type.getName().equals("YangBinary")) {
572 } else if (type.getName().equals("YangInstanceIdentifier")) {
573 yangInstanceIdentifier = type;
574 } else if (type.getName().equals("YangBits")) {
577 } else if (type instanceof Enumeration) {
578 if (type.getName().equals("YangEnumeration")) {
579 yangEnumeration = type;
584 assertNotNull(yangBoolean);
585 assertNotNull(yangEmpty);
586 assertNotNull(yangEnumeration);
587 assertNotNull(yangInt8);
588 assertNotNull(yangInt8Restricted);
589 assertNotNull(yangInt16);
590 assertNotNull(yangInt32);
591 assertNotNull(yangInt64);
592 assertNotNull(yangString);
593 assertNotNull(yangDecimal);
594 assertNotNull(yangUint8);
595 assertNotNull(yangUint16);
596 assertNotNull(yangUint32);
597 assertNotNull(yangUint64);
598 assertNotNull(yangUnion);
599 assertNotNull(yangBinary);
600 assertNotNull(yangBits);
601 assertNotNull(yangInstanceIdentifier);
604 @Test(expected = IllegalArgumentException.class)
605 public void generatedTypeForExtendedDefinitionTypeWithTypedefNullTest() {
606 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
607 provider.generatedTypeForExtendedDefinitionType(null, null);
610 @Test(expected = IllegalArgumentException.class)
611 public void generatedTypeForExtendedDefinitionTypeWithTypedefQNameNullTest() {
612 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
613 final TestIntegerTypeDefinition testInt = new TestIntegerTypeDefinition();
614 provider.generatedTypeForExtendedDefinitionType(testInt, testInt);
618 public void generatedTypeForExtendedDefinitionTypeWithInnerExtendedTypeTest() {
619 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
621 final Module baseYangTypes = resolveModule("test-type-provider");
622 final TypeDefinition<?> extYangInt8Typedef = resolveTypeDefinitionFromModule(baseYangTypes, "extended-yang-int8");
623 assertNotNull(extYangInt8Typedef);
624 final Type extType = provider.generatedTypeForExtendedDefinitionType(extYangInt8Typedef, extYangInt8Typedef);
625 assertNotNull(extType);
626 assertTrue(extType instanceof GeneratedTransferObject);
630 public void generatedTypeForExtendedDefinitionTypeWithLeafrefBaseTypeTest() {
631 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
633 final Module baseYangTypes = resolveModule("test-type-provider");
634 final TypeDefinition<?> barItemLeafrefId = resolveTypeDefinitionFromModule(baseYangTypes, "bar-item-leafref-id");
635 assertNotNull(barItemLeafrefId);
636 final Type extType = provider.generatedTypeForExtendedDefinitionType(barItemLeafrefId, barItemLeafrefId);
637 assertEquals(null, extType);
641 public void generatedTypeForExtendedDefinitionTypeWithIdentityrefBaseTypeTest() {
642 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
644 final Module baseYangTypes = resolveModule("test-type-provider");
646 final TypeDefinition<?> aesIdentityrefType = resolveTypeDefinitionFromModule(baseYangTypes, "aes-identityref-type");
648 assertNotNull(aesIdentityrefType);
649 final Type extType = provider.generatedTypeForExtendedDefinitionType(aesIdentityrefType, aesIdentityrefType);
650 assertEquals(null, extType);
653 @Test(expected = IllegalArgumentException.class)
654 public void provideGeneratedTOBuilderForBitsTypeDefinitionWithNullTypedefTest() {
655 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
656 provider.provideGeneratedTOBuilderForBitsTypeDefinition("", null, "", "");
659 @Test(expected = IllegalArgumentException.class)
660 public void provideGeneratedTOBuilderForBitsTypeDefinitionWithBasePackageNullTest() {
661 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
662 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "yang-int8-type");
663 final TypeDefinition<?> leafType = leaf.getType();
664 provider.provideGeneratedTOBuilderForBitsTypeDefinition(null, leafType, "", "");
668 public void provideGeneratedTOBuilderForBitsTypeDefinitionWithNonBitsTypedefTest() {
669 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
671 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "yang-int8-type");
672 final TypeDefinition<?> leafType = leaf.getType();
673 final Type type = provider.provideGeneratedTOBuilderForBitsTypeDefinition("", leafType, "", "");
675 assertEquals(null, type);
679 public void getConstructorPropertyNameTest() {
680 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
682 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "yang-int8-type");
683 final TypeDefinition<?> leafType = leaf.getType();
685 final String ctorPropertyName = provider.getConstructorPropertyName(leafType);
686 assertEquals("value", ctorPropertyName);
688 final String emptyStringName = provider.getConstructorPropertyName(leaf);
689 assertTrue(emptyStringName.isEmpty());
693 public void getParamNameFromTypeTest() {
694 final TypeProvider provider = new TypeProviderImpl(this.schemaContext);
696 final LeafSchemaNode leaf = provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "foo", "yang-int8-type");
697 final TypeDefinition<?> leafType = leaf.getType();
699 final String paramName = provider.getParamNameFromType(leafType);
700 assertEquals("yangInt8", paramName);
704 public void addUnitsToGenTOTest() {
705 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
707 final GeneratedTOBuilder builder = new GeneratedTOBuilderImpl("test.package", "TestBuilder");
709 TypeProviderImpl.addUnitsToGenTO(builder, null);
710 GeneratedTransferObject genTO = builder.toInstance();
711 assertTrue(genTO.getConstantDefinitions().isEmpty());
713 TypeProviderImpl.addUnitsToGenTO(builder, "");
714 genTO = builder.toInstance();
715 assertTrue(genTO.getConstantDefinitions().isEmpty());
717 TypeProviderImpl.addUnitsToGenTO(builder, "125");
718 genTO = builder.toInstance();
719 assertTrue(!genTO.getConstantDefinitions().isEmpty());
720 assertEquals(1, genTO.getConstantDefinitions().size());
721 assertEquals("_UNITS", genTO.getConstantDefinitions().get(0).getName());
722 assertEquals(genTO.getConstantDefinitions().get(0).getValue(), "\"125\"");
725 @Test(expected = NullPointerException.class)
726 public void getTypeDefaultConstructionLeafTypeNullTest() {
727 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
728 final TestLeafSchemaNode leafSchemaNode = new TestLeafSchemaNode();
729 provider.getTypeDefaultConstruction(leafSchemaNode, null);
732 @Test(expected = NullPointerException.class)
733 public void getTypeDefaultConstructionDefaultValueNullTest() {
734 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
735 final LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("yang-boolean");
736 provider.getTypeDefaultConstruction(leaf, null);
739 private LeafSchemaNode provideLeafForGetDefaultConstructionTestCase(final String leafName) {
740 return provideLeafNodeFromTopLevelContainer(this.testTypeProviderModule, "construction-type-test",
744 @Test(expected = UnsupportedOperationException.class)
745 public void getTypeDefaultConstructionDefaultValueForInstanceIdentifierTest() {
746 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
747 final LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("foo-container-id");
748 provider.getTypeDefaultConstruction(leaf, "NAN");
751 @Test(expected = UnsupportedOperationException.class)
752 public void getTypeDefaultConstructionDefaultValueForIdentityrefTest() {
753 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
754 final LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("aes-identityref-type");
755 provider.getTypeDefaultConstruction(leaf, "NAN");
759 public void getTypeDefaultConstructionDefaultValueTest() {
760 final TypeProviderImpl provider = new TypeProviderImpl(this.schemaContext);
762 LeafSchemaNode leaf = provideLeafForGetDefaultConstructionTestCase("yang-boolean");
763 String result = provider.getTypeDefaultConstruction(leaf, "true");
764 assertNotNull(result);
765 assertTrue(!result.isEmpty());
766 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangBoolean(java.lang.Boolean.TRUE)",
769 leaf = provideLeafForGetDefaultConstructionTestCase("yang-empty");
770 result = provider.getTypeDefaultConstruction(leaf, "true");
771 assertNotNull(result);
772 assertTrue(!result.isEmpty());
773 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangEmpty(java.lang.Boolean.TRUE)",
776 leaf = provideLeafForGetDefaultConstructionTestCase("yang-enumeration");
777 result = provider.getTypeDefaultConstruction(leaf, "a");
778 assertNotNull(result);
779 assertTrue(!result.isEmpty());
780 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangEnumeration.A",
783 leaf = provideLeafForGetDefaultConstructionTestCase("direct-use-of-enum");
784 result = provider.getTypeDefaultConstruction(leaf, "y");
785 assertNotNull(result);
786 assertTrue(!result.isEmpty());
787 assertEquals("org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912.construction.type.test.DirectUseOfEnum.Y",
790 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int8");
791 result = provider.getTypeDefaultConstruction(leaf, "17");
792 assertNotNull(result);
793 assertTrue(!result.isEmpty());
794 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt8(java.lang.Byte.valueOf(\"17\"))",
797 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int8-restricted");
798 result = provider.getTypeDefaultConstruction(leaf, "99");
799 assertNotNull(result);
800 assertTrue(!result.isEmpty());
801 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt8Restricted(java.lang.Byte.valueOf(\"99\"))",
804 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int16");
805 result = provider.getTypeDefaultConstruction(leaf, "1024");
806 assertNotNull(result);
807 assertTrue(!result.isEmpty());
808 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt16(java.lang.Short.valueOf(\"1024\"))",
811 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int32");
812 result = provider.getTypeDefaultConstruction(leaf, "1048576");
813 assertNotNull(result);
814 assertTrue(!result.isEmpty());
815 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt32(java.lang.Integer.valueOf(\"1048576\"))",
818 leaf = provideLeafForGetDefaultConstructionTestCase("yang-int64");
819 result = provider.getTypeDefaultConstruction(leaf, "1099511627776");
820 assertNotNull(result);
821 assertTrue(!result.isEmpty());
822 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt64(java.lang.Long.valueOf(\"1099511627776\"))",
825 leaf = provideLeafForGetDefaultConstructionTestCase("yang-string");
826 result = provider.getTypeDefaultConstruction(leaf, "TEST");
827 assertNotNull(result);
828 assertTrue(!result.isEmpty());
829 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangString(\"TEST\")",
832 leaf = provideLeafForGetDefaultConstructionTestCase("yang-decimal64");
833 result = provider.getTypeDefaultConstruction(leaf, "1274.25");
834 assertNotNull(result);
835 assertTrue(!result.isEmpty());
836 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangDecimal64(new java.math.BigDecimal(\"1274.25\"))",
839 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint8");
840 result = provider.getTypeDefaultConstruction(leaf, "128");
841 assertNotNull(result);
842 assertTrue(!result.isEmpty());
843 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangUint8(java.lang.Short.valueOf(\"128\"))",
846 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint16");
847 result = provider.getTypeDefaultConstruction(leaf, "1048576");
848 assertNotNull(result);
849 assertTrue(!result.isEmpty());
850 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangUint16(java.lang.Integer.valueOf(\"1048576\"))",
853 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint32");
854 result = provider.getTypeDefaultConstruction(leaf, "1099511627776");
855 assertNotNull(result);
856 assertTrue(!result.isEmpty());
857 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangUint32(java.lang.Long.valueOf(\"1099511627776\"))",
860 leaf = provideLeafForGetDefaultConstructionTestCase("yang-uint64");
861 result = provider.getTypeDefaultConstruction(leaf, "1208925819614629174706176");
862 assertNotNull(result);
863 assertTrue(!result.isEmpty());
864 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangUint64(new java.math.BigInteger(\"1208925819614629174706176\"))",
867 //FIXME: Is this correct scenario and correct result?
868 leaf = provideLeafForGetDefaultConstructionTestCase("complex-union");
869 result = provider.getTypeDefaultConstruction(leaf, "75");
870 assertNotNull(result);
871 assertTrue(!result.isEmpty());
872 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912.ComplexUnion(\"null\".toCharArray())",
875 //FIXME: Is this correct scenario and correct result?
876 leaf = provideLeafForGetDefaultConstructionTestCase("complex-string-int-union");
877 result = provider.getTypeDefaultConstruction(leaf, "TEST_UNION_STRING_DEFAULT");
878 assertNotNull(result);
879 assertTrue(!result.isEmpty());
880 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912.ComplexStringIntUnion(\"null\".toCharArray())",
883 leaf = provideLeafForGetDefaultConstructionTestCase("simple-int-types-union");
884 result = provider.getTypeDefaultConstruction(leaf, "2048");
885 assertNotNull(result);
886 assertTrue(!result.isEmpty());
887 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangUnion(\"null\".toCharArray())",
891 leaf = provideLeafForGetDefaultConstructionTestCase("direct-union-leaf");
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.DirectUnionLeaf(\"128\".toCharArray())",
898 final Module module = resolveModule("test-type-provider");
899 final QName leafUnionNode = QName.create(module.getQNameModule(), "root-union-leaf");
900 DataSchemaNode rootNode = module.getDataChildByName(leafUnionNode);
901 assertNotNull("leaf root-union-leaf is not present in root of module "+ module.getName(), rootNode);
902 assertTrue(rootNode instanceof LeafSchemaNode);
903 leaf = (LeafSchemaNode) rootNode;
904 result = provider.getTypeDefaultConstruction(leaf);
905 assertNotNull(result);
906 assertTrue(!result.isEmpty());
907 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912.TestTypeProviderData.RootUnionLeaf(\"256\".toCharArray())",
910 leaf = provideLeafForGetDefaultConstructionTestCase("yang-binary");
911 result = provider.getTypeDefaultConstruction(leaf, "0xffffff");
912 assertNotNull(result);
913 assertTrue(!result.isEmpty());
914 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangBinary(new byte[] {-45, 23, -33, 125, -9, -33})",
917 final QName leafBitsNode = QName.create(module.getQNameModule(), "root-bits-leaf");
918 rootNode = module.getDataChildByName(leafBitsNode);
919 assertNotNull("leaf bits-leaf is not present in root of module "+ module.getName(), rootNode);
920 assertTrue(rootNode instanceof LeafSchemaNode);
921 leaf = (LeafSchemaNode) rootNode;
922 result = provider.getTypeDefaultConstruction(leaf);
923 assertNotNull(result);
924 assertTrue(!result.isEmpty());
925 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912.TestTypeProviderData.RootBitsLeaf(false, true, false)",
928 leaf = provideLeafForGetDefaultConstructionTestCase("yang-bits");
929 result = provider.getTypeDefaultConstruction(leaf, "10-Mb-only");
930 assertNotNull(result);
931 assertTrue(!result.isEmpty());
932 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangBits(true, false, false)",
935 leaf = provideLeafForGetDefaultConstructionTestCase("bar-id");
936 result = provider.getTypeDefaultConstruction(leaf, "128");
937 assertNotNull(result);
938 assertTrue(!result.isEmpty());
939 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt16(java.lang.Short.valueOf(\"128\"))",
942 leaf = provideLeafForGetDefaultConstructionTestCase("foo-leafref-value");
943 result = provider.getTypeDefaultConstruction(leaf, "32");
944 assertNotNull(result);
945 assertTrue(!result.isEmpty());
946 assertEquals("new org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914.YangInt8(java.lang.Byte.valueOf(\"32\"))",
949 leaf = provideLeafForGetDefaultConstructionTestCase("foo-cond-bar-item");
950 result = provider.getTypeDefaultConstruction(leaf, "10");
951 assertNotNull(result);
952 assertTrue(!result.isEmpty());
953 assertEquals("new java.lang.Object()",