Move TransactionChainManagerTest
[openflowplugin.git] / openflowplugin-common / src / test / java / org / opendaylight / openflowplugin / common / txchain / TransactionChainManagerTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, 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.openflowplugin.common.txchain;
9
10 import static org.mockito.ArgumentMatchers.any;
11
12 import java.util.concurrent.ExecutionException;
13 import org.junit.After;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.junit.runner.RunWith;
17 import org.mockito.Mock;
18 import org.mockito.Mockito;
19 import org.mockito.junit.MockitoJUnitRunner;
20 import org.opendaylight.mdsal.binding.api.DataBroker;
21 import org.opendaylight.mdsal.binding.api.ReadTransaction;
22 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
23 import org.opendaylight.mdsal.binding.api.Transaction;
24 import org.opendaylight.mdsal.binding.api.TransactionChain;
25 import org.opendaylight.mdsal.binding.api.TransactionChainListener;
26 import org.opendaylight.mdsal.common.api.CommitInfo;
27 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
36
37 @RunWith(MockitoJUnitRunner.class)
38 public class TransactionChainManagerTest {
39
40     @Mock
41     private DataBroker dataBroker;
42     @Mock
43     private TransactionChain txChain;
44     @Mock
45     private ReadWriteTransaction writeTx;
46     @Mock
47     private TransactionChain transactionChain;
48
49     @Mock
50     private KeyedInstanceIdentifier<Node, NodeKey> nodeKeyIdent;
51
52     private TransactionChainManager txChainManager;
53     private InstanceIdentifier<Node> path;
54     private NodeId nodeId;
55
56     @Before
57     public void setUp() {
58         final ReadTransaction readOnlyTx = Mockito.mock(ReadTransaction.class);
59         Mockito.when(dataBroker.createTransactionChain(any(TransactionChainListener.class)))
60                 .thenReturn(txChain);
61         nodeId = new NodeId("h2g2:42");
62         nodeKeyIdent = InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(nodeId));
63         txChainManager = new TransactionChainManager(dataBroker, nodeId.getValue());
64         Mockito.when(txChain.newReadWriteTransaction()).thenReturn(writeTx);
65
66         path = InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(nodeId));
67         Mockito.doReturn(CommitInfo.emptyFluentFuture()).when(writeTx).commit();
68         txChainManager.activateTransactionManager();
69     }
70
71     @After
72     public void tearDown() {
73         Mockito.verifyNoMoreInteractions(txChain, writeTx);
74     }
75
76     @Test
77     public void testWriteToTransaction() {
78         final Node data = new NodeBuilder().setId(nodeId).build();
79         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
80
81         Mockito.verify(txChain).newReadWriteTransaction();
82         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
83     }
84
85     /**
86      * Tests transaction submit {@link TransactionChainManager#submitTransaction()}.
87      */
88     @Test
89     public void testSubmitTransaction() {
90         final Node data = new NodeBuilder().setId(nodeId).build();
91         txChainManager.initialSubmitWriteTransaction();
92         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
93         txChainManager.submitTransaction();
94
95         Mockito.verify(txChain).newReadWriteTransaction();
96         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
97         Mockito.verify(writeTx).commit();
98     }
99
100     /**
101      * test of {@link TransactionChainManager#submitTransaction()}: no submit, never enabled.
102      */
103     @Test
104     public void testSubmitTransaction1() {
105         final Node data = new NodeBuilder().setId(nodeId).build();
106         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
107         txChainManager.submitTransaction();
108
109         Mockito.verify(txChain).newReadWriteTransaction();
110         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
111         Mockito.verify(writeTx, Mockito.never()).commit();
112     }
113
114     @Test
115     public void testSubmitTransactionFailed() {
116         Mockito.doReturn(FluentFutures.immediateFailedFluentFuture(new ExecutionException(new Throwable("mock"))))
117             .when(writeTx).commit();
118         final Node data = new NodeBuilder().setId(nodeId).build();
119         txChainManager.initialSubmitWriteTransaction();
120         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
121         txChainManager.submitTransaction();
122
123         Mockito.verify(txChain).newReadWriteTransaction();
124         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
125         Mockito.verify(writeTx).commit();
126     }
127
128     /**
129      * Test of {@link TransactionChainManager#enableSubmit()}: no submit - counter is not active.
130      */
131     @Test
132     public void testEnableCounter1() {
133         final Node data = new NodeBuilder().setId(nodeId).build();
134         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
135         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
136
137         Mockito.verify(txChain).newReadWriteTransaction();
138         Mockito.verify(writeTx, Mockito.times(2)).put(LogicalDatastoreType.CONFIGURATION, path, data);
139         Mockito.verify(writeTx, Mockito.never()).commit();
140     }
141
142     @Test
143     public void testOnTransactionChainFailed() {
144         txChainManager.onTransactionChainFailed(txChain, Mockito.mock(Transaction.class),
145             Mockito.mock(Throwable.class));
146         Mockito.verify(txChain).close();
147         Mockito.verify(dataBroker, Mockito.times(2)).createTransactionChain(txChainManager);
148     }
149
150     @Test
151     public void testOnTransactionChainSuccessful() {
152         txChainManager.onTransactionChainSuccessful(transactionChain);
153         // NOOP
154         Mockito.verifyNoInteractions(transactionChain);
155     }
156
157     @Test
158     public void testAddDeleteOperationTotTxChain() {
159         txChainManager.addDeleteOperationToTxChain(LogicalDatastoreType.CONFIGURATION, path);
160
161         Mockito.verify(txChain).newReadWriteTransaction();
162         Mockito.verify(writeTx).delete(LogicalDatastoreType.CONFIGURATION, path);
163     }
164
165     @Test
166     public void testDeactivateTransactionChainManager() {
167         txChainManager.deactivateTransactionManager();
168
169         Mockito.verify(txChain).close();
170     }
171
172     @Test
173     public void testDeactivateTransactionChainManagerFailed() {
174         final Node data = new NodeBuilder().setId(nodeId).build();
175         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
176
177         txChainManager.deactivateTransactionManager();
178
179         Mockito.verify(txChain).newReadWriteTransaction();
180         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
181         Mockito.verify(writeTx, Mockito.never()).commit();
182         Mockito.verify(writeTx).cancel();
183         Mockito.verify(txChain).close();
184     }
185
186     @Test
187     public void testShuttingDown() {
188         final Node data = new NodeBuilder().setId(nodeId).build();
189         txChainManager.initialSubmitWriteTransaction();
190         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
191         txChainManager.shuttingDown();
192
193         Mockito.verify(txChain).newReadWriteTransaction();
194         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
195         Mockito.verify(writeTx).commit();
196     }
197
198     @Test
199     public void testClose() {
200         txChainManager.shuttingDown();
201         txChainManager.close();
202         Mockito.verify(txChain).close();
203     }
204 }