2 * Copyright (c) 2023 PANTHEON.tech, s.r.o. 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.transactions;
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.verify;
14 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFailedFluentFuture;
15 import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFluentFuture;
17 import com.google.common.util.concurrent.Futures;
18 import java.util.Optional;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.Mock;
23 import org.mockito.junit.MockitoJUnitRunner;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
26 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
27 import org.opendaylight.netconf.api.NetconfDocumentedException;
28 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
29 import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
30 import org.opendaylight.restconf.nb.rfc8040.rests.utils.PutDataTransactionUtil;
31 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
32 import org.opendaylight.yangtools.yang.common.ErrorTag;
33 import org.opendaylight.yangtools.yang.common.ErrorType;
34 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
35 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
36 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
37 import org.w3c.dom.DOMException;
39 @RunWith(MockitoJUnitRunner.StrictStubs.class)
40 public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyTest {
42 private NetconfDataTreeService netconfService;
45 public void before() {
46 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
47 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).discardChanges();
48 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).unlock();
49 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).lock();
50 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
51 .delete(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.of());
55 RestconfStrategy testDeleteDataStrategy() {
56 return new NetconfRestconfStrategy(netconfService);
60 RestconfStrategy testNegativeDeleteDataStrategy() {
61 doReturn(Futures.immediateFailedFuture(new TransactionCommitFailedException(
62 "Commit of transaction " + this + " failed", new NetconfDocumentedException("id",
63 ErrorType.RPC, ErrorTag.DATA_MISSING, ErrorSeverity.ERROR)))).when(netconfService).commit();
64 return new NetconfRestconfStrategy(netconfService);
68 RestconfStrategy testPostContainerDataStrategy() {
69 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
70 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
71 .create(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
72 return new NetconfRestconfStrategy(netconfService);
76 RestconfStrategy testPostListDataStrategy(final MapEntryNode entryNode, final YangInstanceIdentifier node) {
77 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
78 .merge(any(), any(), any(), any());
79 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
80 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).create(
81 LogicalDatastoreType.CONFIGURATION, node, entryNode, Optional.empty());
82 return new NetconfRestconfStrategy(netconfService);
86 RestconfStrategy testPostDataFailStrategy(final DOMException domException) {
87 doReturn(immediateFailedFluentFuture(domException)).when(netconfService)
88 .create(any(), any(), any(), any());
89 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).discardChanges();
90 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).unlock();
91 return new NetconfRestconfStrategy(netconfService);
95 RestconfStrategy testPatchContainerDataStrategy() {
96 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).merge(any(), any(),any(),
98 return new NetconfRestconfStrategy(netconfService);
102 RestconfStrategy testPatchLeafDataStrategy() {
103 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
104 .merge(any(), any(), any(), any());
105 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
106 return new NetconfRestconfStrategy(netconfService);
110 RestconfStrategy testPatchListDataStrategy() {
111 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
112 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
113 .merge(any(), any(),any(),any());
114 return new NetconfRestconfStrategy(netconfService);
118 public void testPutCreateContainerData() {
119 doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(JUKEBOX_IID);
120 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
121 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
122 .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
124 PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
125 new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
126 verify(netconfService).lock();
127 verify(netconfService).getConfig(JUKEBOX_IID);
128 verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
133 public void testPutReplaceContainerData() {
134 doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
135 .getConfig(JUKEBOX_IID);
136 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
137 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
138 .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
140 PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
141 new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
142 verify(netconfService).getConfig(JUKEBOX_IID);
143 verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
148 public void testPutCreateLeafData() {
149 doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(GAP_IID);
150 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
151 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
152 .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
154 PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new NetconfRestconfStrategy(netconfService),
155 WriteDataParams.empty());
156 verify(netconfService).getConfig(GAP_IID);
157 verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
161 public void testPutReplaceLeafData() {
162 doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
164 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
165 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
166 .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
168 PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new NetconfRestconfStrategy(netconfService),
169 WriteDataParams.empty());
170 verify(netconfService).getConfig(GAP_IID);
171 verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
175 public void testPutCreateListData() {
176 doReturn(immediateFluentFuture(Optional.empty())).when(netconfService).getConfig(JUKEBOX_IID);
177 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
178 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
179 .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
181 PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
182 new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
183 verify(netconfService).getConfig(JUKEBOX_IID);
184 verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
189 public void testPutReplaceListData() {
190 doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(netconfService)
191 .getConfig(JUKEBOX_IID);
192 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService).commit();
193 doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
194 .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
196 PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
197 new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
198 verify(netconfService).getConfig(JUKEBOX_IID);
199 verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,