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.controller.cluster.databroker;
9 import static org.junit.Assert.assertEquals;
10 import static org.junit.Assert.assertSame;
11 import static org.junit.Assert.assertThrows;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doThrow;
15 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.CONFIGURATION;
16 import static org.opendaylight.mdsal.common.api.LogicalDatastoreType.OPERATIONAL;
18 import com.google.common.util.concurrent.FluentFuture;
20 import java.util.concurrent.ExecutionException;
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.mockito.Mock;
24 import org.mockito.junit.MockitoJUnitRunner;
25 import org.opendaylight.mdsal.common.api.CommitInfo;
26 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
27 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
28 import org.opendaylight.mdsal.common.api.TransactionDatastoreMismatchException;
29 import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionFactory;
30 import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
32 @RunWith(MockitoJUnitRunner.StrictStubs.class)
33 public class AbstractDOMBrokerWriteTransactionTest {
36 private DOMStoreTransactionFactory txFactory;
38 private AbstractDOMTransactionFactory<?> abstractDOMTransactionFactory;
40 private DOMStoreWriteTransaction domStoreWriteTransaction;
42 private class AbstractDOMBrokerWriteTransactionTestImpl
43 extends AbstractDOMBrokerWriteTransaction<DOMStoreWriteTransaction> {
45 AbstractDOMBrokerWriteTransactionTestImpl() {
46 this(Map.of(CONFIGURATION, txFactory));
49 AbstractDOMBrokerWriteTransactionTestImpl(Map<LogicalDatastoreType, DOMStoreTransactionFactory> txFactoryMap) {
50 super(new Object(), txFactoryMap, abstractDOMTransactionFactory);
54 protected DOMStoreWriteTransaction createTransaction(final LogicalDatastoreType key) {
55 return domStoreWriteTransaction;
59 protected DOMStoreWriteTransaction getSubtransaction() {
60 return domStoreWriteTransaction;
65 public void readyRuntimeExceptionAndCancel() {
66 RuntimeException thrown = new RuntimeException();
67 doThrow(thrown).when(domStoreWriteTransaction).ready();
68 AbstractDOMBrokerWriteTransactionTestImpl abstractDOMBrokerWriteTransactionTestImpl =
69 new AbstractDOMBrokerWriteTransactionTestImpl();
71 FluentFuture<? extends CommitInfo> submitFuture = abstractDOMBrokerWriteTransactionTestImpl.commit();
72 final var cause = assertThrows(ExecutionException.class, submitFuture::get).getCause();
73 assertTrue(cause instanceof TransactionCommitFailedException);
74 assertSame(thrown, cause.getCause());
75 abstractDOMBrokerWriteTransactionTestImpl.cancel();
79 public void submitRuntimeExceptionAndCancel() throws InterruptedException {
80 RuntimeException thrown = new RuntimeException();
81 doThrow(thrown).when(abstractDOMTransactionFactory).commit(any(), any());
82 AbstractDOMBrokerWriteTransactionTestImpl abstractDOMBrokerWriteTransactionTestImpl
83 = new AbstractDOMBrokerWriteTransactionTestImpl();
85 FluentFuture<? extends CommitInfo> submitFuture = abstractDOMBrokerWriteTransactionTestImpl.commit();
86 final var cause = assertThrows(ExecutionException.class, submitFuture::get).getCause();
87 assertTrue(cause instanceof TransactionCommitFailedException);
88 assertSame(thrown, cause.getCause());
89 abstractDOMBrokerWriteTransactionTestImpl.cancel();
93 public void getSubtransactionStoreMismatch() {
94 final var testTx = new AbstractDOMBrokerWriteTransactionTestImpl(
95 Map.of(CONFIGURATION, txFactory, OPERATIONAL, txFactory));
97 assertEquals(domStoreWriteTransaction, testTx.getSubtransaction(CONFIGURATION));
99 final var exception = assertThrows(TransactionDatastoreMismatchException.class,
100 () -> testTx.getSubtransaction(OPERATIONAL));
101 assertEquals(CONFIGURATION, exception.expected());
102 assertEquals(OPERATIONAL, exception.encountered());
106 public void getSubtransactionStoreUndefined() {
107 final var testTx = new AbstractDOMBrokerWriteTransactionTestImpl(Map.of(OPERATIONAL, txFactory));
109 final var exception = assertThrows(IllegalArgumentException.class,
110 () -> testTx.getSubtransaction(CONFIGURATION));
111 assertEquals("CONFIGURATION is not supported", exception.getMessage());