Fix codestyle
[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
9 package org.opendaylight.openflowplugin.impl.device;
10
11 import com.google.common.base.Optional;
12 import com.google.common.util.concurrent.CheckedFuture;
13 import com.google.common.util.concurrent.Futures;
14 import io.netty.util.HashedWheelTimer;
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.Matchers;
20 import org.mockito.Mock;
21 import org.mockito.Mockito;
22 import org.mockito.runners.MockitoJUnitRunner;
23 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
26 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
27 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
28 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
29 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
30 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
31 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
32 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
33 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
34 import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
35 import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
41 import org.opendaylight.yangtools.concepts.Registration;
42 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
43 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
44
45 @RunWith(MockitoJUnitRunner.class)
46 public class TransactionChainManagerTest {
47
48     @Mock
49     private DataBroker dataBroker;
50     @Mock
51     private BindingTransactionChain txChain;
52     @Mock
53     private WriteTransaction writeTx;
54     @Mock
55     private TransactionChain<?, ?> transactionChain;
56     @Mock
57     HashedWheelTimer timer;
58     @Mock
59     Registration registration;
60     @Mock
61     DeviceState deviceState;
62     @Mock
63     DeviceInfo deviceInfo;
64
65     @Mock
66     private KeyedInstanceIdentifier<Node, NodeKey> nodeKeyIdent;
67
68     private TransactionChainManager txChainManager;
69     private InstanceIdentifier<Node> path;
70     private NodeId nodeId;
71
72     @Before
73     public void setUp() throws Exception {
74         final ReadOnlyTransaction readOnlyTx = Mockito.mock(ReadOnlyTransaction.class);
75         final CheckedFuture<Optional<Node>, ReadFailedException> noExistNodeFuture =
76                 Futures.immediateCheckedFuture(Optional.<Node>absent());
77         Mockito.when(readOnlyTx.read(LogicalDatastoreType.OPERATIONAL, nodeKeyIdent)).thenReturn(noExistNodeFuture);
78         Mockito.when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTx);
79         Mockito.when(dataBroker.createTransactionChain(Matchers.any(TransactionChainListener.class)))
80                 .thenReturn(txChain);
81         nodeId = new NodeId("h2g2:42");
82         nodeKeyIdent = DeviceStateUtil.createNodeInstanceIdentifier(nodeId);
83         Mockito.when(deviceInfo.getNodeInstanceIdentifier()).thenReturn(nodeKeyIdent);
84         Mockito.when(deviceInfo.getNodeId()).thenReturn(nodeId);
85         txChainManager = new TransactionChainManager(dataBroker, deviceInfo);
86         Mockito.when(txChain.newWriteOnlyTransaction()).thenReturn(writeTx);
87
88         path = InstanceIdentifier.create(Nodes.class).child(Node.class, new NodeKey(nodeId));
89         Mockito.when(writeTx.submit())
90                 .thenReturn(Futures.<Void, TransactionCommitFailedException>immediateCheckedFuture(null));
91         txChainManager.activateTransactionManager();
92     }
93
94     @After
95     public void tearDown() throws Exception {
96         Mockito.verifyNoMoreInteractions(txChain, writeTx);
97     }
98
99     @Test
100     public void testWriteToTransaction() throws Exception {
101         final Node data = new NodeBuilder().setId(nodeId).build();
102         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
103
104         Mockito.verify(txChain).newWriteOnlyTransaction();
105         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
106     }
107
108     /**
109      * Test of {@link TransactionChainManager#submitWriteTransaction()}.
110      */
111     @Test
112     public void testSubmitTransaction() throws Exception {
113         final Node data = new NodeBuilder().setId(nodeId).build();
114         txChainManager.initialSubmitWriteTransaction();
115         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
116         txChainManager.submitWriteTransaction();
117
118         Mockito.verify(txChain).newWriteOnlyTransaction();
119         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
120         Mockito.verify(writeTx).submit();
121     }
122
123     /**
124      * Test of {@link TransactionChainManager#submitWriteTransaction()}: no submit, never enabled.
125      */
126     @Test
127     public void testSubmitTransaction1() throws Exception {
128         final Node data = new NodeBuilder().setId(nodeId).build();
129         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
130         txChainManager.submitWriteTransaction();
131
132         Mockito.verify(txChain).newWriteOnlyTransaction();
133         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
134         Mockito.verify(writeTx, Mockito.never()).submit();
135     }
136
137     @Test
138     public void testSubmitTransactionFailed() throws Exception {
139         Mockito.when(writeTx.submit())
140                 .thenReturn(Futures.immediateFailedCheckedFuture(new TransactionCommitFailedException("mock")));
141         final Node data = new NodeBuilder().setId(nodeId).build();
142         txChainManager.initialSubmitWriteTransaction();
143         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
144         txChainManager.submitWriteTransaction();
145
146         Mockito.verify(txChain).newWriteOnlyTransaction();
147         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
148         Mockito.verify(writeTx).submit();
149     }
150
151     @Test
152     public void testSubmitTransactionFailed2() throws Exception {
153         final Node data = new NodeBuilder().setId(nodeId).build();
154         txChainManager.initialSubmitWriteTransaction();
155         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
156         txChainManager.submitWriteTransaction();
157
158         Mockito.when(writeTx.submit())
159                 .thenReturn(Futures.immediateFailedCheckedFuture(new TransactionCommitFailedException("mock")));
160         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
161         txChainManager.submitWriteTransaction();
162
163         Mockito.verify(txChain, Mockito.times(2)).newWriteOnlyTransaction();
164         Mockito.verify(writeTx, Mockito.times(2)).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
165         Mockito.verify(writeTx, Mockito.times(2)).submit();
166     }
167
168     /**
169      * Test of {@link TransactionChainManager#enableSubmit()}: no submit - counter is not active.
170      */
171     @Test
172     public void testEnableCounter1() throws Exception {
173         final Node data = new NodeBuilder().setId(nodeId).build();
174         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
175         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
176
177         Mockito.verify(txChain).newWriteOnlyTransaction();
178         Mockito.verify(writeTx, Mockito.times(2)).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
179         Mockito.verify(writeTx, Mockito.never()).submit();
180     }
181
182     @Test
183     public void testOnTransactionChainFailed() throws Exception {
184         txChainManager.onTransactionChainFailed(transactionChain,
185                 Mockito.mock(AsyncTransaction.class), Mockito.mock(Throwable.class));
186         Mockito.verify(txChain).close();
187         Mockito.verify(dataBroker, Mockito.times(2)).createTransactionChain(txChainManager);
188     }
189
190     @Test
191     public void testOnTransactionChainSuccessful() throws Exception {
192         txChainManager.onTransactionChainSuccessful(transactionChain);
193         // NOOP
194         Mockito.verifyZeroInteractions(transactionChain);
195     }
196
197     @Test
198     public void testAddDeleteOperationTotTxChain() throws Exception {
199         txChainManager.addDeleteOperationTotTxChain(LogicalDatastoreType.CONFIGURATION, path);
200
201         Mockito.verify(txChain).newWriteOnlyTransaction();
202         Mockito.verify(writeTx).delete(LogicalDatastoreType.CONFIGURATION, path);
203     }
204
205     @Test
206     public void testDeactivateTransactionChainManager() throws Exception {
207         txChainManager.deactivateTransactionManager();
208
209         Mockito.verify(txChain).close();
210     }
211
212     @Test
213     public void testDeactivateTransactionChainManagerFailed() throws Exception {
214         Mockito.when(writeTx.submit())
215                 .thenReturn(Futures.<Void, TransactionCommitFailedException>immediateFailedCheckedFuture(
216                         new TransactionCommitFailedException("mock")));
217         final Node data = new NodeBuilder().setId(nodeId).build();
218         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
219
220         txChainManager.deactivateTransactionManager();
221
222         Mockito.verify(txChain).newWriteOnlyTransaction();
223         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
224         Mockito.verify(writeTx, Mockito.never()).submit();
225         Mockito.verify(writeTx).cancel();
226         Mockito.verify(txChain).close();
227     }
228
229     @Test
230     public void testShuttingDown() throws Exception {
231         final Node data = new NodeBuilder().setId(nodeId).build();
232         txChainManager.writeToTransaction(LogicalDatastoreType.CONFIGURATION, path, data, false);
233         txChainManager.enableSubmit();
234         txChainManager.shuttingDown();
235
236         Mockito.verify(txChain).newWriteOnlyTransaction();
237         Mockito.verify(writeTx).put(LogicalDatastoreType.CONFIGURATION, path, data, false);
238         Mockito.verify(writeTx).submit();
239     }
240
241     @Test
242     public void testClose() {
243         txChainManager.shuttingDown();
244         txChainManager.close();
245         Mockito.verify(txChain).close();
246     }
247 }