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