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