Bug 6859 #2 Binding generator v1 refactoring
[mdsal.git] / binding / mdsal-binding-generator-impl / src / test / java / org / opendaylight / yangtools / sal / binding / generator / util / YangSchemaUtilsTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.sal.binding.generator.util;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13 import static org.mockito.Matchers.any;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.withSettings;
17 import static org.opendaylight.yangtools.sal.binding.yang.types.TypeProviderModel.createTestContext;
18
19 import com.google.common.collect.ImmutableList;
20 import com.google.common.collect.ImmutableSet;
21 import java.lang.reflect.Constructor;
22 import java.net.URI;
23 import java.util.ArrayList;
24 import java.util.Date;
25 import java.util.List;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.opendaylight.yangtools.yang.common.QName;
29 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
30 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
31 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
33 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
34 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
35 import org.opendaylight.yangtools.yang.model.api.Module;
36 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
37 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
38 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
39 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
40
41 public class YangSchemaUtilsTest {
42
43     private static final AugmentationSchema AUGMENTATION_SCHEMA = mock(AugmentationSchema.class);
44     private static final UnknownSchemaNode UNKNOWN_SCHEMA_NODE = mock(UnknownSchemaNode.class);
45     private static final QName Q_NAME =
46             QName.create(URI.create("testUri"), new Date(System.currentTimeMillis()), "foo_augment");
47
48     @Before
49     public void setUp() throws Exception {
50         doReturn(ImmutableList.of(UNKNOWN_SCHEMA_NODE)).when(AUGMENTATION_SCHEMA).getUnknownSchemaNodes();
51         doReturn(QName.create(YangSchemaUtils.AUGMENT_IDENTIFIER)).when(UNKNOWN_SCHEMA_NODE).getNodeType();
52         doReturn(Q_NAME).when(UNKNOWN_SCHEMA_NODE).getQName();
53     }
54
55     @Test
56     public void getAugmentationQName() throws Exception {
57         assertEquals(Q_NAME, YangSchemaUtils.getAugmentationQName(AUGMENTATION_SCHEMA));
58         final DataSchemaNode dataSchemaNode = mock(DataSchemaNode.class);
59         doReturn(Q_NAME).when(UNKNOWN_SCHEMA_NODE).getNodeType();
60         doReturn(ImmutableList.of(dataSchemaNode)).when(AUGMENTATION_SCHEMA).getChildNodes();
61         doReturn(false).when(dataSchemaNode).isAugmenting();
62         doReturn(Q_NAME).when(dataSchemaNode).getQName();
63         doReturn(ImmutableList.of(dataSchemaNode)).when(AUGMENTATION_SCHEMA).getChildNodes();
64         assertEquals(Q_NAME, YangSchemaUtils.getAugmentationQName(AUGMENTATION_SCHEMA));
65     }
66
67     @Test
68     public void getAugmentationIdentifier() throws Exception {
69         assertEquals(Q_NAME, YangSchemaUtils.getAugmentationIdentifier(AUGMENTATION_SCHEMA));
70         doReturn(Q_NAME).when(UNKNOWN_SCHEMA_NODE).getNodeType();
71         assertNull(YangSchemaUtils.getAugmentationIdentifier(AUGMENTATION_SCHEMA));
72     }
73
74     @Test
75     public void findTypeDefinition() throws Exception {
76         SchemaContext context = createTestContext();
77         assertNotNull(context);
78         final QName qName = QName.create(context.getModules().iterator().next().getNamespace(),
79                 context.getModules().iterator().next().getRevision(), context.getModules().iterator().next().getName());
80         assertNull(YangSchemaUtils.findTypeDefinition(context, SchemaPath.create(ImmutableList.of(qName), false)));
81         final List qNames = new ArrayList();
82         context.getTypeDefinitions().forEach(typeDefinition -> qNames.add(typeDefinition.getQName()));
83         assertNull(YangSchemaUtils.findTypeDefinition(context, SchemaPath.create(qNames, false)));
84
85         context = mock(SchemaContext.class);
86         final Module container = mock(Module.class);
87         doReturn(null).when(context).findModuleByNamespaceAndRevision(any(), any());
88         assertNull(YangSchemaUtils.findTypeDefinition(context, SchemaPath.create(qNames, false)));
89         doReturn(container).when(context).findModuleByNamespaceAndRevision(any(), any());
90
91         final DataSchemaNode node = mock(DataSchemaNode.class);
92         doReturn(node).when(container).getDataChildByName((QName) any());
93         final TypeDefinition typeDefinition = mock(TypeDefinition.class);
94         doReturn(Q_NAME).when(typeDefinition).getQName();
95         doReturn(ImmutableSet.of(typeDefinition)).when(container).getTypeDefinitions();
96         assertEquals(typeDefinition,
97                 YangSchemaUtils.findTypeDefinition(context, SchemaPath.create(ImmutableList.of(Q_NAME), false)));
98
99         final GroupingDefinition grouping = mock(GroupingDefinition.class);
100         doReturn(Q_NAME).when(grouping).getQName();
101         doReturn(ImmutableSet.of(grouping)).when(container).getGroupings();
102         doReturn(ImmutableSet.of(typeDefinition)).when(grouping).getTypeDefinitions();
103         assertEquals(typeDefinition,
104                 YangSchemaUtils.findTypeDefinition(context, SchemaPath.create(ImmutableList.of(Q_NAME, Q_NAME), false)));
105
106         final DataNodeContainer dataNode =
107                 mock(DataNodeContainer.class, withSettings().extraInterfaces(DataSchemaNode.class));
108         doReturn(dataNode).when(container).getDataChildByName((QName) any());
109         doReturn(ImmutableSet.of(typeDefinition)).when(dataNode).getTypeDefinitions();
110         assertEquals(typeDefinition,
111                 YangSchemaUtils.findTypeDefinition(context, SchemaPath.create(ImmutableList.of(Q_NAME, Q_NAME), false)));
112
113         final ChoiceSchemaNode choiceNode =
114                 mock(ChoiceSchemaNode.class, withSettings().extraInterfaces(DataSchemaNode.class));
115         doReturn(choiceNode).when(container).getDataChildByName((QName) any());
116         final ChoiceCaseNode caseNode = mock(ChoiceCaseNode.class);
117         doReturn(caseNode).when(choiceNode).getCaseNodeByName((QName) any());
118         doReturn(ImmutableSet.of(typeDefinition)).when(caseNode).getTypeDefinitions();
119         assertEquals(typeDefinition,
120                 YangSchemaUtils.findTypeDefinition(context,
121                         SchemaPath.create(ImmutableList.of(Q_NAME, Q_NAME, Q_NAME), false)));
122     }
123
124     @Test(expected = UnsupportedOperationException.class)
125     public void privateConstructTest() throws Throwable {
126         final Constructor constructor = YangSchemaUtils.class.getDeclaredConstructor();
127         constructor.setAccessible(true);
128         try {
129             constructor.newInstance();
130         } catch (Exception e) {
131             throw e.getCause();
132         }
133     }
134 }