* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.controller.sal.restconf.impl.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateBooleanFluentFuture;
+import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFailedFluentFuture;
+import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFluentFuture;
+import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateTrueFluentFuture;
-import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.Futures;
-import java.util.HashMap;
-import java.util.concurrent.Future;
+import com.google.common.util.concurrent.FluentFuture;
+import java.util.ArrayList;
+import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
-import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
-import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
-import org.opendaylight.controller.md.sal.dom.api.DOMRpcException;
-import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
-import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
-import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.controller.md.sal.rest.common.TestRestconfUtils;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.ReadFailedException;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
+import org.opendaylight.mdsal.dom.api.DOMMountPoint;
+import org.opendaylight.mdsal.dom.api.DOMNotificationService;
+import org.opendaylight.mdsal.dom.api.DOMRpcResult;
+import org.opendaylight.mdsal.dom.api.DOMRpcService;
+import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade;
import org.opendaylight.netconf.sal.restconf.impl.ControllerContext;
import org.opendaylight.netconf.sal.restconf.impl.PutResult;
@Mock
private DOMMountPoint mockMountInstance;
@Mock
- private DOMDataReadOnlyTransaction readTransaction;
+ private DOMDataTreeReadTransaction readTransaction;
@Mock
- private DOMDataWriteTransaction writeTransaction;
+ private DOMDataTreeWriteTransaction writeTransaction;
@Mock
- private DOMDataReadWriteTransaction rwTransaction;
+ private DOMDataTreeReadWriteTransaction rwTransaction;
private BrokerFacade brokerFacade;
private final NormalizedNode<?, ?> dummyNode = createDummyNode("test:module", "2014-01-09", "interfaces");
- private final CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> dummyNodeInFuture =
- wrapDummyNode(this.dummyNode);
+ private final FluentFuture<Optional<NormalizedNode<?, ?>>> dummyNodeInFuture = wrapDummyNode(this.dummyNode);
private final QName qname = TestUtils.buildQName("interfaces","test:module", "2014-01-09");
private final SchemaPath type = SchemaPath.create(true, this.qname);
private final YangInstanceIdentifier instanceID = YangInstanceIdentifier.builder().node(this.qname).build();
when(this.domDataBroker.newReadOnlyTransaction()).thenReturn(this.readTransaction);
when(this.domDataBroker.newWriteOnlyTransaction()).thenReturn(this.writeTransaction);
when(this.domDataBroker.newReadWriteTransaction()).thenReturn(this.rwTransaction);
- HashMap extensions = new HashMap();
- extensions.put(DOMDataTreeChangeService.class, Mockito.mock(DOMDataTreeChangeService.class));
- when(this.domDataBroker.getSupportedExtensions()).thenReturn(extensions);
+ when(this.domDataBroker.getExtensions()).thenReturn(ImmutableClassToInstanceMap.of(
+ DOMDataTreeChangeService.class, Mockito.mock(DOMDataTreeChangeService.class)));
}
- private static CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> wrapDummyNode(
- final NormalizedNode<?, ?> dummyNode) {
- return Futures.immediateCheckedFuture(Optional.<NormalizedNode<?, ?>>of(dummyNode));
+ private static FluentFuture<Optional<NormalizedNode<?, ?>>> wrapDummyNode(final NormalizedNode<?, ?> dummyNode) {
+ return immediateFluentFuture(Optional.of(dummyNode));
}
- private static CheckedFuture<Boolean, ReadFailedException> wrapExistence(final Boolean exists) {
- return Futures.immediateCheckedFuture(exists);
+ private static FluentFuture<Boolean> wrapExistence(final boolean exists) {
+ return immediateBooleanFluentFuture(exists);
}
/**
RpcError.ErrorType.TRANSPORT,
ErrorTag.RESOURCE_DENIED.getTagValue(),
"Master is down. Please try again.");
- final ReadFailedException exception503 = new ReadFailedException("Read from transaction failed", error);
- doReturn(Futures.immediateFailedCheckedFuture(exception503))
+ doReturn(immediateFailedFluentFuture(new ReadFailedException("Read from transaction failed", error)))
.when(readTransaction).read(any(LogicalDatastoreType.class), any(YangInstanceIdentifier.class));
try {
brokerFacade.readConfigurationData(this.instanceID, "explicit");
@Test
public void testInvokeRpc() throws Exception {
final DOMRpcResult expResult = mock(DOMRpcResult.class);
- final CheckedFuture<DOMRpcResult, DOMRpcException> future = Futures.immediateCheckedFuture(expResult);
- when(this.mockRpcService.invokeRpc(this.type, this.dummyNode)).thenReturn(future);
+ doReturn(immediateFluentFuture(expResult)).when(this.mockRpcService).invokeRpc(this.type, this.dummyNode);
- final CheckedFuture<DOMRpcResult, DOMRpcException> actualFuture = this.brokerFacade
- .invokeRpc(this.type, this.dummyNode);
+ final FluentFuture<DOMRpcResult> actualFuture = this.brokerFacade.invokeRpc(this.type, this.dummyNode);
assertNotNull("Future is null", actualFuture);
final DOMRpcResult actualResult = actualFuture.get();
assertSame("invokeRpc", expResult, actualResult);
@Test
public void testCommitConfigurationDataPut() throws Exception {
- @SuppressWarnings("unchecked")
- final CheckedFuture<Void, TransactionCommitFailedException> expFuture = mock(CheckedFuture.class);
- when(this.rwTransaction.submit()).thenReturn(expFuture);
+ doReturn(CommitInfo.emptyFluentFuture()).when(this.rwTransaction).commit();
- final Optional<NormalizedNode<?, ?>> optionalMock = mock(Optional.class);
- when(optionalMock.get()).thenReturn(null);
-
- final CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> readFuture = Futures
- .immediateCheckedFuture(optionalMock);
- when(this.rwTransaction.read(LogicalDatastoreType.CONFIGURATION, this.instanceID)).thenReturn(readFuture);
+ doReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class)))).when(this.rwTransaction)
+ .read(LogicalDatastoreType.CONFIGURATION, this.instanceID);
final PutResult result = this.brokerFacade.commitConfigurationDataPut(mock(SchemaContext.class),
this.instanceID, this.dummyNode, null, null);
- final Future<Void> actualFuture = result.getFutureOfPutData();
-
- assertSame("commitConfigurationDataPut", expFuture, actualFuture);
+ assertSame("commitConfigurationDataPut", CommitInfo.emptyFluentFuture(), result.getFutureOfPutData());
final InOrder inOrder = inOrder(this.domDataBroker, this.rwTransaction);
inOrder.verify(this.domDataBroker).newReadWriteTransaction();
inOrder.verify(this.rwTransaction).put(LogicalDatastoreType.CONFIGURATION, this.instanceID, this.dummyNode);
- inOrder.verify(this.rwTransaction).submit();
+ inOrder.verify(this.rwTransaction).commit();
}
@Test
public void testCommitConfigurationDataPost() {
- @SuppressWarnings("unchecked")
- final CheckedFuture<Void, TransactionCommitFailedException> expFuture = mock(CheckedFuture.class);
-
when(this.rwTransaction.exists(LogicalDatastoreType.CONFIGURATION, this.instanceID))
.thenReturn(wrapExistence(false));
- when(this.rwTransaction.submit()).thenReturn(expFuture);
+ doReturn(CommitInfo.emptyFluentFuture()).when(this.rwTransaction).commit();
- final CheckedFuture<Void, TransactionCommitFailedException> actualFuture = this.brokerFacade
+ final FluentFuture<? extends CommitInfo> actualFuture = this.brokerFacade
.commitConfigurationDataPost(mock(SchemaContext.class), this.instanceID, this.dummyNode, null, null);
- assertSame("commitConfigurationDataPost", expFuture, actualFuture);
+ assertSame("commitConfigurationDataPost", CommitInfo.emptyFluentFuture(), actualFuture);
final InOrder inOrder = inOrder(this.domDataBroker, this.rwTransaction);
inOrder.verify(this.domDataBroker).newReadWriteTransaction();
inOrder.verify(this.rwTransaction).exists(LogicalDatastoreType.CONFIGURATION, this.instanceID);
inOrder.verify(this.rwTransaction).put(LogicalDatastoreType.CONFIGURATION, this.instanceID, this.dummyNode);
- inOrder.verify(this.rwTransaction).submit();
+ inOrder.verify(this.rwTransaction).commit();
}
@Test(expected = RestconfDocumentedException.class)
public void testCommitConfigurationDataPostAlreadyExists() {
- final CheckedFuture<Boolean, ReadFailedException> successFuture = Futures.immediateCheckedFuture(Boolean.TRUE);
when(this.rwTransaction.exists(eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class)))
- .thenReturn(successFuture);
+ .thenReturn(immediateTrueFluentFuture());
try {
// Schema context is only necessary for ensuring parent structure
this.brokerFacade.commitConfigurationDataPost((SchemaContext) null, this.instanceID, this.dummyNode, null,
prepareDataForDelete(true);
// expected result
- @SuppressWarnings("unchecked")
- final CheckedFuture<Void, TransactionCommitFailedException> expFuture = mock(CheckedFuture.class);
- when(this.rwTransaction.submit()).thenReturn(expFuture);
+ doReturn(CommitInfo.emptyFluentFuture()).when(this.rwTransaction).commit();
// test
- final CheckedFuture<Void, TransactionCommitFailedException> actualFuture = this.brokerFacade
+ final FluentFuture<? extends CommitInfo> actualFuture = this.brokerFacade
.commitConfigurationDataDelete(this.instanceID);
// verify result and interactions
- assertSame("commitConfigurationDataDelete", expFuture, actualFuture);
+ assertSame("commitConfigurationDataDelete", CommitInfo.emptyFluentFuture(), actualFuture);
// check exists, delete, submit
final InOrder inOrder = inOrder(this.domDataBroker, this.rwTransaction);
inOrder.verify(this.rwTransaction).exists(LogicalDatastoreType.CONFIGURATION, this.instanceID);
inOrder.verify(this.rwTransaction).delete(LogicalDatastoreType.CONFIGURATION, this.instanceID);
- inOrder.verify(this.rwTransaction).submit();
+ inOrder.verify(this.rwTransaction).commit();
}
/**
*/
private void prepareDataForDelete(final boolean assumeDataExists) {
when(this.rwTransaction.exists(LogicalDatastoreType.CONFIGURATION, this.instanceID))
- .thenReturn(Futures.immediateCheckedFuture(new Boolean(assumeDataExists)));
+ .thenReturn(immediateBooleanFluentFuture(assumeDataExists));
}
@Test
@SuppressWarnings("unchecked")
final ListenerRegistration<ListenerAdapter> mockRegistration = mock(ListenerRegistration.class);
- DOMDataTreeChangeService changeService = (DOMDataTreeChangeService)
- this.domDataBroker.getSupportedExtensions().get(DOMDataTreeChangeService.class);
+ DOMDataTreeChangeService changeService = this.domDataBroker.getExtensions()
+ .getInstance(DOMDataTreeChangeService.class);
DOMDataTreeIdentifier loc = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, this.instanceID);
when(changeService.registerDataTreeChangeListener(eq(loc), eq(listener))).thenReturn(mockRegistration);
verify(this.domNotification, times(1)).registerNotificationListener(listener, listener.getSchemaPath());
final DOMTransactionChain transactionChain = mock(DOMTransactionChain.class);
- final DOMDataWriteTransaction wTx = mock(DOMDataWriteTransaction.class);
- final CheckedFuture<Void, TransactionCommitFailedException> checked = Futures.immediateCheckedFuture(null);
- when(wTx.submit()).thenReturn(checked);
+ final DOMDataTreeWriteTransaction wTx = mock(DOMDataTreeWriteTransaction.class);
+ doReturn(CommitInfo.emptyFluentFuture()).when(wTx).commit();
when(transactionChain.newWriteOnlyTransaction()).thenReturn(wTx);
// close and remove test notification listener
listener.close();
* Test Patch method on the server with no data.
*/
@Test
- @SuppressWarnings("unchecked")
public void testPatchConfigurationDataWithinTransactionServer() throws Exception {
final PatchContext patchContext = mock(PatchContext.class);
- final InstanceIdentifierContext identifierContext = mock(InstanceIdentifierContext.class);
- final CheckedFuture<Void, TransactionCommitFailedException> expFuture = Futures.immediateCheckedFuture(null);
+ final InstanceIdentifierContext<?> identifierContext = mock(InstanceIdentifierContext.class);
- when(patchContext.getData()).thenReturn(Lists.newArrayList());
- when(patchContext.getInstanceIdentifierContext()).thenReturn(identifierContext);
+ when(patchContext.getData()).thenReturn(new ArrayList<>());
+ doReturn(identifierContext).when(patchContext).getInstanceIdentifierContext();
// no mount point
when(identifierContext.getMountPoint()).thenReturn(null);
- when(this.rwTransaction.submit()).thenReturn(expFuture);
+ doReturn(CommitInfo.emptyFluentFuture()).when(this.rwTransaction).commit();
final PatchStatusContext status = this.brokerFacade.patchConfigurationDataWithinTransaction(patchContext);
* Test Patch method on mounted device with no data.
*/
@Test
- @SuppressWarnings("unchecked")
public void testPatchConfigurationDataWithinTransactionMount() throws Exception {
final PatchContext patchContext = mock(PatchContext.class);
- final InstanceIdentifierContext identifierContext = mock(InstanceIdentifierContext.class);
+ final InstanceIdentifierContext<?> identifierContext = mock(InstanceIdentifierContext.class);
final DOMMountPoint mountPoint = mock(DOMMountPoint.class);
final DOMDataBroker mountDataBroker = mock(DOMDataBroker.class);
- final DOMDataReadWriteTransaction transaction = mock(DOMDataReadWriteTransaction.class);
- final CheckedFuture<Void, TransactionCommitFailedException> expFuture = Futures.immediateCheckedFuture(null);
+ final DOMDataTreeReadWriteTransaction transaction = mock(DOMDataTreeReadWriteTransaction.class);
- when(patchContext.getData()).thenReturn(Lists.newArrayList());
- when(patchContext.getInstanceIdentifierContext()).thenReturn(identifierContext);
+ when(patchContext.getData()).thenReturn(new ArrayList<>());
+ doReturn(identifierContext).when(patchContext).getInstanceIdentifierContext();
// return mount point with broker
when(identifierContext.getMountPoint()).thenReturn(mountPoint);
when(mountPoint.getService(DOMDataBroker.class)).thenReturn(Optional.of(mountDataBroker));
when(mountDataBroker.newReadWriteTransaction()).thenReturn(transaction);
- when(transaction.submit()).thenReturn(expFuture);
+ doReturn(CommitInfo.emptyFluentFuture()).when(transaction).commit();
final PatchStatusContext status = this.brokerFacade.patchConfigurationDataWithinTransaction(patchContext);
* Patch operation should fail with global error.
*/
@Test
- @SuppressWarnings("unchecked")
public void testPatchConfigurationDataWithinTransactionMountFail() throws Exception {
final PatchContext patchContext = mock(PatchContext.class);
- final InstanceIdentifierContext identifierContext = mock(InstanceIdentifierContext.class);
+ final InstanceIdentifierContext<?> identifierContext = mock(InstanceIdentifierContext.class);
final DOMMountPoint mountPoint = mock(DOMMountPoint.class);
final DOMDataBroker mountDataBroker = mock(DOMDataBroker.class);
- final DOMDataReadWriteTransaction transaction = mock(DOMDataReadWriteTransaction.class);
- final CheckedFuture<Void, TransactionCommitFailedException> expFuture = Futures.immediateCheckedFuture(null);
+ final DOMDataTreeReadWriteTransaction transaction = mock(DOMDataTreeReadWriteTransaction.class);
- when(patchContext.getData()).thenReturn(Lists.newArrayList());
- when(patchContext.getInstanceIdentifierContext()).thenReturn(identifierContext);
+ when(patchContext.getData()).thenReturn(new ArrayList<>());
+ doReturn(identifierContext).when(patchContext).getInstanceIdentifierContext();
when(identifierContext.getMountPoint()).thenReturn(mountPoint);
// missing broker on mounted device
- when(mountPoint.getService(DOMDataBroker.class)).thenReturn(Optional.absent());
+ when(mountPoint.getService(DOMDataBroker.class)).thenReturn(Optional.empty());
when(mountDataBroker.newReadWriteTransaction()).thenReturn(transaction);
- when(transaction.submit()).thenReturn(expFuture);
+ doReturn(CommitInfo.emptyFluentFuture()).when(transaction).commit();
final PatchStatusContext status = this.brokerFacade.patchConfigurationDataWithinTransaction(patchContext);