import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFalseFluentFuture;
-import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateFluentFuture;
import static org.opendaylight.yangtools.util.concurrent.FluentFutures.immediateTrueFluentFuture;
-import java.util.Optional;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.SettableFuture;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.mdsal.common.api.CommitInfo;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
import org.opendaylight.mdsal.dom.api.DOMDataBroker;
import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
+import org.opendaylight.netconf.api.DocumentedException;
+import org.opendaylight.netconf.api.NetconfDocumentedException;
import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
-import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
-import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler;
import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStrategy;
import org.opendaylight.restconf.nb.rfc8040.rests.transactions.NetconfRestconfStrategy;
import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
+import org.opendaylight.yangtools.yang.common.ErrorSeverity;
+import org.opendaylight.yangtools.yang.common.ErrorType;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class DeleteDataTransactionUtilTest {
- @Mock
- private DOMTransactionChain transactionChain;
@Mock
private InstanceIdentifierContext<?> context;
@Mock
@Mock
private NetconfDataTreeService netconfService;
- private TransactionChainHandler transactionChainHandler;
-
@Before
public void init() {
- MockitoAnnotations.initMocks(this);
- Mockito.when(this.transactionChain.newReadWriteTransaction()).thenReturn(this.readWrite);
- Mockito.doReturn(CommitInfo.emptyFluentFuture()).when(this.readWrite).commit();
- Mockito.doReturn(CommitInfo.emptyFluentFuture()).when(this.netconfService).commit(Mockito.any());
- Mockito.when(this.context.getInstanceIdentifier()).thenReturn(YangInstanceIdentifier.empty());
-
- Mockito.doReturn(transactionChain).when(mockDataBroker).createTransactionChain(Mockito.any());
- transactionChainHandler = new TransactionChainHandler(mockDataBroker);
+ doReturn(CommitInfo.emptyFluentFuture()).when(this.readWrite).commit();
+ doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(this.netconfService).commit();
+ doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(this.netconfService).discardChanges();
+ doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(this.netconfService).unlock();
+ doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(this.netconfService).lock();
+ doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(this.netconfService)
+ .delete(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.empty());
+ doReturn(YangInstanceIdentifier.empty()).when(this.context).getInstanceIdentifier();
+ doReturn(readWrite).when(mockDataBroker).newReadWriteTransaction();
}
/**
@Test
public void deleteData() {
// assert that data to delete exists
- Mockito.when(this.transactionChain.newReadWriteTransaction().exists(LogicalDatastoreType.CONFIGURATION,
- YangInstanceIdentifier.empty())).thenReturn(immediateTrueFluentFuture());
- Mockito.when(this.netconfService.getConfig(YangInstanceIdentifier.empty()))
- .thenReturn(immediateFluentFuture(Optional.of(mock(NormalizedNode.class))));
+ when(readWrite.exists(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.empty()))
+ .thenReturn(immediateTrueFluentFuture());
// test
- delete(new MdsalRestconfStrategy(this.context, transactionChainHandler));
- delete(new NetconfRestconfStrategy(netconfService, this.context));
+ delete(new MdsalRestconfStrategy(mockDataBroker));
+ delete(new NetconfRestconfStrategy(netconfService));
}
/**
@Test
public void deleteDataNegativeTest() {
// assert that data to delete does NOT exist
- Mockito.when(this.transactionChain.newReadWriteTransaction().exists(LogicalDatastoreType.CONFIGURATION,
- YangInstanceIdentifier.empty())).thenReturn(immediateFalseFluentFuture());
- Mockito.when(this.netconfService.getConfig(YangInstanceIdentifier.empty()))
- .thenReturn(immediateFluentFuture(Optional.empty()));
+ when(readWrite.exists(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.empty()))
+ .thenReturn(immediateFalseFluentFuture());
+ final NetconfDocumentedException exception = new NetconfDocumentedException("id",
+ ErrorType.RPC, DocumentedException.ErrorTag.from("data-missing"), ErrorSeverity.ERROR);
+ final SettableFuture<? extends CommitInfo> ret = SettableFuture.create();
+ ret.setException(new TransactionCommitFailedException(
+ String.format("Commit of transaction %s failed", this), exception));
+
+ doReturn(ret).when(this.netconfService).commit();
+
// test and assert error
- deleteFail(new MdsalRestconfStrategy(this.context, transactionChainHandler));
- deleteFail(new NetconfRestconfStrategy(netconfService, this.context));
+ deleteFail(new MdsalRestconfStrategy(mockDataBroker));
+ deleteFail(new NetconfRestconfStrategy(netconfService));
}
private void delete(final RestconfStrategy strategy) {
- final Response response = DeleteDataTransactionUtil.deleteData(strategy);
+ final Response response = DeleteDataTransactionUtil.deleteData(strategy, context.getInstanceIdentifier());
// assert success
assertEquals("Not expected response received", Status.NO_CONTENT.getStatusCode(), response.getStatus());
}
private void deleteFail(final RestconfStrategy strategy) {
try {
- DeleteDataTransactionUtil.deleteData(strategy);
+ DeleteDataTransactionUtil.deleteData(strategy, context.getInstanceIdentifier());
fail("Delete operation should fail due to missing data");
} catch (final RestconfDocumentedException e) {
assertEquals(ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());