e7a42614ae529ad09bb13b304f270e2f8ee96de5
[yangtools.git] / yang / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / codec / xml / test / RpcReplyToDomTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.codec.xml.test;
9
10 import static junit.framework.Assert.assertNotNull;
11 import static junit.framework.Assert.assertTrue;
12
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.Set;
18 import javax.xml.parsers.DocumentBuilder;
19 import javax.xml.parsers.DocumentBuilderFactory;
20 import javax.xml.parsers.ParserConfigurationException;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
25 import org.opendaylight.yangtools.yang.data.api.SimpleNode;
26 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
27 import org.opendaylight.yangtools.yang.model.api.Module;
28 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
29 import org.opendaylight.yangtools.yang.model.parser.api.YangContextParser;
30 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
31 import org.w3c.dom.Document;
32 import org.xml.sax.SAXException;
33
34 /**
35  *
36  * @author Lukas Sedlak <lsedlak@cisco.com>
37  */
38 public class RpcReplyToDomTest {
39
40     private static final DocumentBuilderFactory BUILDER_FACTORY;
41     private static final String RES_SCHEMA_DIR = "/org/opendaylight/yangtools/yang/data/impl/schema";
42
43     private final static String MODEL_NAMESPACE = "org:opendaylight:rpc-reply:test:ns:yang";
44     private final static String MODEL_REVISION = "2014-07-17";
45
46     private final static QName RPC_OUTPUT_QNAME = QName.create(MODEL_NAMESPACE, MODEL_REVISION, "output");
47     private final static QName ROCK_THE_HOUSE_QNAME = QName.create(MODEL_NAMESPACE, MODEL_REVISION, "rock-the-house");
48     private final static QName ACTIV_SW_IMAGE_QNAME = QName.create(MODEL_NAMESPACE, MODEL_REVISION, "activate-software-image");
49
50     private SchemaContext schemaContext;
51     private Document testPayload1;
52     private Document testPayload2;
53
54     static {
55         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
56         factory.setNamespaceAware(true);
57         factory.setCoalescing(true);
58         factory.setIgnoringElementContentWhitespace(true);
59         factory.setIgnoringComments(true);
60         BUILDER_FACTORY = factory;
61     }
62
63     @Before
64     public void setup() throws Exception {
65         final List<InputStream> modelsToParse = Collections
66             .singletonList(getClass().getResourceAsStream(RES_SCHEMA_DIR + "/rpc-test-model.yang"));
67         assertNotNull(modelsToParse);
68         assertNotNull(modelsToParse.get(0));
69
70         final YangContextParser parser = new YangParserImpl();
71         final Set<Module> modules = parser.parseYangModelsFromStreams(modelsToParse);
72         assertTrue(!modules.isEmpty());
73         schemaContext = parser.resolveSchemaContext(modules);
74         assertNotNull(schemaContext);
75
76         final InputStream rpcPayloadStream1 = getClass().getResourceAsStream(RES_SCHEMA_DIR + "/rpc-test-payload1.xml");
77         InputStream rpcPayloadStream2 = getClass().getResourceAsStream(RES_SCHEMA_DIR + "/rpc-test-payload2.xml");
78
79         assertNotNull(rpcPayloadStream1);
80         assertNotNull(rpcPayloadStream2);
81
82         testPayload1 = readXmlToDocument(rpcPayloadStream1);
83         testPayload2 = readXmlToDocument(rpcPayloadStream2);
84
85         assertNotNull(testPayload1);
86         assertNotNull(testPayload2);
87     }
88
89     private static Document readXmlToDocument(InputStream xmlContent) throws SAXException, IOException {
90         DocumentBuilder dBuilder;
91         try {
92             dBuilder = BUILDER_FACTORY.newDocumentBuilder();
93         } catch (ParserConfigurationException e) {
94             throw new IllegalStateException("Failed to parse XML document", e);
95         }
96         Document doc = dBuilder.parse(xmlContent);
97
98         doc.getDocumentElement().normalize();
99         return doc;
100     }
101
102     @Test
103     public void test() {
104         final CompositeNode rockNode = XmlDocumentUtils
105             .rpcReplyToDomNodes(testPayload1, ROCK_THE_HOUSE_QNAME, schemaContext);
106         assertNotNull(rockNode);
107
108         final String namespace = "org:opendaylight:rpc-reply:test:ns:yang";
109         final String revision = "2014-07-17";
110
111         CompositeNode output = rockNode.getFirstCompositeByName(RPC_OUTPUT_QNAME);
112         assertNotNull(output);
113
114         final SimpleNode<?> zipCode = output.getFirstSimpleByName(
115             QName.create(namespace, revision, "zip-code"));
116         assertNotNull(zipCode);
117
118         final CompositeNode activNode = XmlDocumentUtils
119             .rpcReplyToDomNodes(testPayload2, ACTIV_SW_IMAGE_QNAME, schemaContext);
120         assertNotNull(activNode);
121
122         output = activNode.getFirstCompositeByName(RPC_OUTPUT_QNAME);
123         assertNotNull(output);
124
125         final CompositeNode imgProps = output
126             .getFirstCompositeByName(QName.create(namespace, revision, "image-properties"));
127         assertNotNull(imgProps);
128         final CompositeNode imgProperty = imgProps
129             .getFirstCompositeByName(QName.create(namespace, revision, "image-property"));
130         assertNotNull(imgProperty);
131
132         final SimpleNode<?> imgId = imgProperty
133             .getFirstSimpleByName(QName.create(namespace, revision, "image-id"));
134         assertNotNull(imgId);
135     }
136 }