2 * Copyright (c) 2017 Red Hat, Inc. 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.mdsal.binding.util;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertThrows;
14 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.TOP_FOO_KEY;
15 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.path;
16 import static org.opendaylight.mdsal.binding.test.model.util.ListsBindingUtils.topLevelList;
17 import static org.opendaylight.mdsal.binding.util.Datastore.OPERATIONAL;
19 import java.io.IOException;
20 import java.util.Optional;
21 import java.util.concurrent.ExecutionException;
22 import java.util.concurrent.Future;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.opendaylight.mdsal.binding.api.DataBroker;
26 import org.opendaylight.mdsal.binding.api.ReadTransaction;
27 import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractConcurrentDataBrokerTest;
28 import org.opendaylight.mdsal.binding.testutils.DataBrokerFailuresImpl;
29 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
30 import org.opendaylight.mdsal.common.api.OptimisticLockFailedException;
31 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugmentBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.complex.from.grouping.ContainerWithUsesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
36 import org.opendaylight.yangtools.yang.binding.DataObject;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 * Test for {@link ManagedNewTransactionRunnerImpl}.
42 * @author Michael Vorburger.ch
43 * @author Stephen Kitt
45 public class ManagedNewTransactionRunnerImplTest extends AbstractConcurrentDataBrokerTest {
47 static final InstanceIdentifier<TopLevelList> TEST_PATH = path(TOP_FOO_KEY);
49 DataBrokerFailuresImpl testableDataBroker;
50 ManagedNewTransactionRunner managedNewTransactionRunner;
52 public ManagedNewTransactionRunnerImplTest() {
56 protected ManagedNewTransactionRunner createManagedNewTransactionRunnerToTest(final DataBroker dataBroker) {
57 return new ManagedNewTransactionRunnerImpl(dataBroker);
61 public void beforeTest() throws Exception {
63 testableDataBroker = new DataBrokerFailuresImpl(getDataBroker());
64 managedNewTransactionRunner = createManagedNewTransactionRunnerToTest(testableDataBroker);
68 public void testApplyWithNewReadTransactionAndCloseEmptySuccessfully() {
69 assertEquals(Long.valueOf(1),
70 managedNewTransactionRunner.applyWithNewReadOnlyTransactionAndClose(OPERATIONAL, tx -> 1L));
74 public void testCallWithNewReadTransactionAndCloseEmptySuccessfully() {
75 managedNewTransactionRunner.callWithNewReadOnlyTransactionAndClose(OPERATIONAL, tx -> { });
79 public void testCallWithNewTypedWriteOnlyTransactionAndSubmitEmptySuccessfully() throws Exception {
80 managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, writeTx -> { }).get();
84 public void testCallWithNewTypedReadWriteTransactionAndSubmitEmptySuccessfully() throws Exception {
85 managedNewTransactionRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL, tx -> { }).get();
89 public void testApplyWithNewReadWriteTransactionAndSubmitEmptySuccessfully() throws Exception {
91 (long) managedNewTransactionRunner.applyWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
96 public void testCallWithNewTypedWriteOnlyTransactionAndSubmitPutSuccessfully() throws Exception {
97 TopLevelList data = newTestDataObject();
98 managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
99 writeTx -> writeTx.put(TEST_PATH, data)).get();
100 assertEquals(data, syncRead(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
104 public void testCallWithNewTypedReadWriteTransactionAndSubmitPutSuccessfully() throws Exception {
105 TopLevelList data = newTestDataObject();
106 managedNewTransactionRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
107 tx -> tx.put(TEST_PATH, data)).get();
108 assertEquals(data, syncRead(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
112 public void testApplyWithNewReadWriteTransactionAndSubmitPutSuccessfully() throws Exception {
113 TopLevelList data = newTestDataObject();
114 assertEquals(1, (long) managedNewTransactionRunner.applyWithNewReadWriteTransactionAndSubmit(
116 tx.put(TEST_PATH, data);
119 assertEquals(data, syncRead(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
123 public void testCallWithNewReadTransactionAndCloseReadSuccessfully() throws Exception {
124 TopLevelList data = newTestDataObject();
125 managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
126 tx -> tx.put(TEST_PATH, data)).get();
127 assertEquals(Optional.of(data), managedNewTransactionRunner.applyWithNewReadOnlyTransactionAndClose(OPERATIONAL,
128 tx -> tx.read(TEST_PATH)).get());
131 TopLevelList newTestDataObject() {
132 TreeComplexUsesAugment fooAugment = new TreeComplexUsesAugmentBuilder()
133 .setContainerWithUses(new ContainerWithUsesBuilder().setLeafFromGrouping("foo").build()).build();
134 return topLevelList(TOP_FOO_KEY, fooAugment);
138 public void testCallWithNewTypedWriteOnlyTransactionAndSubmitPutButLaterException() throws Exception {
139 Future<?> future = managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
141 writeTx.put(TEST_PATH, newTestDataObject());
142 // We now throw an arbitrary kind of checked (not unchecked!) exception here
143 throw new IOException("something didn't quite go as expected...");
145 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
146 assertThat(ex.getCause(), instanceOf(IOException.class));
147 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
151 public void testCallWithNewTypedReadWriteTransactionAndSubmitPutButLaterException() throws Exception {
152 Future<?> future = managedNewTransactionRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
154 writeTx.put(TEST_PATH, newTestDataObject());
155 // We now throw an arbitrary kind of checked (not unchecked!) exception here
156 throw new IOException("something didn't quite go as expected...");
158 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
159 assertThat(ex.getCause(), instanceOf(IOException.class));
160 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
164 public void testApplyWithNewReadWriteTransactionAndSubmitPutButLaterException() throws Exception {
165 Future<?> future = managedNewTransactionRunner.applyWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
167 writeTx.put(TEST_PATH, newTestDataObject());
168 // We now throw an arbitrary kind of checked (not unchecked!) exception here
169 throw new IOException("something didn't quite go as expected...");
171 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
172 assertThat(ex.getCause(), instanceOf(IOException.class));
173 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
177 public void testCallWithNewTypedWriteOnlyTransactionCommitFailedException() throws Exception {
178 testableDataBroker.failCommits(new TransactionCommitFailedException("bada boum bam!"));
179 Future<?> future = managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
180 writeTx -> writeTx.put(TEST_PATH, newTestDataObject()));
181 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
182 assertThat(ex.getCause(), instanceOf(TransactionCommitFailedException.class));
183 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
187 public void testCallWithNewTypedReadWriteTransactionCommitFailedException() throws Exception {
188 testableDataBroker.failCommits(new TransactionCommitFailedException("bada boum bam!"));
189 Future<?> future = managedNewTransactionRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
190 writeTx -> writeTx.put(TEST_PATH, newTestDataObject()));
191 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
192 assertThat(ex.getCause(), instanceOf(TransactionCommitFailedException.class));
193 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
197 public void testApplyWithNewReadWriteTransactionCommitFailedException() throws Exception {
198 testableDataBroker.failCommits(new TransactionCommitFailedException("bada boum bam!"));
199 Future<?> future = managedNewTransactionRunner.applyWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
201 writeTx.put(TEST_PATH, newTestDataObject());
204 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
205 assertThat(ex.getCause(), instanceOf(TransactionCommitFailedException.class));
206 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
210 public void testCallWithNewTypedWriteOnlyTransactionOptimisticLockFailedException() throws Exception {
211 testableDataBroker.failCommits(2, new OptimisticLockFailedException("bada boum bam!"));
212 Future<?> future = managedNewTransactionRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
213 writeTx -> writeTx.put(TEST_PATH, newTestDataObject()));
214 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
215 assertThat(ex.getCause(), instanceOf(OptimisticLockFailedException.class));
216 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
220 public void testCallWithNewTypedReadWriteTransactionOptimisticLockFailedException() throws Exception {
221 testableDataBroker.failCommits(2, new OptimisticLockFailedException("bada boum bam!"));
222 Future<?> future = managedNewTransactionRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
223 writeTx -> writeTx.put(TEST_PATH, newTestDataObject()));
224 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
225 assertThat(ex.getCause(), instanceOf(OptimisticLockFailedException.class));
226 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
230 public void testApplyWithNewReadWriteTransactionOptimisticLockFailedException() throws Exception {
231 testableDataBroker.failCommits(2, new OptimisticLockFailedException("bada boum bam!"));
232 Future<?> future = managedNewTransactionRunner.applyWithNewReadWriteTransactionAndSubmit(OPERATIONAL,
234 writeTx.put(TEST_PATH, newTestDataObject());
237 ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get());
238 assertThat(ex.getCause(), instanceOf(OptimisticLockFailedException.class));
239 assertEquals(Optional.empty(), syncReadOptional(LogicalDatastoreType.OPERATIONAL, TEST_PATH));
242 private <T extends DataObject> Optional<T> syncReadOptional(final LogicalDatastoreType datastoreType,
243 final InstanceIdentifier<T> path) throws ExecutionException, InterruptedException {
244 try (ReadTransaction tx = getDataBroker().newReadOnlyTransaction()) {
245 return tx.read(datastoreType, path).get();
249 <T extends DataObject> T syncRead(final LogicalDatastoreType datastoreType, final InstanceIdentifier<T> path)
250 throws ExecutionException, InterruptedException {
251 return syncReadOptional(datastoreType, path).orElseThrow();