2 * Copyright (c) 2014 Cisco Systems, Inc. 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.controller.sal.restconf.impl.cnsn.to.xml.test;
10 import static org.junit.Assert.assertNotNull;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.when;
15 import com.google.common.base.Optional;
16 import com.google.common.collect.Lists;
17 import java.io.IOException;
18 import java.util.List;
19 import javax.ws.rs.WebApplicationException;
20 import javax.xml.transform.TransformerFactoryConfigurationError;
21 import org.junit.BeforeClass;
22 import org.junit.Test;
23 import org.opendaylight.controller.sal.rest.impl.StructuredDataToXmlProvider;
24 import org.opendaylight.controller.sal.restconf.impl.test.TestUtils;
25 import org.opendaylight.controller.sal.restconf.impl.test.YangAndXmlAndDataSchemaLoader;
26 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
27 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
28 import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode;
29 import org.opendaylight.yangtools.yang.data.api.MutableSimpleNode;
30 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
31 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
32 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
33 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
35 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
36 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
37 import org.opendaylight.yangtools.yang.model.util.BinaryType;
38 import org.opendaylight.yangtools.yang.model.util.BitsType;
39 import org.opendaylight.yangtools.yang.model.util.BooleanType;
40 import org.opendaylight.yangtools.yang.model.util.EmptyType;
41 import org.opendaylight.yangtools.yang.model.util.EnumerationType;
42 import org.opendaylight.yangtools.yang.model.util.Int16;
43 import org.opendaylight.yangtools.yang.model.util.Int32;
44 import org.opendaylight.yangtools.yang.model.util.Int64;
45 import org.opendaylight.yangtools.yang.model.util.Int8;
46 import org.opendaylight.yangtools.yang.model.util.StringType;
47 import org.opendaylight.yangtools.yang.model.util.Uint16;
48 import org.opendaylight.yangtools.yang.model.util.Uint32;
49 import org.opendaylight.yangtools.yang.model.util.Uint64;
50 import org.opendaylight.yangtools.yang.model.util.Uint8;
51 import org.opendaylight.yangtools.yang.model.util.UnionType;
55 * CnSn = Composite node and Simple node data structure Class contains test of serializing simple nodes data values
56 * according data types from YANG schema to XML file
59 public class CnSnToXmlTest extends YangAndXmlAndDataSchemaLoader {
61 public static void initialization() {
62 dataLoad("/cnsn-to-xml/yang", 2, "basic-module", "cont");
66 public void snAsYangIdentityrefToXMLTest() {
67 serializeToXml(prepareIdentityrefData(null, true), "<lf11 xmlns:x=\"referenced:module\">x:iden</lf11>");
71 public void snAsYangIdentityrefWithQNamePrefixToXMLTest() {
72 serializeToXml(prepareIdentityrefData("prefix", true),
73 "<lf11 xmlns","=\"referenced:module\">",":iden</lf11>");
77 public void snAsYangIdentityrefWithPrefixToXMLTest() {
78 serializeToXml(prepareIdentityrefData("prefix", false), "<lf11>no qname value</lf11>");
82 public void snAsYangLeafrefWithPrefixToXMLTest() {
83 serializeToXml(prepareLeafrefData(), "<lfBoolean>true</lfBoolean>", "<lfLfref>true</lfLfref>");
87 public void snAsYangStringToXmlTest() {
89 prepareCnStructForYangData(
90 TypeDefinitionAwareCodec.from(StringType.getInstance()).deserialize("lfStr value"), "lfStr"),
91 "<lfStr>lfStr value</lfStr>");
95 public void snAsYangInt8ToXmlTest() {
96 final String elName = "lfInt8";
98 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int8.getInstance()).deserialize("14"), elName),
99 "<" + elName + ">14</" + elName + ">");
103 public void snAsYangInt16ToXmlTest() {
104 final String elName = "lfInt16";
106 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int16.getInstance()).deserialize("3000"),
107 elName), "<" + elName + ">3000</" + elName + ">");
111 public void snAsYangInt32ToXmlTest() {
112 final String elName = "lfInt32";
114 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int32.getInstance()).deserialize("201234"),
115 elName), "<" + elName + ">201234</" + elName + ">");
119 public void snAsYangInt64ToXmlTest() {
120 final String elName = "lfInt64";
122 prepareCnStructForYangData(
123 TypeDefinitionAwareCodec.from(Int64.getInstance()).deserialize("5123456789"), elName), "<"
124 + elName + ">5123456789</" + elName + ">");
128 public void snAsYangUint8ToXmlTest() {
129 final String elName = "lfUint8";
131 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint8.getInstance()).deserialize("200"),
132 elName), "<" + elName + ">200</" + elName + ">");
136 public void snAsYangUint16ToXmlTest() {
137 final String elName = "lfUint16";
139 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint16.getInstance()).deserialize("4000"),
140 elName), "<" + elName + ">4000</" + elName + ">");
144 public void snAsYangUint32ToXmlTest() {
145 final String elName = "lfUint32";
147 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint32.getInstance())
148 .deserialize("4123456789"), elName), "<" + elName + ">4123456789</" + elName + ">");
152 public void snAsYangUint64ToXmlTest() {
153 final String elName = "lfUint64";
155 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint64.getInstance())
156 .deserialize("5123456789"), elName), "<" + elName + ">5123456789</" + elName + ">");
160 public void snAsYangBinaryToXmlTest() {
161 final String elName = "lfBinary";
163 prepareCnStructForYangData(
164 TypeDefinitionAwareCodec.from(BinaryType.getInstance()).deserialize(
165 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567"), elName), "<" + elName
166 + ">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567</" + elName + ">");
170 public void snAsYangBitsToXmlTest() {
171 final BitsTypeDefinition.Bit mockBit1 = mock(BitsTypeDefinition.Bit.class);
172 when(mockBit1.getName()).thenReturn("one");
173 final BitsTypeDefinition.Bit mockBit2 = mock(BitsTypeDefinition.Bit.class);
174 when(mockBit2.getName()).thenReturn("two");
175 final List<BitsTypeDefinition.Bit> bitList = Lists.newArrayList(mockBit1, mockBit2);
177 final String elName = "lfBits";
179 prepareCnStructForYangData(
180 TypeDefinitionAwareCodec.from(BitsType.create(mock(SchemaPath.class), bitList)).deserialize(
181 "one two"), elName), "<" + elName + ">one two</" + elName + ">", "<" + elName
182 + ">two one</" + elName + ">");
186 public void snAsYangEnumerationToXmlTest() {
187 final EnumTypeDefinition.EnumPair mockEnum = mock(EnumTypeDefinition.EnumPair.class);
188 when(mockEnum.getName()).thenReturn("enum2");
189 final List<EnumPair> enumList = Lists.newArrayList(mockEnum);
191 final String elName = "lfEnumeration";
193 prepareCnStructForYangData(
194 TypeDefinitionAwareCodec.from(
195 EnumerationType.create(mock(SchemaPath.class), enumList,
196 Optional.<EnumTypeDefinition.EnumPair> absent())).deserialize("enum2"), elName),
197 "<" + elName + ">enum2</" + elName + ">");
201 public void snAsYangEmptyToXmlTest() {
202 final String elName = "lfEmpty";
204 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(EmptyType.getInstance()).deserialize(null),
205 elName), "<" + elName + "/>");
209 public void snAsYangBooleanToXmlTest() {
210 final String elName = "lfBoolean";
212 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(BooleanType.getInstance()).deserialize("str"),
213 elName), "<" + elName + ">false</" + elName + ">");
215 prepareCnStructForYangData(
216 TypeDefinitionAwareCodec.from(BooleanType.getInstance()).deserialize("true"), elName), "<"
217 + elName + ">true</" + elName + ">");
221 public void snAsYangUnionToXmlTest() {
223 final BitsTypeDefinition.Bit mockBit1 = mock(BitsTypeDefinition.Bit.class);
224 when(mockBit1.getName()).thenReturn("first");
225 final BitsTypeDefinition.Bit mockBit2 = mock(BitsTypeDefinition.Bit.class);
226 when(mockBit2.getName()).thenReturn("second");
227 final List<BitsTypeDefinition.Bit> bitList = Lists.newArrayList(mockBit1, mockBit2);
229 final List<TypeDefinition<?>> types = Lists.<TypeDefinition<?>> newArrayList(Int8.getInstance(),
230 BitsType.create(mock(SchemaPath.class), bitList), BooleanType.getInstance());
231 final UnionType unionType = UnionType.create(types);
233 final String elName = "lfUnion";
234 final String int8 = "15";
235 serializeToXml(prepareCnStructForYangData(TypeDefinitionAwareCodec.from(unionType).deserialize(int8), elName),
236 "<" + elName + ">15</" + elName + ">");
238 final String bits = "first second";
239 serializeToXml(prepareCnStructForYangData(TypeDefinitionAwareCodec.from(unionType).deserialize(bits), elName),
240 "<" + elName + ">first second</" + elName + ">");
242 final String bool = "str";
243 serializeToXml(prepareCnStructForYangData(TypeDefinitionAwareCodec.from(unionType).deserialize(bool), elName),
244 "<" + elName + ">str</" + elName + ">");
247 private void serializeToXml(final CompositeNode compositeNode, final String... xmlRepresentation)
248 throws TransformerFactoryConfigurationError {
249 String xmlString = "";
251 xmlString = TestUtils.writeCompNodeWithSchemaContextToOutput(compositeNode, modules, dataSchemaNode,
252 StructuredDataToXmlProvider.INSTANCE);
253 } catch (WebApplicationException | IOException e) {
255 assertNotNull(xmlString);
256 boolean containSearchedStr = false;
257 String strRepresentation = "";
258 for (final String searchedStr : xmlRepresentation) {
259 if (xmlString.contains(searchedStr)) {
260 containSearchedStr = true;
263 strRepresentation = strRepresentation + "[" + searchedStr + "]";
265 assertTrue("At least one of specified strings " + strRepresentation + " wasn't found.", containSearchedStr);
269 private CompositeNode prepareIdentityrefData(final String prefix, final boolean valueAsQName) {
270 final MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(
271 TestUtils.buildQName("cont", "basic:module", "2013-12-2"), null, null, ModifyAction.CREATE, null);
272 final MutableCompositeNode cont1 = NodeFactory.createMutableCompositeNode(
273 TestUtils.buildQName("cont1", "basic:module", "2013-12-2"), cont, null, ModifyAction.CREATE, null);
274 cont.getValue().add(cont1);
278 value = TestUtils.buildQName("iden", "referenced:module", "2013-12-2", prefix);
280 value = "no qname value";
282 final MutableSimpleNode<Object> lf11 = NodeFactory.createMutableSimpleNode(
283 TestUtils.buildQName("lf11", "basic:module", "2013-12-2"), cont1, value, ModifyAction.CREATE, null);
284 cont1.getValue().add(lf11);
291 private CompositeNode prepareCnStructForYangData(final Object data, final String leafName) {
292 final MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(
293 TestUtils.buildQName("cont", "basic:module", "2013-12-2"), null, null, ModifyAction.CREATE, null);
295 final MutableSimpleNode<Object> lf1 = NodeFactory.createMutableSimpleNode(
296 TestUtils.buildQName(leafName, "basic:module", "2013-12-2"), cont, data, ModifyAction.CREATE, null);
297 cont.getValue().add(lf1);
303 private CompositeNode prepareLeafrefData() {
304 final MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(TestUtils.buildQName("cont"), null, null,
305 ModifyAction.CREATE, null);
307 final MutableSimpleNode<Object> lfBoolean = NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfBoolean"),
308 cont, Boolean.TRUE, ModifyAction.CREATE, null);
309 final MutableSimpleNode<Object> lfLfref = NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfLfref"), cont,
310 "true", ModifyAction.CREATE, null);
311 cont.getValue().add(lfBoolean);
312 cont.getValue().add(lfLfref);