1196679a255c7fcd60ce2d035989ac48e00c1757
[ovsdb.git] / southbound / southbound-impl / src / test / java / org / opendaylight / ovsdb / southbound / transactions / md / TransactionInvokerImplTest.java
1 /*
2  * Copyright (c) 2015 Inocybe Technologies 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.ovsdb.southbound.transactions.md;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.verify;
18 import static org.powermock.reflect.Whitebox.getInternalState;
19
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Queue;
26 import java.util.concurrent.ExecutorService;
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.junit.runner.RunWith;
30 import org.mockito.Mock;
31 import org.mockito.junit.MockitoJUnitRunner;
32 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
33 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
34 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
35 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
36 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
37
38 @RunWith(MockitoJUnitRunner.class)
39 public class TransactionInvokerImplTest {
40     @Mock
41     private BindingTransactionChain chain;
42     @Mock
43     private DataBroker db;
44
45     @Before
46     public void setUp() {
47         doReturn(chain).when(db).createTransactionChain(any(TransactionChainListener.class));
48         doNothing().when(chain).close();
49     }
50
51     @Test
52     public void testConstructor() throws InterruptedException {
53         try (TransactionInvokerImpl invoker = new TransactionInvokerImpl(db)) {
54             verify(db).createTransactionChain(any(TransactionChainListener.class));
55             assertNotNull(getInternalState(invoker, "executor"));
56         }
57     }
58
59     @Test
60     public void testInvoke() {
61         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, new ArrayList<>());
62         final TransactionCommand command = mock(TransactionCommand.class);
63         invoker.invoke(command);
64
65         Queue<TransactionCommand> inputQueue = getInternalState(invoker, "inputQueue");
66         assertEquals(1, inputQueue.size());
67         assertTrue(inputQueue.contains(command));
68     }
69
70     @Test
71     public void testOnTransactionChainFailed() {
72         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, new ArrayList<>());
73
74         final AsyncTransaction<?, ?> transaction = mock(AsyncTransaction.class);
75         invoker.onTransactionChainFailed(chain, transaction, new Throwable());
76
77         final Queue<?> failedQueue = getInternalState(invoker, "failedTransactionQueue");
78         assertEquals(1, failedQueue.size());
79         assertTrue(failedQueue.contains(transaction));
80     }
81
82     @Test
83     public void testExtractResubmitCommands() {
84         final ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
85         final ReadWriteTransaction tx1 = mock(ReadWriteTransaction.class);
86         final ReadWriteTransaction tx2 = mock(ReadWriteTransaction.class);
87
88         final List<ReadWriteTransaction> pendingTransactions = new ArrayList<>();
89         pendingTransactions.add(tx1);
90         pendingTransactions.add(transaction);
91         pendingTransactions.add(tx2);
92
93         final Map<ReadWriteTransaction,TransactionCommand> transactionToCommand = new HashMap<>();
94         final TransactionCommand txCommand = mock(TransactionCommand.class);
95         transactionToCommand.put(tx1, mock(TransactionCommand.class));
96         transactionToCommand.put(tx2, mock(TransactionCommand.class));
97         transactionToCommand.put(transaction, txCommand);
98
99         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, pendingTransactions,
100             Collections.singletonList(transaction), transactionToCommand);
101
102         assertEquals(Collections.singletonList(txCommand), invoker.extractResubmitCommands());
103     }
104
105     @Test
106     public void testResetTransactionQueue() {
107         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList(),
108             Collections.singletonList(mock(ReadWriteTransaction.class)), Collections.emptyMap());
109
110         invoker.resetTransactionQueue();
111
112         assertNotNull(getInternalState(invoker, "pendingTransactions"));
113         assertNotNull(getInternalState(invoker, "transactionToCommand"));
114         final Queue<?> failedTransactionQueue = getInternalState(invoker, "failedTransactionQueue");
115         assertEquals(0, failedTransactionQueue.size());
116     }
117
118     @Test
119     public void testRecordPendingTransaction() {
120         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList());
121
122         final TransactionCommand command = mock(TransactionCommand.class);
123         final ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
124         invoker.recordPendingTransaction(command, transaction);
125
126         List<ReadWriteTransaction> testPendingTransactions = getInternalState(invoker, "pendingTransactions");
127         assertEquals(1, testPendingTransactions.size());
128         assertTrue(testPendingTransactions.contains(transaction));
129
130         assertEquals(Collections.singletonMap(transaction, command), getInternalState(invoker, "transactionToCommand"));
131     }
132
133     @Test
134     public void testExtractCommands() throws InterruptedException {
135         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList());
136
137         final TransactionCommand command = mock(TransactionCommand.class);
138         invoker.invoke(command);
139
140         assertEquals(Collections.singletonList(command), invoker.extractCommands());
141     }
142
143     @Test
144     public void testExtractCommandsFromQueue() throws InterruptedException {
145         final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList());
146
147         final TransactionCommand command = mock(TransactionCommand.class);
148         invoker.invoke(command);
149
150         assertEquals(Collections.singletonList(command), invoker.extractCommandsFromQueue());
151     }
152
153     @Test
154     public void testClose() throws InterruptedException {
155         final ExecutorService executor = mock(ExecutorService.class);
156         doNothing().when(executor).shutdown();
157
158         try (TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, executor)) {
159             // No-op, but invokes close
160         }
161
162         verify(executor).shutdown();
163     }
164 }