Rework NormalizedNode type hierarchy
[yangtools.git] / yang / yang-data-codec-gson / src / test / java / org / opendaylight / yangtools / yang / data / codec / gson / JsonStreamToNormalizedNodeTest.java
index 822bda7f6f505f3c1408193b8d619b1e5cb09f04..6146779275771840c4f800c4a192554b883d4948 100644 (file)
@@ -7,50 +7,36 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.gson;
 
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.assertThrows;
 import static org.opendaylight.yangtools.yang.data.codec.gson.TestUtils.loadTextFile;
 import static org.opendaylight.yangtools.yang.data.impl.schema.Builders.augmentationBuilder;
 import static org.opendaylight.yangtools.yang.data.impl.schema.Builders.choiceBuilder;
 import static org.opendaylight.yangtools.yang.data.impl.schema.Builders.containerBuilder;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.gson.stream.JsonReader;
 import java.io.IOException;
 import java.io.StringReader;
 import java.net.URISyntaxException;
-import java.util.Collections;
-import org.junit.BeforeClass;
 import org.junit.Test;
-import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
 /**
  * Each test tests whether json input is correctly transformed to normalized node structure.
  */
-public class JsonStreamToNormalizedNodeTest {
-
-    private static final QName CONT_1 = QName.create("ns:complex:json", "2014-08-11", "cont1");
-    private static final QName EMPTY_LEAF = QName.create(CONT_1,"empty");
-    private static SchemaContext schemaContext;
-
-    @BeforeClass
-    public static void initialization() {
-        schemaContext = YangParserTestUtils.parseYangResourceDirectory("/complexjson/yang");
-    }
-
+public class JsonStreamToNormalizedNodeTest extends AbstractComplexJsonTest {
     @Test
     public void leafNodeInContainer() throws IOException, URISyntaxException {
         final String inputJson = loadTextFile("/complexjson/leaf-node-in-container.json");
@@ -148,27 +134,20 @@ public class JsonStreamToNormalizedNodeTest {
     @Test
     public void leafNamesakes() throws IOException, URISyntaxException {
         final String inputJson = loadTextFile("/complexjson/namesakes.json");
-        try {
-            //second parameter isn't necessary because error will be raised before it is used.
-            verifyTransformationToNormalizedNode(inputJson, null);
-            fail("Expected exception not raised");
-        } catch (final IllegalStateException e) {
-            final String errorMessage = e.getMessage();
-            assertTrue(errorMessage.contains("Choose suitable module name for element lf11-namesake:"));
-            assertTrue(errorMessage.contains("complexjson-augmentation"));
-            assertTrue(errorMessage.contains("complexjson-augmentation-namesake"));
-        }
+        final IllegalStateException ex = assertThrows(IllegalStateException.class,
+            // second parameter isn't necessary because error will be raised before it is used.
+            () -> verifyTransformationToNormalizedNode(inputJson, null));
+
+        final String errorMessage = ex.getMessage();
+        assertThat(errorMessage, containsString("Choose suitable module name for element lf11-namesake:"));
+        assertThat(errorMessage, containsString("complexjson-augmentation"));
+        assertThat(errorMessage, containsString("complexjson-augmentation-namesake"));
     }
 
     @Test
     public void emptyTypeTest() throws IOException, URISyntaxException {
         final String inputJson = loadTextFile("/complexjson/type-empty.json");
-        final ContainerNode awaitedStructure = containerBuilder()
-                .withNodeIdentifier(new NodeIdentifier(CONT_1))
-                .addChild(leafNode(EMPTY_LEAF, Empty.getInstance()))
-                .build();
-
-        verifyTransformationToNormalizedNode(inputJson, awaitedStructure);
+        verifyTransformationToNormalizedNode(inputJson, CONT1_WITH_EMPTYLEAF);
     }
 
     /**
@@ -180,12 +159,29 @@ public class JsonStreamToNormalizedNodeTest {
     @Test
     public void parsingNotExistingElement() throws IOException, URISyntaxException {
         final String inputJson = loadTextFile("/complexjson/not-existing-element.json");
-        try {
+        final IllegalStateException ex = assertThrows(IllegalStateException.class,
             //second parameter isn't necessary because error will be raised before it is used.
-            verifyTransformationToNormalizedNode(inputJson, null);
-        } catch (final IllegalStateException e) {
-            assertTrue(e.getMessage().contains("Schema node with name dummy-element was not found"));
-        }
+            () -> verifyTransformationToNormalizedNode(inputJson, null));
+
+        assertThat(ex.getMessage(), containsString("Schema node with name dummy-element was not found"));
+    }
+
+    /**
+     * Should not fail as we set the parser to be lenient.
+     *
+     * <p>
+     * Json input contains element which doesn't exist in YANG schema
+     */
+    @Test
+    public void parsingSkipNotExistingElement() throws IOException, URISyntaxException {
+        final String inputJson = loadTextFile("/complexjson/not-existing-element.json");
+        final NormalizedNodeResult result = new NormalizedNodeResult();
+        final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
+        final JsonParserStream jsonParser = JsonParserStream.createLenient(streamWriter,
+            JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
+        jsonParser.parse(new JsonReader(new StringReader(inputJson)));
+        final NormalizedNode transformedInput = result.getResult();
+        assertNotNull(transformedInput);
     }
 
     @Test
@@ -194,11 +190,10 @@ public class JsonStreamToNormalizedNodeTest {
 
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-        final SchemaNode parentNode = schemaContext.getDataChildByName(CONT_1);
-        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
-            JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext), parentNode);
+        final SchemaNode parentNode = schemaContext.findDataChildByName(CONT_1).get();
+        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter, lhotkaCodecFactory, parentNode);
         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
-        final NormalizedNode<?, ?> transformedInput = result.getResult();
+        final NormalizedNode transformedInput = result.getResult();
         assertNotNull(transformedInput);
     }
 
@@ -208,11 +203,10 @@ public class JsonStreamToNormalizedNodeTest {
 
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-        final SchemaNode parentNode = schemaContext.getDataChildByName(CONT_1);
-        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
-            JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext), parentNode);
+        final SchemaNode parentNode = schemaContext.findDataChildByName(CONT_1).get();
+        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter, lhotkaCodecFactory, parentNode);
         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
