Merge "Mechanical cleanup to SouthboundIT"
[ovsdb.git] / southbound / southbound-impl / src / test / java / org / opendaylight / ovsdb / southbound / OvsdbDataChangeListenerTest.java
1 package org.opendaylight.ovsdb.southbound;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.mockito.Mockito.doNothing;
5 import static org.mockito.Mockito.mock;
6 import static org.mockito.Mockito.times;
7 import static org.mockito.Mockito.verify;
8 import static org.mockito.Matchers.any;
9 import static org.mockito.Mockito.when;
10 import static org.mockito.Mockito.reset;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
18
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.Mock;
23 import org.mockito.Mockito;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
26 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
27 import org.opendaylight.ovsdb.lib.OvsdbClient;
28 import org.opendaylight.ovsdb.southbound.ovsdb.transact.BridgeOperationalState;
29 import org.opendaylight.ovsdb.southbound.ovsdb.transact.DataChangesManagedByOvsdbNodeEvent;
30 import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactCommandAggregator;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
37 import org.opendaylight.yangtools.concepts.ListenerRegistration;
38 import org.opendaylight.yangtools.yang.binding.DataObject;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.powermock.api.mockito.PowerMockito;
41 import org.powermock.api.support.membermodification.MemberMatcher;
42 import org.powermock.api.support.membermodification.MemberModifier;
43 import org.powermock.core.classloader.annotations.PrepareForTest;
44 import org.powermock.modules.junit4.PowerMockRunner;
45 import org.powermock.reflect.Whitebox;
46
47 @PrepareForTest({InstanceIdentifier.class, OvsdbDataChangeListener.class, SouthboundMapper.class})
48 @RunWith(PowerMockRunner.class)
49 public class OvsdbDataChangeListenerTest {
50     @Mock private ListenerRegistration<DataChangeListener> registration;
51     @Mock private OvsdbConnectionManager cm;
52     @Mock private DataBroker db;
53     @Mock private OvsdbDataChangeListener ovsdbDataChangeListener;
54
55     @Before
56     public void setUp() throws Exception {
57         ovsdbDataChangeListener = PowerMockito.mock(OvsdbDataChangeListener.class, Mockito.CALLS_REAL_METHODS);
58         MemberModifier.field(OvsdbDataChangeListener.class, "cm").set(ovsdbDataChangeListener, cm);
59         MemberModifier.field(OvsdbDataChangeListener.class, "db").set(ovsdbDataChangeListener, db);
60         MemberModifier.field(OvsdbDataChangeListener.class, "registration").set(ovsdbDataChangeListener, registration);
61     }
62
63     @Test
64     public void testClose() throws Exception {
65         doNothing().when(registration).close();
66         ovsdbDataChangeListener.close();
67         verify(registration).close();
68     }
69
70     @SuppressWarnings({ "unchecked" })
71     @Test
72     public void testOnDataChanged() throws Exception {
73         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes = mock(AsyncDataChangeEvent.class);
74         Map<InstanceIdentifier<?>, DataObject> map = new HashMap<InstanceIdentifier<?>, DataObject>();
75         InstanceIdentifier<?> iid1 = mock(InstanceIdentifier.class);
76         OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
77         map.put(iid1, ovsdbNode);
78         when(changes.getCreatedData()).thenReturn(map);
79         ConnectionInfo key = mock(ConnectionInfo.class);
80         when(ovsdbNode.getConnectionInfo()).thenReturn(key);
81
82         //suppress calls to these functions
83         MemberModifier.suppress(MemberMatcher.method(OvsdbDataChangeListener.class, "connect", AsyncDataChangeEvent.class));
84         MemberModifier.suppress(MemberMatcher.method(OvsdbDataChangeListener.class, "updateConnections", AsyncDataChangeEvent.class));
85         MemberModifier.suppress(MemberMatcher.method(OvsdbDataChangeListener.class, "updateData", AsyncDataChangeEvent.class));
86         MemberModifier.suppress(MemberMatcher.method(OvsdbDataChangeListener.class, "disconnect", AsyncDataChangeEvent.class));
87
88         //iid null case
89         when(cm.getInstanceIdentifier(any(ConnectionInfo.class))).thenReturn(null);
90         ovsdbDataChangeListener.onDataChanged(changes);
91
92         PowerMockito.verifyPrivate(ovsdbDataChangeListener, times(1)).invoke("connect", any(AsyncDataChangeEvent.class));
93         PowerMockito.verifyPrivate(ovsdbDataChangeListener, times(1)).invoke("updateConnections", any(AsyncDataChangeEvent.class));
94         PowerMockito.verifyPrivate(ovsdbDataChangeListener, times(1)).invoke("updateData", any(AsyncDataChangeEvent.class));
95         PowerMockito.verifyPrivate(ovsdbDataChangeListener, times(1)).invoke("disconnect", any(AsyncDataChangeEvent.class));
96     }
97
98     @SuppressWarnings("unchecked")
99     @Test
100     public void testUpdateData() throws Exception {
101         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes = mock(AsyncDataChangeEvent.class);
102         Map<InstanceIdentifier<Node>, OvsdbConnectionInstance> map = new HashMap<InstanceIdentifier<Node>, OvsdbConnectionInstance>();
103         InstanceIdentifier<Node> iid = mock(InstanceIdentifier.class);
104         OvsdbConnectionInstance connectionInstance = mock(OvsdbConnectionInstance.class);
105         map.put(iid, connectionInstance);
106
107         MemberModifier.suppress(MemberMatcher.method(OvsdbDataChangeListener.class, "connectionInstancesFromChanges", AsyncDataChangeEvent.class));
108         when(ovsdbDataChangeListener.connectionInstancesFromChanges(any(AsyncDataChangeEvent.class))).thenReturn(map);
109         TransactCommandAggregator transactCommandAggregator = mock(TransactCommandAggregator.class);
110         BridgeOperationalState bridgeOperationalState = mock(BridgeOperationalState.class);
111         DataChangesManagedByOvsdbNodeEvent dataChangesManagedByOvsdbNodeEvent = mock(DataChangesManagedByOvsdbNodeEvent.class);
112         PowerMockito.whenNew(DataChangesManagedByOvsdbNodeEvent.class).withArguments(any(InstanceIdentifier.class), any(AsyncDataChangeEvent.class)).thenReturn(dataChangesManagedByOvsdbNodeEvent);
113         PowerMockito.whenNew(BridgeOperationalState.class).withArguments(any(DataBroker.class), any(AsyncDataChangeEvent.class)).thenReturn(bridgeOperationalState);
114         PowerMockito.whenNew(TransactCommandAggregator.class).withArguments(any(BridgeOperationalState.class), any(AsyncDataChangeEvent.class)).thenReturn(transactCommandAggregator);
115
116         when(connectionInstance.getInstanceIdentifier()).thenReturn(iid);
117         doNothing().when(connectionInstance).transact(transactCommandAggregator);
118
119         Whitebox.invokeMethod(ovsdbDataChangeListener, "updateData", changes);
120         verify(connectionInstance).transact(transactCommandAggregator);
121         verify(ovsdbDataChangeListener).connectionInstancesFromChanges(changes);
122     }
123
124     @SuppressWarnings({ "rawtypes", "unchecked" })
125     @Test
126     public void testDisconnectAndConnectAndInit() throws Exception {
127         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes = mock(AsyncDataChangeEvent.class);
128         Map<InstanceIdentifier<?>, DataObject> originalDataObject = new HashMap<InstanceIdentifier<?>, DataObject>();
129         Set<InstanceIdentifier<?>> iiD = new HashSet<InstanceIdentifier<?>>();
130         InstanceIdentifier instanceIdentifier = mock(InstanceIdentifier.class);
131         OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
132         iiD.add(instanceIdentifier);
133         originalDataObject.put(instanceIdentifier, ovsdbNode);
134         when(changes.getRemovedPaths()).thenReturn(iiD);
135         when(changes.getOriginalData()).thenReturn(originalDataObject);
136         doNothing().when(cm).disconnect(any(OvsdbNodeAugmentation.class));
137
138         //test disconnect()
139         Whitebox.invokeMethod(ovsdbDataChangeListener, "disconnect", changes);
140         verify(cm).disconnect(any(OvsdbNodeAugmentation.class));
141
142         //test connect()
143         when(changes.getCreatedData()).thenReturn(originalDataObject);
144         Whitebox.invokeMethod(ovsdbDataChangeListener, "connect", changes);
145         verify(cm).disconnect(any(OvsdbNodeAugmentation.class));
146
147         // test init
148         /**
149          * ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
150          * when(ovsdbNode.getConnectionInfo()).thenReturn(connectionInfo);
151          * Whitebox.invokeMethod(ovsdbDataChangeListener, "init", changes);
152          * verify(cm).init(any(ConnectionInfo.class));
153          */
154     }
155
156     @SuppressWarnings({ "rawtypes", "unchecked" })
157     @Test
158     public void testUpdateConnections() throws Exception {
159         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes = mock(AsyncDataChangeEvent.class);
160         Map<InstanceIdentifier<?>, DataObject> map = new HashMap<InstanceIdentifier<?>, DataObject>();
161         InstanceIdentifier instanceIdentifier = mock(InstanceIdentifier.class);
162         OvsdbNodeAugmentation value = mock(OvsdbNodeAugmentation.class);
163         map.put(instanceIdentifier, value);
164
165         when(changes.getUpdatedData()).thenReturn(map);
166         OvsdbClient client = mock(OvsdbClient.class);
167         ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
168         when(value.getConnectionInfo()).thenReturn(connectionInfo);
169         when(cm.getClient(any(ConnectionInfo.class))).thenReturn(null);
170
171         when(changes.getOriginalData()).thenReturn(map);
172         doNothing().when(cm).disconnect(any(OvsdbNodeAugmentation.class));
173         when(cm.connect(any(InstanceIdentifier.class), any(OvsdbNodeAugmentation.class))).thenReturn(client);
174         Whitebox.invokeMethod(ovsdbDataChangeListener, "updateConnections", changes);
175         verify(cm).connect(any(InstanceIdentifier.class), any(OvsdbNodeAugmentation.class));
176         verify(cm).disconnect(any(OvsdbNodeAugmentation.class));
177     }
178
179     @SuppressWarnings("unchecked")
180     @Test
181     public void testConnectionInstancesFromChanges() throws Exception {
182         AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes = mock(AsyncDataChangeEvent.class);
183         Map<InstanceIdentifier<Node>,OvsdbConnectionInstance> testResultMap = new HashMap<InstanceIdentifier<Node>,OvsdbConnectionInstance>();
184         Map<InstanceIdentifier<Node>,OvsdbConnectionInstance> map1 = new HashMap<InstanceIdentifier<Node>,OvsdbConnectionInstance>();
185         InstanceIdentifier<Node> key1 = mock(InstanceIdentifier.class);
186         OvsdbConnectionInstance value1 = mock(OvsdbConnectionInstance.class);
187         map1.put(key1, value1);
188
189         MemberModifier.suppress(MemberMatcher.method(OvsdbDataChangeListener.class, "connectionInstancesFromMap", HashMap.class));
190         when(ovsdbDataChangeListener.connectionInstancesFromMap(any(HashMap.class))).thenReturn(map1);
191
192         testResultMap.put(key1, value1);
193         reset(ovsdbDataChangeListener);
194         assertEquals("Error returning correct Map", testResultMap, ovsdbDataChangeListener.connectionInstancesFromChanges(changes));
195         verify(ovsdbDataChangeListener, times(3)).connectionInstancesFromMap(any(HashMap.class));
196     }
197
198     @SuppressWarnings("unchecked")
199     @Test
200     public void testConnectionInstancesFromMap() {
201         reset(cm);
202         Map<InstanceIdentifier<?>,DataObject> map = new HashMap<InstanceIdentifier<?>,DataObject>();
203         Node node = mock(Node.class);
204         InstanceIdentifier<Node> iid = mock(InstanceIdentifier.class);
205         map.put(iid, node);
206         OvsdbConnectionInstance client = mock(OvsdbConnectionInstance.class);
207
208         Map<InstanceIdentifier<Node>,OvsdbConnectionInstance> testResultMap = new HashMap<InstanceIdentifier<Node>,OvsdbConnectionInstance>();
209         testResultMap.put(iid, client);
210
211         //bridge and client not null case
212         when(cm.getConnectionInstance(any(OvsdbBridgeAugmentation.class))).thenReturn(client);
213         OvsdbBridgeAugmentation bridge = mock(OvsdbBridgeAugmentation.class);
214         when(node.getAugmentation(OvsdbBridgeAugmentation.class)).thenReturn(bridge);
215         when(cm.getHasDeviceOwnership(any(ConnectionInfo.class))).thenReturn(true);
216         assertEquals("Error returning correct Map", testResultMap, ovsdbDataChangeListener.connectionInstancesFromMap(map));
217         verify(cm).getConnectionInstance(any(OvsdbBridgeAugmentation.class));
218
219         //bridge null, ovsnode not null and client not null case
220         when(node.getAugmentation(OvsdbBridgeAugmentation.class)).thenReturn(null);
221         OvsdbNodeAugmentation ovsNode = mock(OvsdbNodeAugmentation.class);
222         ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
223         when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(ovsNode);
224         when(ovsNode.getConnectionInfo()).thenReturn(connectionInfo);
225         when(cm.getConnectionInstance(any(ConnectionInfo.class))).thenReturn(client);
226         assertEquals("Error returning correct Map", testResultMap, ovsdbDataChangeListener.connectionInstancesFromMap(map));
227         verify(cm).getConnectionInstance(any(ConnectionInfo.class));
228
229         //bridge null, ovsnode null, and client not null case
230         when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(null);
231         List<TerminationPoint> terminationPoint = new ArrayList<TerminationPoint>();
232         terminationPoint.add(0, mock(TerminationPoint.class));
233         when(node.getTerminationPoint()).thenReturn(terminationPoint);
234         PowerMockito.mockStatic(SouthboundMapper.class);
235         InstanceIdentifier<Node> nodeIid = mock(InstanceIdentifier.class);
236         when(node.getNodeId()).thenReturn(mock(NodeId.class));
237         when(SouthboundMapper.createInstanceIdentifier(any(NodeId.class))).thenReturn(nodeIid);
238         when(cm.getConnectionInstance(any(InstanceIdentifier.class))).thenReturn(client);
239         assertEquals("Error returning correct Map", testResultMap, ovsdbDataChangeListener.connectionInstancesFromMap(map));
240         verify(node).getTerminationPoint();
241         verify(cm).getConnectionInstance(any(InstanceIdentifier.class));
242     }
243 }