2 * Copyright (c) 2015 Cisco Systems, 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.openflowplugin.common.txchain;
10 import static org.mockito.ArgumentMatchers.any;
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;
37 @RunWith(MockitoJUnitRunner.class)
38 public class TransactionChainManagerTest {
41 private DataBroker dataBroker;
43 private TransactionChain txChain;
45 private ReadWriteTransaction writeTx;
47 private TransactionChain transactionChain;
50 private KeyedInstanceIdentifier<Node, NodeKey> nodeKeyIdent;
52 private TransactionChainManager txChainManager;
53 private InstanceIdentifier<Node> path;
54 private NodeId nodeId;
58 final ReadTransaction readOnlyTx = Mockito.mock(ReadTransaction.class);
59 Mockito.when(dataBroker.createTransactionChain(any(TransactionChainListener.class)))
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);
66 path = InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(nodeId));
67 Mockito.doReturn(CommitInfo.emptyFluentFuture()).when(writeTx).commit();
68 txChainManager.activateTransactionManager();
72 public void tearDown() {
73 Mockito.verifyNoMoreInteractions(txChain, writeTx);
77 public void testWriteToTransaction() {
78 final Node data = new NodeBuilder().setId(nodeId).build();
79 txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
81 Mockito.verify(txChain).newReadWriteTransaction();
82 Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
86 * Tests transaction submit {@link TransactionChainManager#submitTransaction()}.
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();
95 Mockito.verify(txChain).newReadWriteTransaction();
96 Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
97 Mockito.verify(writeTx).commit();
101 * test of {@link TransactionChainManager#submitTransaction()}: no submit, never enabled.
104 public void testSubmitTransaction1() {
105 final Node data = new NodeBuilder().setId(nodeId).build();
106 txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
107 txChainManager.submitTransaction();
109 Mockito.verify(txChain).newReadWriteTransaction();
110 Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
111 Mockito.verify(writeTx, Mockito.never()).commit();
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();
123 Mockito.verify(txChain).newReadWriteTransaction();
124 Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
125 Mockito.verify(writeTx).commit();
129 * Test of {@link TransactionChainManager#enableSubmit()}: no submit - counter is not active.
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);
137 Mockito.verify(txChain).newReadWriteTransaction();
138 Mockito.verify(writeTx, Mockito.times(2)).put(LogicalDatastoreType.CONFIGURATION, path, data);
139 Mockito.verify(writeTx, Mockito.never()).commit();
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);
151 public void testOnTransactionChainSuccessful() {
152 txChainManager.onTransactionChainSuccessful(transactionChain);
154 Mockito.verifyNoInteractions(transactionChain);
158 public void testAddDeleteOperationTotTxChain() {
159 txChainManager.addDeleteOperationToTxChain(LogicalDatastoreType.CONFIGURATION, path);
161 Mockito.verify(txChain).newReadWriteTransaction();
162 Mockito.verify(writeTx).delete(LogicalDatastoreType.CONFIGURATION, path);
166 public void testDeactivateTransactionChainManager() {
167 txChainManager.deactivateTransactionManager();
169 Mockito.verify(txChain).close();
173 public void testDeactivateTransactionChainManagerFailed() {
174 final Node data = new NodeBuilder().setId(nodeId).build();
175 txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
177 txChainManager.deactivateTransactionManager();
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();
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();
193 Mockito.verify(txChain).newReadWriteTransaction();
194 Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data);
195 Mockito.verify(writeTx).commit();
199 public void testClose() {
200 txChainManager.shuttingDown();
201 txChainManager.close();
202 Mockito.verify(txChain).close();