-        final NormalizedNode<?, ?> transformedInput = result.getResult();
+        final NormalizedNode transformedInput = result.getResult();
         assertNotNull(transformedInput);
     }
 
@@ -222,20 +216,20 @@ public class JsonStreamToNormalizedNodeTest {
 
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-        final SchemaNode parentNode = schemaContext.getDataChildByName(CONT_1);
+        final SchemaNode parentNode = schemaContext.findDataChildByName(CONT_1).get();
 
         final QName augmentChoice1QName = QName.create(parentNode.getQName(), "augment-choice1");
         final QName augmentChoice2QName = QName.create(augmentChoice1QName, "augment-choice2");
         final QName containerQName = QName.create(augmentChoice1QName, "case11-choice-case-container");
         final QName leafQName = QName.create(augmentChoice1QName, "case11-choice-case-leaf");
 
-        final AugmentationIdentifier aug1Id = new AugmentationIdentifier(Collections.singleton(augmentChoice1QName));
-        final AugmentationIdentifier aug2Id = new AugmentationIdentifier(Collections.singleton(augmentChoice2QName));
+        final AugmentationIdentifier aug1Id = new AugmentationIdentifier(ImmutableSet.of(augmentChoice1QName));
+        final AugmentationIdentifier aug2Id = new AugmentationIdentifier(ImmutableSet.of(augmentChoice2QName));
         final NodeIdentifier augmentChoice1Id = new NodeIdentifier(augmentChoice1QName);
         final NodeIdentifier augmentChoice2Id = new NodeIdentifier(augmentChoice2QName);
         final NodeIdentifier containerId = new NodeIdentifier(containerQName);
 
-        final NormalizedNode<?, ?> cont1Normalized =
+        final NormalizedNode cont1Normalized =
                 containerBuilder().withNodeIdentifier(new NodeIdentifier(parentNode.getQName()))
                         .withChild(augmentationBuilder().withNodeIdentifier(aug1Id)
                                 .withChild(choiceBuilder().withNodeIdentifier(augmentChoice1Id)
@@ -249,22 +243,20 @@ public class JsonStreamToNormalizedNodeTest {
                                         .build())
                                 .build()).build();
 
-        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
-            JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
+        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter, lhotkaCodecFactory);
         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
-        final NormalizedNode<?, ?> transformedInput = result.getResult();
+        final NormalizedNode transformedInput = result.getResult();
         assertNotNull(transformedInput);
         assertEquals(cont1Normalized, transformedInput);
     }
 
     private static void verifyTransformationToNormalizedNode(final String inputJson,
-            final NormalizedNode<?, ?> awaitedStructure) {
+            final NormalizedNode awaitedStructure) {
         final NormalizedNodeResult result = new NormalizedNodeResult();
         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
-            JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext));
+        final JsonParserStream jsonParser = JsonParserStream.create(streamWriter, lhotkaCodecFactory);
         jsonParser.parse(new JsonReader(new StringReader(inputJson)));
-        final NormalizedNode<?, ?> transformedInput = result.getResult();
+        final NormalizedNode transformedInput = result.getResult();
         assertEquals("Transformation of json input to normalized node wasn't successful.", awaitedStructure,
                 transformedInput);
     }