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 java.io.IOException;
16 import java.util.List;
18 import javax.ws.rs.WebApplicationException;
19 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;
53 import com.google.common.base.Optional;
54 import com.google.common.collect.Lists;
58 * CnSn = Composite node and Simple node data structure Class contains test of
59 * serializing simple nodes data values according data types from YANG schema to
63 public class CnSnToXmlTest extends YangAndXmlAndDataSchemaLoader {
65 public static void initialization() {
66 dataLoad("/cnsn-to-xml/yang", 2, "basic-module", "cont");
70 public void snAsYangIdentityrefToXMLTest() {
71 serializeToXml(prepareIdentityrefData(null, true), "<lf11 xmlns:x=\"referenced:module\">x:iden</lf11>");
75 public void snAsYangIdentityrefWithQNamePrefixToXMLTest() {
76 serializeToXml(prepareIdentityrefData("prefix", true),
77 "<lf11 xmlns:prefix=\"referenced:module\">prefix:iden</lf11>");
81 public void snAsYangIdentityrefWithPrefixToXMLTest() {
82 serializeToXml(prepareIdentityrefData("prefix", false), "<lf11>no qname value</lf11>");
86 public void snAsYangLeafrefWithPrefixToXMLTest() {
87 serializeToXml(prepareLeafrefData(), "<lfBoolean>true</lfBoolean>", "<lfLfref>true</lfLfref>");
92 public void snAsYangStringToXmlTest() {
94 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(StringType.getInstance()).deserialize("lfStr value"),
95 "lfStr"), "<lfStr>lfStr value</lfStr>");
99 public void snAsYangInt8ToXmlTest() {
100 String elName = "lfInt8";
102 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int8.getInstance()).deserialize("14"), elName), "<"
103 + elName + ">14</" + elName + ">");
107 public void snAsYangInt16ToXmlTest() {
108 String elName = "lfInt16";
110 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int16.getInstance()).deserialize("3000"), elName),
111 "<" + elName + ">3000</" + elName + ">");
115 public void snAsYangInt32ToXmlTest() {
116 String elName = "lfInt32";
118 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int32.getInstance()).deserialize("201234"), elName),
119 "<" + elName + ">201234</" + elName + ">");
123 public void snAsYangInt64ToXmlTest() {
124 String elName = "lfInt64";
126 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Int64.getInstance()).deserialize("5123456789"),
127 elName), "<" + elName + ">5123456789</" + elName + ">");
131 public void snAsYangUint8ToXmlTest() {
132 String elName = "lfUint8";
134 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint8.getInstance()).deserialize("200"), elName),
135 "<" + elName + ">200</" + elName + ">");
139 public void snAsYangUint16ToXmlTest() {
140 String elName = "lfUint16";
142 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint16.getInstance()).deserialize("4000"), elName),
143 "<" + elName + ">4000</" + elName + ">");
147 public void snAsYangUint32ToXmlTest() {
148 String elName = "lfUint32";
150 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint32.getInstance()).deserialize("4123456789"),
151 elName), "<" + elName + ">4123456789</" + elName + ">");
155 public void snAsYangUint64ToXmlTest() {
156 String elName = "lfUint64";
158 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(Uint64.getInstance()).deserialize("5123456789"),
159 elName), "<" + elName + ">5123456789</" + elName + ">");
163 public void snAsYangBinaryToXmlTest() {
164 String elName = "lfBinary";
166 prepareCnStructForYangData(
167 TypeDefinitionAwareCodec.from(BinaryType.getInstance())
168 .deserialize("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567"),
169 elName), "<" + elName + ">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567</"
174 public void snAsYangBitsToXmlTest() {
175 BitsTypeDefinition.Bit mockBit1 = mock( BitsTypeDefinition.Bit.class );
176 when( mockBit1.getName() ).thenReturn( "one" );
177 BitsTypeDefinition.Bit mockBit2 = mock( BitsTypeDefinition.Bit.class );
178 when( mockBit2.getName() ).thenReturn( "two" );
179 List<BitsTypeDefinition.Bit> bitList = Lists.newArrayList( mockBit1, mockBit2 );
181 String elName = "lfBits";
183 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(
184 BitsType.create( mock( SchemaPath.class ), bitList ) )
185 .deserialize("one two"), elName),
186 "<" + elName + ">one two</" + elName + ">", "<" + elName + ">two one</" + elName + ">");
190 public void snAsYangEnumerationToXmlTest() {
191 EnumTypeDefinition.EnumPair mockEnum = mock( EnumTypeDefinition.EnumPair.class );
192 when( mockEnum.getName() ).thenReturn( "enum2" );
193 List<EnumPair> enumList = Lists.newArrayList( mockEnum );
195 String elName = "lfEnumeration";
197 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(
198 EnumerationType.create( mock( SchemaPath.class ), enumList,
199 Optional.<EnumTypeDefinition.EnumPair>absent() ) )
200 .deserialize("enum2"),
201 elName), "<" + elName + ">enum2</" + elName + ">");
205 public void snAsYangEmptyToXmlTest() {
206 String elName = "lfEmpty";
208 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(EmptyType.getInstance()).deserialize(null), elName), "<"
213 public void snAsYangBooleanToXmlTest() {
214 String elName = "lfBoolean";
216 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(BooleanType.getInstance()).deserialize("str"), elName),
217 "<" + elName + ">false</" + elName + ">");
219 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(BooleanType.getInstance()).deserialize("true"), elName),
220 "<" + elName + ">true</" + elName + ">");
224 public void snAsYangUnionToXmlTest() {
226 BitsTypeDefinition.Bit mockBit1 = mock( BitsTypeDefinition.Bit.class );
227 when( mockBit1.getName() ).thenReturn( "first" );
228 BitsTypeDefinition.Bit mockBit2 = mock( BitsTypeDefinition.Bit.class );
229 when( mockBit1.getName() ).thenReturn( "second" );
230 List<BitsTypeDefinition.Bit> bitList = Lists.newArrayList( mockBit1, mockBit2 );
232 List<TypeDefinition<?>> types = Lists.<TypeDefinition<?>>newArrayList(
234 BitsType.create( mock( SchemaPath.class ) , bitList ),
235 BooleanType.getInstance() );
236 UnionType unionType = UnionType.create( types );
238 String elName = "lfUnion";
241 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(unionType).deserialize(int8), elName), "<"
242 + elName + ">15</" + elName + ">");
244 String bits = "first second";
246 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(unionType).deserialize(bits), elName), "<"
247 + elName + ">first second</" + elName + ">");
251 prepareCnStructForYangData(TypeDefinitionAwareCodec.from(unionType).deserialize(bool), elName), "<"
252 + elName + ">str</" + elName + ">");
255 private void serializeToXml(final CompositeNode compositeNode, final String... xmlRepresentation)
256 throws TransformerFactoryConfigurationError {
257 String xmlString = "";
259 xmlString = TestUtils.writeCompNodeWithSchemaContextToOutput(compositeNode, modules, dataSchemaNode,
260 StructuredDataToXmlProvider.INSTANCE);
261 } catch (WebApplicationException | IOException e) {
263 assertNotNull(xmlString);
264 boolean containSearchedStr = false;
265 String strRepresentation = "";
266 for (String searchedStr : xmlRepresentation) {
267 if (xmlString.contains(searchedStr)) {
268 containSearchedStr = true;
271 strRepresentation = strRepresentation + "[" + searchedStr + "]";
273 assertTrue("At least one of specified strings " + strRepresentation + " wasn't found.", containSearchedStr);
277 private CompositeNode prepareIdentityrefData(final String prefix, final boolean valueAsQName) {
278 MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(
279 TestUtils.buildQName("cont", "basic:module", "2013-12-2"), null, null, ModifyAction.CREATE, null);
280 MutableCompositeNode cont1 = NodeFactory.createMutableCompositeNode(
281 TestUtils.buildQName("cont1", "basic:module", "2013-12-2"), cont, null, ModifyAction.CREATE, null);
282 cont.getValue().add(cont1);
286 value = TestUtils.buildQName("iden", "referenced:module", "2013-12-2", prefix);
288 value = "no qname value";
290 MutableSimpleNode<Object> lf11 = NodeFactory.createMutableSimpleNode(
291 TestUtils.buildQName("lf11", "basic:module", "2013-12-2"), cont1, value, ModifyAction.CREATE, null);
292 cont1.getValue().add(lf11);
299 private CompositeNode prepareCnStructForYangData(final Object data, final String leafName) {
300 MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(
301 TestUtils.buildQName("cont", "basic:module", "2013-12-2"), null, null, ModifyAction.CREATE, null);
303 MutableSimpleNode<Object> lf1 = NodeFactory.createMutableSimpleNode(
304 TestUtils.buildQName(leafName, "basic:module", "2013-12-2"), cont, data, ModifyAction.CREATE, null);
305 cont.getValue().add(lf1);
311 private CompositeNode prepareLeafrefData() {
312 MutableCompositeNode cont = NodeFactory.createMutableCompositeNode(TestUtils.buildQName("cont"), null, null,
313 ModifyAction.CREATE, null);
315 MutableSimpleNode<Object> lfBoolean = NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfBoolean"),
316 cont, Boolean.TRUE, ModifyAction.CREATE, null);
317 MutableSimpleNode<Object> lfLfref = NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lfLfref"), cont,
318 "true", ModifyAction.CREATE, null);
319 cont.getValue().add(lfBoolean);
320 cont.getValue().add(lfLfref);