2 * Copyright (c) 2015 Inocybe Technologies 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.ovsdb.southbound.transactions.md;
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;
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.HashMap;
23 import java.util.List;
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;
38 @RunWith(MockitoJUnitRunner.class)
39 public class TransactionInvokerImplTest {
41 private BindingTransactionChain chain;
43 private DataBroker db;
47 doReturn(chain).when(db).createTransactionChain(any(TransactionChainListener.class));
48 doNothing().when(chain).close();
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"));
60 public void testInvoke() {
61 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, new ArrayList<>());
62 final TransactionCommand command = mock(TransactionCommand.class);
63 invoker.invoke(command);
65 Queue<TransactionCommand> inputQueue = getInternalState(invoker, "inputQueue");
66 assertEquals(1, inputQueue.size());
67 assertTrue(inputQueue.contains(command));
71 public void testOnTransactionChainFailed() {
72 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, new ArrayList<>());
74 final AsyncTransaction<?, ?> transaction = mock(AsyncTransaction.class);
75 invoker.onTransactionChainFailed(chain, transaction, new Throwable());
77 final Queue<?> failedQueue = getInternalState(invoker, "failedTransactionQueue");
78 assertEquals(1, failedQueue.size());
79 assertTrue(failedQueue.contains(transaction));
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);
88 final List<ReadWriteTransaction> pendingTransactions = new ArrayList<>();
89 pendingTransactions.add(tx1);
90 pendingTransactions.add(transaction);
91 pendingTransactions.add(tx2);
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);
99 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, pendingTransactions,
100 Collections.singletonList(transaction), transactionToCommand);
102 assertEquals(Collections.singletonList(txCommand), invoker.extractResubmitCommands());
106 public void testResetTransactionQueue() {
107 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList(),
108 Collections.singletonList(mock(ReadWriteTransaction.class)), Collections.emptyMap());
110 invoker.resetTransactionQueue();
112 assertNotNull(getInternalState(invoker, "pendingTransactions"));
113 assertNotNull(getInternalState(invoker, "transactionToCommand"));
114 final Queue<?> failedTransactionQueue = getInternalState(invoker, "failedTransactionQueue");
115 assertEquals(0, failedTransactionQueue.size());
119 public void testRecordPendingTransaction() {
120 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList());
122 final TransactionCommand command = mock(TransactionCommand.class);
123 final ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
124 invoker.recordPendingTransaction(command, transaction);
126 List<ReadWriteTransaction> testPendingTransactions = getInternalState(invoker, "pendingTransactions");
127 assertEquals(1, testPendingTransactions.size());
128 assertTrue(testPendingTransactions.contains(transaction));
130 assertEquals(Collections.singletonMap(transaction, command), getInternalState(invoker, "transactionToCommand"));
134 public void testExtractCommands() throws InterruptedException {
135 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList());
137 final TransactionCommand command = mock(TransactionCommand.class);
138 invoker.invoke(command);
140 assertEquals(Collections.singletonList(command), invoker.extractCommands());
144 public void testExtractCommandsFromQueue() throws InterruptedException {
145 final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, Collections.emptyList());
147 final TransactionCommand command = mock(TransactionCommand.class);
148 invoker.invoke(command);
150 assertEquals(Collections.singletonList(command), invoker.extractCommandsFromQueue());
154 public void testClose() throws InterruptedException {
155 final ExecutorService executor = mock(ExecutorService.class);
156 doNothing().when(executor).shutdown();
158 try (TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, executor)) {
159 // No-op, but invokes close
162 verify(executor).shutdown();