fa9106a14baaa0aece7093d7846865b8fd3324cd
[mdsal.git] / binding / mdsal-binding-test-utils / src / test / java / org / opendaylight / mdsal / binding / testutils / DataBrokerFailuresTest.java
1 /*
2  * Copyright (c) 2017 Red Hat, Inc. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.testutils;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.junit.Assert.fail;
12 import static org.junit.runners.MethodSorters.NAME_ASCENDING;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.TimeUnit;
18 import java.util.concurrent.TimeoutException;
19 import org.junit.Before;
20 import org.junit.FixMethodOrder;
21 import org.junit.Test;
22 import org.opendaylight.mdsal.binding.api.DataBroker;
23 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
24 import org.opendaylight.mdsal.binding.api.WriteTransaction;
25 import org.opendaylight.mdsal.common.api.CommitInfo;
26 import org.opendaylight.mdsal.common.api.OptimisticLockFailedException;
27 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
28
29 /**
30  * Unit test for DataBrokerFailuresImpl.
31  *
32  * @author Michael Vorburger.ch
33  */
34 @FixMethodOrder(NAME_ASCENDING)
35 public class DataBrokerFailuresTest {
36
37     private final DataBrokerFailures dbFailures;
38     private final DataBroker dataBroker;
39
40     public DataBrokerFailuresTest() {
41         DataBroker mockDataBroker = mock(DataBroker.class);
42         ReadWriteTransaction readWriteTransaction = mock(ReadWriteTransaction.class);
43         doReturn(CommitInfo.emptyFluentFuture()).when(readWriteTransaction).commit();
44         doReturn(readWriteTransaction).when(mockDataBroker).newReadWriteTransaction();
45         WriteTransaction writeTransaction = mock(WriteTransaction.class);
46         doReturn(CommitInfo.emptyFluentFuture()).when(writeTransaction).commit();
47         doReturn(writeTransaction).when(mockDataBroker).newWriteOnlyTransaction();
48         dbFailures = new DataBrokerFailuresImpl(mockDataBroker);
49         dataBroker = (DataBroker) dbFailures;
50     }
51
52     @Before
53     public void setup() {
54
55     }
56
57     @Test
58     public void testFailReadWriteTransactionCommit() throws TimeoutException, InterruptedException {
59         dbFailures.failCommits(new OptimisticLockFailedException("bada boum bam!"));
60         checkCommitFails();
61         // Now make sure that it still fails, and not just once:
62         checkCommitFails();
63         // and still:
64         checkCommitFails();
65     }
66
67     private void checkCommitFails() throws TimeoutException, InterruptedException {
68         try {
69             dataBroker.newReadWriteTransaction().commit().get(5, TimeUnit.SECONDS);
70             fail("This should have led to a TransactionCommitFailedException!");
71         } catch (ExecutionException e) {
72             assertTrue("Expected TransactionCommitFailedException",
73                     e.getCause() instanceof TransactionCommitFailedException);
74         }
75     }
76
77     @Test
78     public void testFailReadWriteTransactionCommitNext()
79             throws TimeoutException, InterruptedException, ExecutionException {
80         // This must pass (the failCommits from previous test cannot affect this)
81         // (It's a completely new instance of DataBroker & DataBrokerFailures anyways, but just to be to sure.)
82         dataBroker.newReadWriteTransaction().commit().get(5, TimeUnit.SECONDS);
83     }
84
85     @Test
86     public void testFailTwoReadWriteTransactionCommit()
87             throws TimeoutException, InterruptedException, ExecutionException {
88         dbFailures.failCommits(2, new OptimisticLockFailedException("bada boum bam!"));
89         checkCommitFails();
90         // Now make sure that it still fails again a 2nd time, and not just once:
91         checkCommitFails();
92         // But now it should pass.. because we specified howManyTimes = 2 above
93         dataBroker.newReadWriteTransaction().commit().get(5, TimeUnit.SECONDS);
94         dataBroker.newWriteOnlyTransaction().commit().get(5, TimeUnit.SECONDS);
95         dataBroker.newReadWriteTransaction().commit().get(5, TimeUnit.SECONDS);
96     }
97
98     @Test(expected = OptimisticLockFailedException.class)
99     @SuppressWarnings("checkstyle:AvoidHidingCauseException")
100     public void testFailWriteTransactionCommit()
101             throws TimeoutException, InterruptedException, TransactionCommitFailedException {
102         dbFailures.failCommits(new OptimisticLockFailedException("bada boum bam!"));
103         try {
104             dataBroker.newWriteOnlyTransaction().commit().get(5, TimeUnit.SECONDS);
105         } catch (ExecutionException e) {
106             assertTrue("Expected TransactionCommitFailedException",
107                     e.getCause() instanceof TransactionCommitFailedException);
108             throw (TransactionCommitFailedException)e.getCause();
109         }
110     }
111
112     @Test
113     public void testUnfailCommits() throws TimeoutException, InterruptedException, ExecutionException {
114         dbFailures.failCommits(new OptimisticLockFailedException("bada boum bam!"));
115         checkCommitFails();
116         dbFailures.unfailCommits();
117         dataBroker.newReadWriteTransaction().commit().get(5, TimeUnit.SECONDS);
118         dataBroker.newWriteOnlyTransaction().commit().get(5, TimeUnit.SECONDS);
119         dataBroker.newReadWriteTransaction().commit().get(5, TimeUnit.SECONDS);
120     }
121
122     @Test
123     public void testFailButCommitAnywayReadWriteTransaction() throws TimeoutException, InterruptedException {
124         dbFailures.failButCommitAnyway();
125         checkCommitFails();
126     }
127
128     // TODO make this work for TransactionChain as well ...
129
130 }