Remove a chunk of AbstractTypeProvider
[mdsal.git] / binding / mdsal-binding-generator / src / test / java / org / opendaylight / mdsal / binding / generator / impl / DefaultBindingGeneratorTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  * Copyright (c) 2021 PANTHEON.tech, s.r.o.
4  *
5  * This program and the accompanying materials are made available under the
6  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  * and is available at http://www.eclipse.org/legal/epl-v10.html
8  */
9 package org.opendaylight.mdsal.binding.generator.impl;
10
11 import static org.hamcrest.CoreMatchers.instanceOf;
12 import static org.hamcrest.MatcherAssert.assertThat;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertThrows;
15
16 import java.util.List;
17 import org.junit.AfterClass;
18 import org.junit.BeforeClass;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.junit.MockitoJUnitRunner;
22 import org.opendaylight.mdsal.binding.model.api.Enumeration;
23 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
24 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
25 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
26 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
27 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
28 import org.opendaylight.mdsal.binding.model.ri.Types;
29 import org.opendaylight.mdsal.binding.yang.types.TypeProviderTest;
30 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
31 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
32
33 /**
34  * General test suite revolving around {@link DefaultBindingGenerator}. This class holds tests originally aimed at
35  * specific implementation methods, but now they really are all about integration testing.
36  */
37 @RunWith(MockitoJUnitRunner.class)
38 public class DefaultBindingGeneratorTest {
39     public static final String BASE_YANG_TYPES =
40         "org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.base.yang.types.rev140914";
41     public static final String TEST_TYPE_PROVIDER =
42         "org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.model.rev140912";
43     public static final String TEST_TYPE_PROVIDER_B =
44         "org.opendaylight.yang.gen.v1.urn.opendaylight.org.test.type.provider.b.model.rev140915";
45     public static final JavaTypeName CONSTRUCTION_TYPE_TEST =
46         JavaTypeName.create(TEST_TYPE_PROVIDER, "ConstructionTypeTest");
47
48     public static EffectiveModelContext SCHEMA_CONTEXT;
49     public static List<GeneratedType> TYPES;
50
51     @BeforeClass
52     public static void beforeClass() {
53         SCHEMA_CONTEXT = YangParserTestUtils.parseYangResources(TypeProviderTest.class,
54             "/base-yang-types.yang", "/test-type-provider-b.yang", "/test-type-provider.yang");
55         TYPES = DefaultBindingGenerator.generateFor(SCHEMA_CONTEXT);
56     }
57
58     @AfterClass
59     public static void afterClass() {
60         SCHEMA_CONTEXT = null;
61         TYPES = null;
62     }
63
64     @Test
65     public void javaTypeForSchemaDefinitionLeafrefToEnumTypeTest() {
66         final var bData = assertGeneratedType(JavaTypeName.create(TEST_TYPE_PROVIDER_B, "TestTypeProviderBData"));
67         final var bDataMethods = bData.getMethodDefinitions();
68         assertEquals(8, bDataMethods.size());
69
70         final var bEnumType = assertGeneratedMethod(bDataMethods, "getEnum").getReturnType();
71         assertThat(bEnumType, instanceOf(Enumeration.class));
72         assertEquals(TEST_TYPE_PROVIDER + ".Foo.ResolveDirectUseOfEnum", bEnumType.getFullyQualifiedName());
73
74         final var bEnumsType = assertGeneratedMethod(bDataMethods, "getEnums").getReturnType();
75
76         assertThat(bEnumsType, instanceOf(ParameterizedType.class));
77         final var enumsType = (ParameterizedType) bEnumsType;
78
79         assertEquals(Types.typeForClass(List.class), enumsType.getRawType());
80         final var enumsTypeArgs = enumsType.getActualTypeArguments();
81         assertEquals(1, enumsTypeArgs.length);
82         assertEquals(TEST_TYPE_PROVIDER + ".Foo.ListOfEnums", enumsTypeArgs[0].getFullyQualifiedName());
83     }
84
85     @Test
86     public void generatedTypeForExtendedDefinitionTypeWithIdentityrefBaseTypeTest() {
87         final var type = assertGeneratedMethod(CONSTRUCTION_TYPE_TEST, "getAesIdentityrefType").getReturnType();
88         assertThat(type, instanceOf(ParameterizedType.class));
89         final var pType = (ParameterizedType) type;
90         assertEquals(Types.CLASS, pType.getRawType());
91         final var pTypeArgs = pType.getActualTypeArguments();
92         assertEquals(1, pTypeArgs.length);
93         assertEquals(TEST_TYPE_PROVIDER + ".Aes", pTypeArgs[0].getFullyQualifiedName());
94     }
95
96     @Test
97     public void generatedTypeForExtendedDefinitionTypeWithLeafrefBaseTypeTest() {
98         final var type = assertGeneratedMethod(CONSTRUCTION_TYPE_TEST, "getBarId").getReturnType();
99         assertThat(type, instanceOf(GeneratedTransferObject.class));
100         final var gto = (GeneratedTransferObject) type;
101         assertEquals(JavaTypeName.create(BASE_YANG_TYPES, "YangInt16"), gto.getIdentifier());
102     }
103
104     @Test
105     public void generatedTypeForExtendedDefinitionTypeWithInnerExtendedTypeTest() {
106         assertGTO(JavaTypeName.create(TEST_TYPE_PROVIDER, "ExtendedYangInt8"));
107     }
108
109     @Test
110     public void generatedTypeForExtendedDefinitionTypeTest() {
111         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangBoolean"));
112         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangEmpty"));
113         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangInt8"));
114         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangInt8Restricted"));
115         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangInt16"));
116         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangInt32"));
117         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangInt64"));
118         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangString"));
119         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangDecimal64"));
120         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangUint8"));
121         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangUint16"));
122         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangUint32"));
123         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangUint64"));
124         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangUnion"));
125         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangBinary"));
126         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangInstanceIdentifier"));
127         assertGTO(JavaTypeName.create(BASE_YANG_TYPES, "YangBits"));
128         assertEnumeration(JavaTypeName.create(BASE_YANG_TYPES, "YangEnumeration"));
129     }
130
131     @Test
132     public void provideGeneratedTOBuilderForUnionTypeDefWithInnerUnionTypesTest() {
133         final var gto = assertGTO(JavaTypeName.create(TEST_TYPE_PROVIDER, "ComplexUnion"));
134         assertEquals(3, gto.getProperties().size());
135         assertEquals(List.of(), gto.getEnumerations());
136         final var enclosed = gto.getEnclosedTypes();
137         assertEquals(1, enclosed.size());
138
139         final var union1 = enclosed.get(0);
140         assertThat(union1, instanceOf(GeneratedTransferObject.class));
141         assertEquals(TEST_TYPE_PROVIDER + ".ComplexUnion.ComplexUnion$1", union1.getFullyQualifiedName());
142         assertEquals(1, union1.getProperties().size());
143         assertEquals(List.of(), union1.getEnclosedTypes());
144
145         final var enums = union1.getEnumerations();
146         assertEquals(1, enums.size());
147         assertEquals(TEST_TYPE_PROVIDER + ".ComplexUnion.ComplexUnion$1.Enumeration",
148             enums.get(0).getFullyQualifiedName());
149     }
150
151     @Test
152     public void provideGeneratedTOBuilderForUnionTypeDefWithInnerUnionAndSimpleTypeTest() {
153         final var gto = assertGTO(JavaTypeName.create(TEST_TYPE_PROVIDER, "ComplexStringIntUnion"));
154         assertEquals(2, gto.getProperties().size());
155         assertEquals(List.of(), gto.getEnumerations());
156         assertEquals(List.of(), gto.getEnclosedTypes());
157     }
158
159     @Test
160     public void javaTypeForSchemaDefinitionForExtUnionWithSimpleTypesTest() {
161         final var type = assertGeneratedMethod(
162             JavaTypeName.create(TEST_TYPE_PROVIDER, "UseOfUnions"), "getSimpleIntTypesUnion").getReturnType();
163         assertThat(type, instanceOf(GeneratedTransferObject.class));
164         assertEquals(JavaTypeName.create(BASE_YANG_TYPES, "YangUnion"), type.getIdentifier());
165     }
166
167     @Test
168     public void javaTypeForSchemaDefinitionForExtUnionWithInnerUnionAndSimpleTypeTest() {
169         final var type = assertGeneratedMethod(
170             JavaTypeName.create(TEST_TYPE_PROVIDER, "UseOfUnions"), "getComplexStringIntUnion").getReturnType();
171         assertThat(type, instanceOf(GeneratedTransferObject.class));
172         assertEquals(JavaTypeName.create(TEST_TYPE_PROVIDER, "ComplexStringIntUnion"), type.getIdentifier());
173     }
174
175     @Test
176     public void javaTypeForSchemaDefinitionForExtComplexUnionWithInnerUnionTypesTest() {
177         final var type = assertGeneratedMethod(
178             JavaTypeName.create(TEST_TYPE_PROVIDER, "UseOfUnions"), "getComplexUnion").getReturnType();
179         assertThat(type, instanceOf(GeneratedTransferObject.class));
180         assertEquals(JavaTypeName.create(TEST_TYPE_PROVIDER, "ComplexUnion"), type.getIdentifier());
181     }
182
183     @Test
184     public void javaTypeForSchemaDefinitionIdentityrefExtTypeTest() {
185         final var type = assertGeneratedMethod(JavaTypeName.create(TEST_TYPE_PROVIDER, "Foo"), "getCrypto")
186             .getReturnType();
187         assertThat(type, instanceOf(ParameterizedType.class));
188         final var param = (ParameterizedType) type;
189         assertEquals(JavaTypeName.create(Class.class), param.getIdentifier());
190         final var params = param.getActualTypeArguments();
191         assertEquals(1, params.length);
192         assertEquals(Types.wildcardTypeFor(JavaTypeName.create(TEST_TYPE_PROVIDER, "CryptoAlg")), params[0]);
193     }
194
195     @Test
196     public void javaTypeForSchemaDefinitionEmptyStringPatternTypeTest() {
197         final var restrictions = assertGTO(JavaTypeName.create(TEST_TYPE_PROVIDER, "EmptyPatternString"))
198             .getRestrictions();
199         final var patterns = restrictions.getPatternConstraints();
200         assertEquals(1, patterns.size());
201         final var pattern = patterns.get(0);
202         assertEquals("", pattern.getRegularExpressionString());
203         assertEquals("^(?:)$", pattern.getJavaPatternString());
204     }
205
206     @Test
207     public void testUnresolvedLeafref() {
208         assertEquals(Types.objectType(), assertGeneratedMethod(JavaTypeName.create(TEST_TYPE_PROVIDER_B, "Grp"),
209             "getUnresolvableLeafref").getReturnType());
210     }
211
212     @Test
213     public void javaTypeForSchemaDefinitionInvalidLeafrefPathTest() {
214         final var ctx = YangParserTestUtils.parseYangResources(TypeProviderTest.class, "/unresolvable-leafref.yang");
215         final var ex = assertThrows(IllegalArgumentException.class, () -> DefaultBindingGenerator.generateFor(ctx));
216         assertEquals("Failed to find leafref target /somewhere/i/belong", ex.getMessage());
217         final var cause = ex.getCause();
218         assertThat(cause, instanceOf(IllegalArgumentException.class));
219         assertEquals("Data tree child (foo)somewhere not present", cause.getMessage());
220     }
221
222     private static MethodSignature assertGeneratedMethod(final JavaTypeName typeName, final String methodName) {
223         return assertGeneratedMethod(assertGeneratedType(typeName).getMethodDefinitions(), methodName);
224     }
225
226     private static MethodSignature assertGeneratedMethod(final List<MethodSignature> methods, final String name) {
227         return methods.stream().filter(method -> name.equals(method.getName()))
228             .findFirst()
229             .orElseThrow(() -> new AssertionError("Method " + name + " not present"));
230     }
231
232     private static GeneratedType assertGeneratedType(final JavaTypeName name) {
233         return TYPES.stream()
234             .filter(type -> name.equals(type.getIdentifier()))
235             .findFirst()
236             .orElseThrow(() -> new AssertionError("Generated type " + name + " not present"));
237     }
238
239     private static Enumeration assertEnumeration(final JavaTypeName name) {
240         final var type = assertGeneratedType(name);
241         assertThat(type, instanceOf(Enumeration.class));
242         return (Enumeration) type;
243     }
244
245     private static GeneratedTransferObject assertGTO(final JavaTypeName name) {
246         final var type = assertGeneratedType(name);
247         assertThat(type, instanceOf(GeneratedTransferObject.class));
248         return (GeneratedTransferObject) type;
249     }
250 }