Bug 2721: StackOverflowError for leafref FIX
[yangtools.git] / code-generator / binding-type-provider / src / test / java / org / opendaylight / yangtools / sal / binding / yang / types / TypeProviderImplTest.java
index f1ddfbcabe1639d372b9e63550901ce6532ec233..1742adcceea3d61801974eeffd8426d5d775cc64 100644 (file)
@@ -14,6 +14,7 @@ import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Optional;
 import java.io.File;
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -22,11 +23,16 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
+import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 import org.opendaylight.yangtools.yang.model.util.BinaryType;
@@ -40,12 +46,67 @@ import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBui
 import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
+import org.opendaylight.yangtools.yang.parser.util.YangValidationException;
 
 public class TypeProviderImplTest {
 
     @Rule
     public ExpectedException expException = ExpectedException.none();
 
+    @Test (expected = YangValidationException.class)
+    public void testLeafRefRelativeSelfReference() throws Exception {
+        File relative = new File(getClass().getResource("/leafref/leafref-relative-invalid.yang").toURI());
+
+        final YangParserImpl yangParser = new YangParserImpl();
+        final SchemaContext schemaContext = yangParser.parseFiles(Arrays.asList(relative));
+        final Module moduleRelative = schemaContext.findModuleByNamespace(new URI("urn:xml:ns:yang:lrr")).iterator().next();
+        final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
+
+        DataSchemaNode leafref = ((ListSchemaNode) moduleRelative.getDataChildByName("neighbor")).getDataChildByName("neighbor-id");
+        LeafSchemaNode leaf = (LeafSchemaNode) leafref;
+        TypeDefinition<?> leafType = leaf.getType();
+        Type leafrefResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafType, leaf);
+    }
+
+    @Test (expected = YangValidationException.class)
+    public void testLeafRefAbsoluteSelfReference() throws Exception {
+        File relative = new File(getClass().getResource("/leafref/leafref-absolute-invalid.yang").toURI());
+
+        final YangParserImpl yangParser = new YangParserImpl();
+        final SchemaContext schemaContext = yangParser.parseFiles(Arrays.asList(relative));
+        final Module moduleRelative = schemaContext.findModuleByNamespace(new URI("urn:xml:ns:yang:lra")).iterator().next();
+        final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
+
+        DataSchemaNode leafref = ((ListSchemaNode) moduleRelative.getDataChildByName("neighbor")).getDataChildByName("neighbor-id");
+        LeafSchemaNode leaf = (LeafSchemaNode) leafref;
+        TypeDefinition<?> leafType = leaf.getType();
+        Type leafrefResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafType, leaf);
+    }
+
+    @Test
+    public void testLeafRefRelativeAndAbsoluteValidReference() throws URISyntaxException {
+        File valid = new File(getClass().getResource("/leafref/leafref-valid.yang").toURI());
+
+        final YangParserImpl yangParser = new YangParserImpl();
+        final SchemaContext schemaContext = yangParser.parseFiles(Arrays.asList(valid));
+        final Module moduleValid = schemaContext.findModuleByNamespace(new URI("urn:xml:ns:yang:lrv")).iterator().next();
+        final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
+
+        DataSchemaNode leafrefRel = ((ListSchemaNode) moduleValid.getDataChildByName("neighbor")).getDataChildByName
+                ("neighbor-id");
+        LeafSchemaNode leafRel = (LeafSchemaNode) leafrefRel;
+        TypeDefinition<?> leafTypeRel = leafRel.getType();
+        Type leafrefRelResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafTypeRel, leafRel);
+        assertNotNull(leafrefRelResolvedType);
+
+        DataSchemaNode leafrefAbs = ((ListSchemaNode) moduleValid.getDataChildByName("neighbor")).getDataChildByName
+                ("neighbor2-id");
+        LeafSchemaNode leafAbs = (LeafSchemaNode) leafrefAbs;
+        TypeDefinition<?> leafTypeAbs = leafAbs.getType();
+        Type leafrefAbsResolvedType = typeProvider.javaTypeForSchemaDefinitionType(leafTypeAbs, leafAbs);
+        assertNotNull(leafrefAbsResolvedType);
+    }
+
     @Test
     public void testMethodsOfTypeProviderImpl() throws URISyntaxException {
         final YangParserImpl yangParser = new YangParserImpl();