*/
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");
@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);
}
/**
@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
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);
}
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);
}
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)
.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);
}