2 * Copyright (c) 2016 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.restconf.nb.rfc8040.rests.utils;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertThrows;
15 import static org.junit.Assert.assertTrue;
16 import static org.junit.Assert.fail;
17 import static org.mockito.Mockito.doReturn;
18 import static org.mockito.Mockito.when;
19 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFluentFuture;
21 import com.google.common.collect.ImmutableList;
22 import java.util.Collections;
23 import java.util.List;
24 import java.util.Optional;
26 import javax.ws.rs.core.MultivaluedHashMap;
27 import javax.ws.rs.core.UriInfo;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.mockito.Mock;
31 import org.mockito.Mockito;
32 import org.mockito.MockitoAnnotations;
33 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
34 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
35 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
36 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
37 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
38 import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
39 import org.opendaylight.restconf.common.context.WriterParameters;
40 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
41 import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
42 import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
43 import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
44 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStrategy;
45 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.NetconfRestconfStrategy;
46 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
47 import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfDataServiceConstant.ReadData;
48 import org.opendaylight.yangtools.yang.common.QName;
49 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
50 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
51 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
52 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
53 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
54 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
55 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
56 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
57 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
58 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
59 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
61 public class ReadDataTransactionUtilTest {
63 private static final TestData DATA = new TestData();
64 private static final YangInstanceIdentifier.NodeIdentifier NODE_IDENTIFIER = new YangInstanceIdentifier
65 .NodeIdentifier(QName.create("ns", "2016-02-28", "container"));
67 private RestconfStrategy mdsalStrategy;
68 private RestconfStrategy netconfStrategy;
70 private NetconfDataTreeService netconfService;
72 private DOMTransactionChain transactionChain;
74 private InstanceIdentifierContext<ContainerSchemaNode> context;
76 private DOMDataTreeReadTransaction read;
78 private EffectiveModelContext schemaContext;
80 private ContainerSchemaNode containerSchemaNode;
82 private LeafSchemaNode containerChildNode;
83 private QName containerChildQName;
87 MockitoAnnotations.initMocks(this);
89 containerChildQName = QName.create("ns", "2016-02-28", "container-child");
91 when(transactionChain.newReadOnlyTransaction()).thenReturn(read);
92 when(context.getSchemaContext()).thenReturn(schemaContext);
93 when(context.getSchemaNode()).thenReturn(containerSchemaNode);
94 when(containerSchemaNode.getQName()).thenReturn(NODE_IDENTIFIER.getNodeType());
95 when(containerChildNode.getQName()).thenReturn(containerChildQName);
96 when(containerSchemaNode.getDataChildByName(containerChildQName)).thenReturn(containerChildNode);
98 DOMDataBroker mockDataBroker = Mockito.mock(DOMDataBroker.class);
99 Mockito.doReturn(transactionChain).when(mockDataBroker).createTransactionChain(Mockito.any());
100 mdsalStrategy = new MdsalRestconfStrategy(new TransactionChainHandler(mockDataBroker));
101 netconfStrategy = new NetconfRestconfStrategy(this.netconfService);
105 public void readDataConfigTest() {
106 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
107 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
108 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(this.netconfService).getConfig(DATA.path);
109 doReturn(DATA.path).when(context).getInstanceIdentifier();
110 final String valueOfContent = RestconfDataServiceConstant.ReadData.CONFIG;
111 NormalizedNode<?, ?> normalizedNode =
112 ReadDataTransactionUtil.readData(valueOfContent, DATA.path, mdsalStrategy, schemaContext);
113 assertEquals(DATA.data3, normalizedNode);
115 normalizedNode = ReadDataTransactionUtil.readData(valueOfContent, DATA.path, netconfStrategy, schemaContext);
116 assertEquals(DATA.data3, normalizedNode);
120 public void readAllHavingOnlyConfigTest() {
121 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
122 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
123 doReturn(immediateFluentFuture(Optional.empty())).when(read)
124 .read(LogicalDatastoreType.OPERATIONAL, DATA.path);
125 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(this.netconfService).getConfig(DATA.path);
126 doReturn(immediateFluentFuture(Optional.empty())).when(this.netconfService).get(DATA.path);
127 doReturn(DATA.path).when(context).getInstanceIdentifier();
128 final String valueOfContent = RestconfDataServiceConstant.ReadData.ALL;
129 NormalizedNode<?, ?> normalizedNode =
130 ReadDataTransactionUtil.readData(valueOfContent, DATA.path, mdsalStrategy, schemaContext);
131 assertEquals(DATA.data3, normalizedNode);
134 ReadDataTransactionUtil.readData(valueOfContent, DATA.path, netconfStrategy, schemaContext);
135 assertEquals(DATA.data3, normalizedNode);
139 public void readAllHavingOnlyNonConfigTest() {
140 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(read)
141 .read(LogicalDatastoreType.OPERATIONAL, DATA.path2);
142 doReturn(immediateFluentFuture(Optional.empty())).when(read)
143 .read(LogicalDatastoreType.CONFIGURATION, DATA.path2);
144 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(this.netconfService).get(DATA.path2);
145 doReturn(immediateFluentFuture(Optional.empty())).when(this.netconfService).getConfig(DATA.path2);
146 doReturn(DATA.path2).when(context).getInstanceIdentifier();
147 final String valueOfContent = RestconfDataServiceConstant.ReadData.ALL;
148 NormalizedNode<?, ?> normalizedNode =
149 ReadDataTransactionUtil.readData(valueOfContent, DATA.path2, mdsalStrategy, schemaContext);
150 assertEquals(DATA.data2, normalizedNode);
153 ReadDataTransactionUtil.readData(valueOfContent, DATA.path2, netconfStrategy, schemaContext);
154 assertEquals(DATA.data2, normalizedNode);
158 public void readDataNonConfigTest() {
159 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(read)
160 .read(LogicalDatastoreType.OPERATIONAL, DATA.path2);
161 doReturn(immediateFluentFuture(Optional.of(DATA.data2))).when(this.netconfService).get(DATA.path2);
162 doReturn(DATA.path2).when(context).getInstanceIdentifier();
163 final String valueOfContent = RestconfDataServiceConstant.ReadData.NONCONFIG;
164 NormalizedNode<?, ?> normalizedNode =
165 ReadDataTransactionUtil.readData(valueOfContent, DATA.path2, mdsalStrategy, schemaContext);
166 assertEquals(DATA.data2, normalizedNode);
169 ReadDataTransactionUtil.readData(valueOfContent, DATA.path2, netconfStrategy, schemaContext);
170 assertEquals(DATA.data2, normalizedNode);
174 public void readContainerDataAllTest() {
175 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
176 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
177 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(read)
178 .read(LogicalDatastoreType.OPERATIONAL, DATA.path);
179 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(this.netconfService).getConfig(DATA.path);
180 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(this.netconfService).get(DATA.path);
181 doReturn(DATA.path).when(context).getInstanceIdentifier();
182 final String valueOfContent = RestconfDataServiceConstant.ReadData.ALL;
183 final ContainerNode checkingData = Builders
185 .withNodeIdentifier(NODE_IDENTIFIER)
186 .withChild(DATA.contentLeaf)
187 .withChild(DATA.contentLeaf2)
189 NormalizedNode<?, ?> normalizedNode =
190 ReadDataTransactionUtil.readData(valueOfContent, DATA.path, mdsalStrategy, schemaContext);
191 assertEquals(checkingData, normalizedNode);
194 ReadDataTransactionUtil.readData(valueOfContent, DATA.path, netconfStrategy, schemaContext);
195 assertEquals(checkingData, normalizedNode);
199 public void readContainerDataConfigNoValueOfContentTest() {
200 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(read)
201 .read(LogicalDatastoreType.CONFIGURATION, DATA.path);
202 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(read)
203 .read(LogicalDatastoreType.OPERATIONAL, DATA.path);
204 doReturn(immediateFluentFuture(Optional.of(DATA.data3))).when(this.netconfService).getConfig(DATA.path);
205 doReturn(immediateFluentFuture(Optional.of(DATA.data4))).when(this.netconfService).get(DATA.path);
206 doReturn(DATA.path).when(context).getInstanceIdentifier();
207 final ContainerNode checkingData = Builders
209 .withNodeIdentifier(NODE_IDENTIFIER)
210 .withChild(DATA.contentLeaf)
211 .withChild(DATA.contentLeaf2)
213 NormalizedNode<?, ?> normalizedNode = ReadDataTransactionUtil.readData(
214 RestconfDataServiceConstant.ReadData.ALL, DATA.path, mdsalStrategy, schemaContext);
215 assertEquals(checkingData, normalizedNode);
217 normalizedNode = ReadDataTransactionUtil.readData(
218 RestconfDataServiceConstant.ReadData.ALL, DATA.path, netconfStrategy, schemaContext);
219 assertEquals(checkingData, normalizedNode);
223 public void readListDataAllTest() {
224 doReturn(immediateFluentFuture(Optional.of(DATA.listData))).when(read)
225 .read(LogicalDatastoreType.OPERATIONAL, DATA.path3);
226 doReturn(immediateFluentFuture(Optional.of(DATA.listData2))).when(read)
227 .read(LogicalDatastoreType.CONFIGURATION, DATA.path3);
228 doReturn(immediateFluentFuture(Optional.of(DATA.listData))).when(this.netconfService).get(DATA.path3);
229 doReturn(immediateFluentFuture(Optional.of(DATA.listData2))).when(this.netconfService).getConfig(DATA.path3);
230 doReturn(DATA.path3).when(context).getInstanceIdentifier();
231 final String valueOfContent = RestconfDataServiceConstant.ReadData.ALL;
232 final MapNode checkingData = Builders
234 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(QName.create("ns", "2016-02-28", "list")))
235 .withChild(DATA.checkData)
237 NormalizedNode<?, ?> normalizedNode =
238 ReadDataTransactionUtil.readData(valueOfContent, DATA.path3, mdsalStrategy, schemaContext);
239 assertEquals(checkingData, normalizedNode);
242 ReadDataTransactionUtil.readData(valueOfContent, DATA.path3, netconfStrategy, schemaContext);
243 assertEquals(checkingData, normalizedNode);
247 public void readOrderedListDataAllTest() {
248 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode1))).when(read)
249 .read(LogicalDatastoreType.OPERATIONAL, DATA.path3);
250 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode2))).when(read)
251 .read(LogicalDatastoreType.CONFIGURATION, DATA.path3);
252 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode1))).when(this.netconfService).get(DATA.path3);
253 doReturn(immediateFluentFuture(Optional.of(DATA.orderedMapNode2))).when(this.netconfService)
254 .getConfig(DATA.path3);
255 doReturn(DATA.path3).when(context).getInstanceIdentifier();
256 final MapNode expectedData = Builders.orderedMapBuilder()
257 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(DATA.listQname)).withChild(DATA.checkData)
259 NormalizedNode<?, ?> normalizedNode = ReadDataTransactionUtil
260 .readData(RestconfDataServiceConstant.ReadData.ALL, DATA.path3, mdsalStrategy, schemaContext);
261 assertEquals(expectedData, normalizedNode);
263 normalizedNode = ReadDataTransactionUtil
264 .readData(RestconfDataServiceConstant.ReadData.ALL, DATA.path3, netconfStrategy, schemaContext);
265 assertEquals(expectedData, normalizedNode);
269 public void readUnkeyedListDataAllTest() {
270 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode1))).when(read)
271 .read(LogicalDatastoreType.OPERATIONAL, DATA.path3);
272 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode2))).when(read)
273 .read(LogicalDatastoreType.CONFIGURATION, DATA.path3);
274 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode1))).when(this.netconfService).get(DATA.path3);
275 doReturn(immediateFluentFuture(Optional.of(DATA.unkeyedListNode2))).when(this.netconfService)
276 .getConfig(DATA.path3);
277 doReturn(DATA.path3).when(context).getInstanceIdentifier();
278 final UnkeyedListNode expectedData = Builders.unkeyedListBuilder()
279 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(DATA.listQname))
280 .withChild(Builders.unkeyedListEntryBuilder().withNodeIdentifier(
281 new YangInstanceIdentifier.NodeIdentifier(DATA.listQname))
282 .withChild(DATA.unkeyedListEntryNode1.getValue().iterator().next())
283 .withChild(DATA.unkeyedListEntryNode2.getValue().iterator().next()).build()).build();
284 NormalizedNode<?, ?> normalizedNode = ReadDataTransactionUtil
285 .readData(RestconfDataServiceConstant.ReadData.ALL, DATA.path3, mdsalStrategy, schemaContext);
286 assertEquals(expectedData, normalizedNode);
288 normalizedNode = ReadDataTransactionUtil
289 .readData(RestconfDataServiceConstant.ReadData.ALL, DATA.path3, netconfStrategy, schemaContext);
290 assertEquals(expectedData, normalizedNode);
294 public void readLeafListDataAllTest() {
295 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode1))).when(read)
296 .read(LogicalDatastoreType.OPERATIONAL, DATA.leafSetNodePath);
297 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode2))).when(read)
298 .read(LogicalDatastoreType.CONFIGURATION, DATA.leafSetNodePath);
299 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode1))).when(this.netconfService)
300 .get(DATA.leafSetNodePath);
301 doReturn(immediateFluentFuture(Optional.of(DATA.leafSetNode2))).when(this.netconfService)
302 .getConfig(DATA.leafSetNodePath);
303 doReturn(DATA.leafSetNodePath).when(context).getInstanceIdentifier();
304 final LeafSetNode<String> expectedData = Builders.<String>leafSetBuilder().withNodeIdentifier(
305 new YangInstanceIdentifier.NodeIdentifier(DATA.leafListQname)).withValue(
306 ImmutableList.<LeafSetEntryNode<String>>builder().addAll(DATA.leafSetNode1.getValue())
307 .addAll(DATA.leafSetNode2.getValue()).build()).build();
308 NormalizedNode<?, ?> normalizedNode = ReadDataTransactionUtil.readData(RestconfDataServiceConstant.ReadData.ALL,
309 DATA.leafSetNodePath, mdsalStrategy, schemaContext);
310 assertEquals(expectedData, normalizedNode);
312 normalizedNode = ReadDataTransactionUtil.readData(RestconfDataServiceConstant.ReadData.ALL,
313 DATA.leafSetNodePath, netconfStrategy, schemaContext);
314 assertEquals(expectedData, normalizedNode);
318 public void readOrderedLeafListDataAllTest() {
319 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode1))).when(read)
320 .read(LogicalDatastoreType.OPERATIONAL, DATA.leafSetNodePath);
321 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode2))).when(read)
322 .read(LogicalDatastoreType.CONFIGURATION, DATA.leafSetNodePath);
323 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode1))).when(this.netconfService)
324 .get(DATA.leafSetNodePath);
325 doReturn(immediateFluentFuture(Optional.of(DATA.orderedLeafSetNode2))).when(this.netconfService)
326 .getConfig(DATA.leafSetNodePath);
327 doReturn(DATA.leafSetNodePath).when(context).getInstanceIdentifier();
328 final LeafSetNode<String> expectedData = Builders.<String>orderedLeafSetBuilder().withNodeIdentifier(
329 new YangInstanceIdentifier.NodeIdentifier(DATA.leafListQname)).withValue(
330 ImmutableList.<LeafSetEntryNode<String>>builder().addAll(DATA.orderedLeafSetNode1.getValue())
331 .addAll(DATA.orderedLeafSetNode2.getValue()).build()).build();
332 NormalizedNode<?, ?> normalizedNode = ReadDataTransactionUtil.readData(RestconfDataServiceConstant.ReadData.ALL,
333 DATA.leafSetNodePath, mdsalStrategy, schemaContext);
334 assertEquals(expectedData, normalizedNode);
336 normalizedNode = ReadDataTransactionUtil.readData(RestconfDataServiceConstant.ReadData.ALL,
337 DATA.leafSetNodePath, netconfStrategy, schemaContext);
338 assertEquals(expectedData, normalizedNode);
342 public void readDataWrongPathOrNoContentTest() {
343 doReturn(immediateFluentFuture(Optional.empty())).when(read)
344 .read(LogicalDatastoreType.CONFIGURATION, DATA.path2);
345 doReturn(immediateFluentFuture(Optional.empty())).when(this.netconfService).getConfig(DATA.path2);
346 doReturn(DATA.path2).when(context).getInstanceIdentifier();
347 final String valueOfContent = RestconfDataServiceConstant.ReadData.CONFIG;
348 NormalizedNode<?, ?> normalizedNode =
349 ReadDataTransactionUtil.readData(valueOfContent, DATA.path2, mdsalStrategy, schemaContext);
350 assertNull(normalizedNode);
353 ReadDataTransactionUtil.readData(valueOfContent, DATA.path2, netconfStrategy, schemaContext);
354 assertNull(normalizedNode);
357 @Test(expected = RestconfDocumentedException.class)
358 public void readDataFailTest() {
359 final String valueOfContent = RestconfDataServiceConstant.ReadData.READ_TYPE_TX;
360 NormalizedNode<?, ?> normalizedNode = ReadDataTransactionUtil.readData(
361 valueOfContent, null, mdsalStrategy, schemaContext);
362 assertNull(normalizedNode);
364 normalizedNode = ReadDataTransactionUtil.readData(
365 valueOfContent, null, netconfStrategy, schemaContext);
366 assertNull(normalizedNode);
370 * Test of parsing default parameters from URI request.
373 public void parseUriParametersDefaultTest() {
374 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
375 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
377 // no parameters, default values should be used
378 when(uriInfo.getQueryParameters()).thenReturn(parameters);
380 final WriterParameters parsedParameters = ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
382 assertEquals("Not correctly parsed URI parameter",
383 RestconfDataServiceConstant.ReadData.ALL, parsedParameters.getContent());
384 assertNull("Not correctly parsed URI parameter",
385 parsedParameters.getDepth());
386 assertNull("Not correctly parsed URI parameter",
387 parsedParameters.getFields());
391 * Test of parsing user defined parameters from URI request.
394 public void parseUriParametersUserDefinedTest() {
395 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
396 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
398 final String content = "config";
399 final String depth = "10";
400 final String fields = containerChildQName.getLocalName();
402 parameters.put("content", Collections.singletonList(content));
403 parameters.put("depth", Collections.singletonList(depth));
404 parameters.put("fields", Collections.singletonList(fields));
406 when(uriInfo.getQueryParameters()).thenReturn(parameters);
408 final WriterParameters parsedParameters = ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
411 assertEquals("Not correctly parsed URI parameter",
412 content, parsedParameters.getContent());
415 assertNotNull("Not correctly parsed URI parameter",
416 parsedParameters.getDepth());
417 assertEquals("Not correctly parsed URI parameter",
418 depth, parsedParameters.getDepth().toString());
421 assertNotNull("Not correctly parsed URI parameter",
422 parsedParameters.getFields());
423 assertEquals("Not correctly parsed URI parameter",
424 1, parsedParameters.getFields().size());
425 assertEquals("Not correctly parsed URI parameter",
426 1, parsedParameters.getFields().get(0).size());
427 assertEquals("Not correctly parsed URI parameter",
428 containerChildQName, parsedParameters.getFields().get(0).iterator().next());
432 * Negative test of parsing request URI parameters when content parameter has not allowed value.
435 public void parseUriParametersContentParameterNegativeTest() {
436 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
437 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
439 parameters.put("content", Collections.singletonList("not-allowed-parameter-value"));
440 when(uriInfo.getQueryParameters()).thenReturn(parameters);
443 ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
444 fail("Test expected to fail due to not allowed parameter value");
445 } catch (final RestconfDocumentedException e) {
447 assertEquals("Error type is not correct", ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
448 assertEquals("Error tag is not correct", ErrorTag.INVALID_VALUE, e.getErrors().get(0).getErrorTag());
449 assertEquals("Error status code is not correct", 400, e.getErrors().get(0).getErrorTag().getStatusCode());
454 * Negative test of parsing request URI parameters when depth parameter has not allowed value.
457 public void parseUriParametersDepthParameterNegativeTest() {
458 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
459 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
461 // inserted value is not allowed
462 parameters.put("depth", Collections.singletonList("bounded"));
463 when(uriInfo.getQueryParameters()).thenReturn(parameters);
466 ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
467 fail("Test expected to fail due to not allowed parameter value");
468 } catch (final RestconfDocumentedException e) {
470 assertEquals("Error type is not correct", ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
471 assertEquals("Error tag is not correct", ErrorTag.INVALID_VALUE, e.getErrors().get(0).getErrorTag());
472 assertEquals("Error status code is not correct", 400, e.getErrors().get(0).getErrorTag().getStatusCode());
477 * Negative test of parsing request URI parameters when depth parameter has not allowed value (less than minimum).
480 public void parseUriParametersDepthMinimalParameterNegativeTest() {
481 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
482 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
484 // inserted value is too low
486 "depth", Collections.singletonList(String.valueOf(RestconfDataServiceConstant.ReadData.MIN_DEPTH - 1)));
487 when(uriInfo.getQueryParameters()).thenReturn(parameters);
490 ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
491 fail("Test expected to fail due to not allowed parameter value");
492 } catch (final RestconfDocumentedException e) {
494 assertEquals("Error type is not correct", ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
495 assertEquals("Error tag is not correct", ErrorTag.INVALID_VALUE, e.getErrors().get(0).getErrorTag());
496 assertEquals("Error status code is not correct", 400, e.getErrors().get(0).getErrorTag().getStatusCode());
501 * Negative test of parsing request URI parameters when depth parameter has not allowed value (more than maximum).
504 public void parseUriParametersDepthMaximalParameterNegativeTest() {
505 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
506 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
508 // inserted value is too high
510 "depth", Collections.singletonList(String.valueOf(RestconfDataServiceConstant.ReadData.MAX_DEPTH + 1)));
511 when(uriInfo.getQueryParameters()).thenReturn(parameters);
514 ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
515 fail("Test expected to fail due to not allowed parameter value");
516 } catch (final RestconfDocumentedException e) {
518 assertEquals("Error type is not correct", ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
519 assertEquals("Error tag is not correct", ErrorTag.INVALID_VALUE, e.getErrors().get(0).getErrorTag());
520 assertEquals("Error status code is not correct", 400, e.getErrors().get(0).getErrorTag().getStatusCode());
525 * Testing parsing of with-defaults parameter which value doesn't match report-all or report-all-tagged patterns
526 * - non-reporting setting.
529 public void parseUriParametersWithDefaultAndNonTaggedTest() {
530 // preparation of input data
531 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
532 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
533 final String preparedDefaultValue = "sample-default";
534 parameters.put(RestconfDataServiceConstant.ReadData.WITH_DEFAULTS,
535 Collections.singletonList(preparedDefaultValue));
536 when(uriInfo.getQueryParameters()).thenReturn(parameters);
538 final WriterParameters writerParameters = ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
539 assertEquals(preparedDefaultValue, writerParameters.getWithDefault());
540 assertFalse(writerParameters.isTagged());
544 * Testing parsing of with-defaults parameter which value matches 'report-all-tagged' setting - default value should
545 * be set to {@code null} and tagged flag should be set to {@code true}.
548 public void parseUriParametersWithDefaultAndTaggedTest() {
549 // preparation of input data
550 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
551 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
552 parameters.put(RestconfDataServiceConstant.ReadData.WITH_DEFAULTS,
553 Collections.singletonList(ReadData.REPORT_ALL_TAGGED_DEFAULT_VALUE));
554 when(uriInfo.getQueryParameters()).thenReturn(parameters);
556 final WriterParameters writerParameters = ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
557 assertNull(writerParameters.getWithDefault());
558 assertTrue(writerParameters.isTagged());
562 * Testing parsing of with-defaults parameter which value matches 'report-all' setting - default value should
563 * be set to {@code null} and tagged flag should be set to {@code false}.
566 public void parseUriParametersWithDefaultAndReportAllTest() {
567 // preparation of input data
568 final UriInfo uriInfo = Mockito.mock(UriInfo.class);
569 final MultivaluedHashMap<String, String> parameters = new MultivaluedHashMap<>();
570 parameters.put(RestconfDataServiceConstant.ReadData.WITH_DEFAULTS,
571 Collections.singletonList(ReadData.REPORT_ALL_DEFAULT_VALUE));
572 when(uriInfo.getQueryParameters()).thenReturn(parameters);
574 final WriterParameters writerParameters = ReadDataTransactionUtil.parseUriParameters(context, uriInfo);
575 assertNull(writerParameters.getWithDefault());
576 assertFalse(writerParameters.isTagged());
580 * Test when parameter is present at most once.
583 public void checkParameterCountTest() {
584 ReadDataTransactionUtil.checkParameterCount(List.of("all"), RestconfDataServiceConstant.ReadData.CONTENT);
588 * Test when parameter is present more than once.
591 public void checkParameterCountNegativeTest() {
592 final RestconfDocumentedException ex = assertThrows(RestconfDocumentedException.class,
593 () -> ReadDataTransactionUtil.checkParameterCount(List.of("config", "nonconfig", "all"),
594 RestconfDataServiceConstant.ReadData.CONTENT));
595 assertEquals("Error type is not correct", ErrorType.PROTOCOL, ex.getErrors().get(0).getErrorType());
596 assertEquals("Error tag is not correct", ErrorTag.INVALID_VALUE, ex.getErrors().get(0).getErrorTag());
597 assertEquals("Error status code is not correct", 400, ex.getErrors().get(0).getErrorTag().getStatusCode());
602 * Test when all parameters are allowed.
605 public void checkParametersTypesTest() {
606 ReadDataTransactionUtil.checkParametersTypes(RestconfDataServiceConstant.ReadData.READ_TYPE_TX,
608 RestconfDataServiceConstant.ReadData.CONTENT, RestconfDataServiceConstant.ReadData.DEPTH);
612 * Test when not allowed parameter type is used.
615 public void checkParametersTypesNegativeTest() {
616 final RestconfDocumentedException ex = assertThrows(RestconfDocumentedException.class,
617 () -> ReadDataTransactionUtil.checkParametersTypes(RestconfDataServiceConstant.ReadData.READ_TYPE_TX,
618 Set.of("not-allowed-parameter"),
619 RestconfDataServiceConstant.ReadData.CONTENT, RestconfDataServiceConstant.ReadData.DEPTH));
620 assertEquals("Error type is not correct", ErrorType.PROTOCOL, ex.getErrors().get(0).getErrorType());
621 assertEquals("Error tag is not correct", ErrorTag.INVALID_VALUE, ex.getErrors().get(0).getErrorTag());
622 assertEquals("Error status code is not correct", 400, ex.getErrors().get(0).getErrorTag().getStatusCode());