3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/epl-v10.html
7 package org.opendaylight.mdsal.dom.broker;
9 import static org.hamcrest.CoreMatchers.instanceOf;
10 import static org.hamcrest.MatcherAssert.assertThat;
11 import static org.junit.Assert.assertSame;
12 import static org.junit.Assert.assertThrows;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.doThrow;
16 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
18 import com.google.common.util.concurrent.ListenableFuture;
19 import java.util.concurrent.ExecutionException;
20 import java.util.function.Function;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mock;
25 import org.mockito.junit.MockitoJUnitRunner;
26 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
27 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
28 import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
30 @RunWith(MockitoJUnitRunner.StrictStubs.class)
31 public class DOMForwardedWriteTransactionTest {
33 private AbstractDOMForwardedTransactionFactory<?> commitImpl;
36 private DOMStoreWriteTransaction domStoreWriteTransaction;
38 private Function<LogicalDatastoreType, DOMStoreWriteTransaction> backingTxFactory;
42 backingTxFactory = storeType -> domStoreWriteTransaction;
46 public void readyRuntimeExceptionAndCancel() throws InterruptedException {
47 final RuntimeException thrown = new RuntimeException();
48 doThrow(thrown).when(domStoreWriteTransaction).ready();
49 final DOMForwardedWriteTransaction<DOMStoreWriteTransaction> domForwardedWriteTransaction =
50 new DOMForwardedWriteTransaction<>(new Object(), backingTxFactory, commitImpl);
51 domForwardedWriteTransaction.getSubtransaction(CONFIGURATION); // ensure backingTx initialized
52 ListenableFuture<?> submitFuture = domForwardedWriteTransaction.commit();
54 ExecutionException ex = assertThrows(ExecutionException.class, submitFuture::get);
55 Throwable cause = ex.getCause();
56 assertThat(cause, instanceOf(TransactionCommitFailedException.class));
57 assertSame(thrown, cause.getCause());
58 domForwardedWriteTransaction.cancel();
62 public void submitRuntimeExceptionAndCancel() throws InterruptedException {
63 RuntimeException thrown = new RuntimeException();
64 doReturn(null).when(domStoreWriteTransaction).ready();
65 doThrow(thrown).when(commitImpl).commit(any(), any());
66 DOMForwardedWriteTransaction<DOMStoreWriteTransaction> domForwardedWriteTransaction =
67 new DOMForwardedWriteTransaction<>(new Object(), backingTxFactory, commitImpl);
68 domForwardedWriteTransaction.getSubtransaction(CONFIGURATION); // ensure backingTx initialized
69 ListenableFuture<?> submitFuture = domForwardedWriteTransaction.commit();
70 ExecutionException ex = assertThrows(ExecutionException.class, submitFuture::get);
71 Throwable cause = ex.getCause();
72 assertThat(cause, instanceOf(TransactionCommitFailedException.class));
73 assertSame(thrown, cause.getCause());
74 domForwardedWriteTransaction.cancel();