2 * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.data.codec.gson;
10 import static org.junit.Assert.assertEquals;
12 import com.google.gson.stream.JsonReader;
13 import java.io.StringReader;
14 import org.junit.BeforeClass;
15 import org.junit.Test;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.common.QNameModule;
18 import org.opendaylight.yangtools.yang.common.Revision;
19 import org.opendaylight.yangtools.yang.common.XMLNamespace;
20 import org.opendaylight.yangtools.yang.common.YangDataName;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
22 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
23 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
24 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
25 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
26 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
27 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
28 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
29 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
31 public class YT1472Test {
32 private static final QNameModule RESTCONF_MODULE =
33 QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-restconf"), Revision.of("2017-01-26"));
34 private static final YangDataName ERRORS_NAME = new YangDataName(RESTCONF_MODULE, "yang-errors");
35 private static final NodeIdentifier ERROR_NID = NodeIdentifier.create(QName.create(RESTCONF_MODULE, "error"));
37 private static EffectiveModelContext CONTEXT;
38 private static JSONCodecFactory CODEC_FACTORY;
39 private static Inference ERRORS_INFERENCE;
42 public static void beforeClass() {
43 CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/yt1472");
44 CODEC_FACTORY = JSONCodecFactorySupplier.RFC7951.getShared(CONTEXT);
46 final var stack = SchemaInferenceStack.of(CONTEXT);
47 stack.enterYangData(ERRORS_NAME);
48 ERRORS_INFERENCE = stack.toInference();
52 public void testErrorsParsing() {
53 final var result = new NormalizationResultHolder();
54 final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
55 final var jsonParser = JsonParserStream.create(streamWriter, CODEC_FACTORY, ERRORS_INFERENCE);
56 // https://www.rfc-editor.org/rfc/rfc8040#page-77
57 jsonParser.parse(new JsonReader(new StringReader("""
59 "ietf-restconf:errors" : {
62 "error-type" : "protocol",
63 "error-tag" : "lock-denied",
64 "error-message" : "Lock failed; lock already held"
69 assertEquals(Builders.containerBuilder()
70 .withNodeIdentifier(NodeIdentifier.create(QName.create(RESTCONF_MODULE, "errors")))
71 .withChild(Builders.unkeyedListBuilder()
72 .withNodeIdentifier(ERROR_NID)
73 .withChild(Builders.unkeyedListEntryBuilder()
74 .withNodeIdentifier(ERROR_NID)
75 .withChild(ImmutableNodes.leafNode(QName.create(RESTCONF_MODULE, "error-type"), "protocol"))
76 .withChild(ImmutableNodes.leafNode(QName.create(RESTCONF_MODULE, "error-tag"), "lock-denied"))
77 .withChild(ImmutableNodes.leafNode(QName.create(RESTCONF_MODULE, "error-message"),
78 "Lock failed; lock already held"))
81 .build(), result.getResult().data());