Bug 7433 - Remove use of YangSchemaSourceImpl from restconf tests
[netconf.git] / restconf / sal-rest-connector / src / test / java / org / opendaylight / restconf / restful / utils / PutDataTransactionUtilTest.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.restconf.restful.utils;
10
11 import static org.mockito.Mockito.doNothing;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.verify;
14
15 import com.google.common.base.Optional;
16 import com.google.common.util.concurrent.Futures;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.mockito.Mock;
20 import org.mockito.MockitoAnnotations;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
23 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
24 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
25 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
26 import org.opendaylight.controller.md.sal.rest.common.TestRestconfUtils;
27 import org.opendaylight.netconf.sal.restconf.impl.InstanceIdentifierContext;
28 import org.opendaylight.netconf.sal.restconf.impl.NormalizedNodeContext;
29 import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
30 import org.opendaylight.restconf.common.references.SchemaContextRef;
31 import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper;
32 import org.opendaylight.yangtools.yang.common.QName;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
35 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
37 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
38 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
39 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
40 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
41 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
42 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
43
44 public class PutDataTransactionUtilTest {
45
46     private static final String PATH_FOR_NEW_SCHEMA_CONTEXT = "/jukebox";
47
48     @Mock
49     private DOMTransactionChain transactionChain;
50     @Mock
51     private DOMDataReadWriteTransaction readWrite;
52     @Mock
53     private DOMDataReadOnlyTransaction read;
54     @Mock
55     private DOMDataWriteTransaction write;
56
57
58     private SchemaContextRef refSchemaCtx;
59     private LeafNode buildLeaf;
60     private ContainerNode buildBaseCont;
61     private ContainerNode buildBaseContWithList;
62     private MapEntryNode buildListEntry;
63     private SchemaContext schema;
64     private DataSchemaNode schemaNode;
65     private YangInstanceIdentifier iid;
66     private DataSchemaNode schemaNode2;
67     private YangInstanceIdentifier iid2;
68     private DataSchemaNode schemaNode3;
69     private YangInstanceIdentifier iid3;
70
71     @Before
72     public void setUp() throws Exception {
73         MockitoAnnotations.initMocks(this);
74         this.refSchemaCtx = new SchemaContextRef(
75                 YangParserTestUtils.parseYangSources(TestRestconfUtils.loadFiles(PATH_FOR_NEW_SCHEMA_CONTEXT)));
76         this.schema = this.refSchemaCtx.get();
77
78         final QName baseQName = QName.create("http://example.com/ns/example-jukebox", "2015-04-04", "jukebox");
79         final QName containerQname = QName.create(baseQName, "player");
80         final QName leafQname = QName.create(baseQName, "gap");
81         final QName listQname = QName.create(baseQName, "playlist");
82         final QName listKeyQname = QName.create(baseQName, "name");
83
84         final YangInstanceIdentifier.NodeIdentifierWithPredicates nodeWithKey =
85                 new YangInstanceIdentifier.NodeIdentifierWithPredicates(listQname, listKeyQname, "name of band");
86         final YangInstanceIdentifier.NodeIdentifierWithPredicates nodeWithKey2 =
87                 new YangInstanceIdentifier.NodeIdentifierWithPredicates(listQname, listKeyQname, "name of band 2");
88
89         this.iid = YangInstanceIdentifier.builder()
90                 .node(baseQName)
91                 .node(containerQname)
92                 .node(leafQname)
93                 .build();
94         this.schemaNode = DataSchemaContextTree.from(this.schema).getChild(this.iid).getDataSchemaNode();
95
96         this.iid2 = YangInstanceIdentifier.builder()
97                 .node(baseQName)
98                 .build();
99         this.schemaNode2 = DataSchemaContextTree.from(this.schema).getChild(this.iid2).getDataSchemaNode();
100
101         this.iid3 = YangInstanceIdentifier.builder()
102                 .node(baseQName)
103                 .node(listQname)
104                 .node(nodeWithKey)
105                 .build();
106         this.schemaNode3 = DataSchemaContextTree.from(this.schema).getChild(this.iid3).getDataSchemaNode();
107
108         this.buildLeaf = Builders.leafBuilder()
109                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(leafQname))
110                 .withValue(0.2)
111                 .build();
112         final ContainerNode buildPlayerCont = Builders.containerBuilder()
113                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(containerQname))
114                 .withChild(this.buildLeaf)
115                 .build();
116         this.buildBaseCont = Builders.containerBuilder()
117                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(baseQName))
118                 .withChild(buildPlayerCont)
119                 .build();
120         final LeafNode<Object> content = Builders.leafBuilder()
121                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(QName.create(baseQName, "name")))
122                 .withValue("name of band")
123                 .build();
124         final LeafNode<Object> content2 = Builders.leafBuilder()
125                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(QName.create(baseQName, "description")))
126                 .withValue("band description")
127                 .build();
128         this.buildListEntry = Builders.mapEntryBuilder()
129                 .withNodeIdentifier(nodeWithKey)
130                 .withChild(content)
131                 .withChild(content2)
132                 .build();
133         final LeafNode<Object> content3 = Builders.leafBuilder()
134                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(QName.create(baseQName, "name")))
135                 .withValue("name of band 2")
136                 .build();
137         final LeafNode<Object> content4 = Builders.leafBuilder()
138                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(QName.create(baseQName, "description")))
139                 .withValue("band description 2")
140                 .build();
141         final MapEntryNode buildListEntry2 = Builders.mapEntryBuilder()
142                 .withNodeIdentifier(nodeWithKey2)
143                 .withChild(content3)
144                 .withChild(content4)
145                 .build();
146         final MapNode buildList = Builders.mapBuilder()
147                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(listQname))
148                 .withChild(this.buildListEntry)
149                 .withChild(buildListEntry2)
150                 .build();
151         this.buildBaseContWithList = Builders.containerBuilder()
152                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(baseQName))
153                 .withChild(buildList)
154                 .build();
155
156     }
157
158     @Test
159     public void testValidInputData() throws Exception {
160         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid, this.schemaNode, null, this.schema);
161         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildLeaf);
162         PutDataTransactionUtil.validInputData(iidContext.getSchemaNode(), payload);
163     }
164
165     @Test
166     public void testValidTopLevelNodeName() throws Exception {
167         InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid, this.schemaNode, null, this.schema);
168         NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildLeaf);
169         PutDataTransactionUtil.validTopLevelNodeName(iidContext.getInstanceIdentifier(), payload);
170
171         iidContext = new InstanceIdentifierContext<>(this.iid2, this.schemaNode2, null, this.schema);
172         payload = new NormalizedNodeContext(iidContext, this.buildBaseCont);
173         PutDataTransactionUtil.validTopLevelNodeName(iidContext.getInstanceIdentifier(), payload);
174     }
175
176     @Test(expected = RestconfDocumentedException.class)
177     public void testValidTopLevelNodeNamePathEmpty() throws Exception {
178         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid, this.schemaNode, null, this.schema);
179         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildLeaf);
180         PutDataTransactionUtil.validTopLevelNodeName(YangInstanceIdentifier.EMPTY, payload);
181     }
182
183     @Test(expected = RestconfDocumentedException.class)
184     public void testValidTopLevelNodeNameWrongTopIdentifier() throws Exception {
185         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid, this.schemaNode, null, this.schema);
186         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildLeaf);
187         PutDataTransactionUtil.validTopLevelNodeName(this.iid.getAncestor(1), payload);
188     }
189
190     @Test
191     public void testValidateListKeysEqualityInPayloadAndUri() throws Exception {
192         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid3, this.schemaNode3, null, this.schema);
193         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildListEntry);
194         PutDataTransactionUtil.validateListKeysEqualityInPayloadAndUri(payload);
195     }
196
197     @Test
198     public void testPutContainerData() throws Exception {
199         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid2, this.schemaNode2, null, this.schema);
200         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildBaseCont);
201
202         doReturn(this.readWrite).when(this.transactionChain).newReadWriteTransaction();
203         doReturn(this.read).when(this.transactionChain).newReadOnlyTransaction();
204         doReturn(this.write).when(this.transactionChain).newWriteOnlyTransaction();
205         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(this.read).read(LogicalDatastoreType.CONFIGURATION, this.iid2);
206         doNothing().when(this.write).put(LogicalDatastoreType.CONFIGURATION, payload.getInstanceIdentifierContext().getInstanceIdentifier(),
207                 payload.getData());
208         doReturn(Futures.immediateCheckedFuture(null)).when(this.readWrite).submit();
209
210         PutDataTransactionUtil.putData(payload, this.refSchemaCtx,
211                 new TransactionVarsWrapper(payload.getInstanceIdentifierContext(), null, this.transactionChain), null,
212                 null);
213         verify(this.read).read(LogicalDatastoreType.CONFIGURATION, payload.getInstanceIdentifierContext().getInstanceIdentifier());
214         verify(this.readWrite).put(LogicalDatastoreType.CONFIGURATION,
215                 payload.getInstanceIdentifierContext().getInstanceIdentifier(), payload.getData());
216     }
217
218     @Test
219     public void testPutleafData() throws Exception {
220         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid, this.schemaNode, null, this.schema);
221         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildLeaf);
222
223         doReturn(this.readWrite).when(this.transactionChain).newReadWriteTransaction();
224         doReturn(this.read).when(this.transactionChain).newReadOnlyTransaction();
225         doReturn(this.write).when(this.transactionChain).newWriteOnlyTransaction();
226         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(this.read).read(LogicalDatastoreType.CONFIGURATION, this.iid);
227         doNothing().when(this.write).put(LogicalDatastoreType.CONFIGURATION, payload.getInstanceIdentifierContext().getInstanceIdentifier(),
228                 payload.getData());
229         doReturn(Futures.immediateCheckedFuture(null)).when(this.readWrite).submit();
230
231         PutDataTransactionUtil.putData(payload, this.refSchemaCtx,
232                 new TransactionVarsWrapper(payload.getInstanceIdentifierContext(), null, this.transactionChain), null,
233                 null);
234         verify(this.read).read(LogicalDatastoreType.CONFIGURATION, payload.getInstanceIdentifierContext().getInstanceIdentifier());
235         verify(this.readWrite).put(LogicalDatastoreType.CONFIGURATION,
236                 payload.getInstanceIdentifierContext().getInstanceIdentifier(), payload.getData());
237     }
238
239     @Test
240     public void testPutListData() throws Exception {
241         final InstanceIdentifierContext<DataSchemaNode> iidContext = new InstanceIdentifierContext<>(this.iid2, this.schemaNode2, null, this.schema);
242         final NormalizedNodeContext payload = new NormalizedNodeContext(iidContext, this.buildBaseContWithList);
243
244         doReturn(this.readWrite).when(this.transactionChain).newReadWriteTransaction();
245         doReturn(this.read).when(this.transactionChain).newReadOnlyTransaction();
246         doReturn(this.write).when(this.transactionChain).newWriteOnlyTransaction();
247         doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(this.read).read(LogicalDatastoreType.CONFIGURATION, this.iid2);
248         doNothing().when(this.write).put(LogicalDatastoreType.CONFIGURATION, payload.getInstanceIdentifierContext().getInstanceIdentifier(),
249                 payload.getData());
250         doReturn(Futures.immediateCheckedFuture(null)).when(this.readWrite).submit();
251         PutDataTransactionUtil.putData(payload, this.refSchemaCtx,
252                 new TransactionVarsWrapper(payload.getInstanceIdentifierContext(), null, this.transactionChain), null,
253                 null);
254         verify(this.read).read(LogicalDatastoreType.CONFIGURATION, this.iid2);
255         verify(this.readWrite).put(LogicalDatastoreType.CONFIGURATION, this.iid2, payload.getData());
256     }
257
258 }
259