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
9 package org.opendaylight.ovsdb.southbound.transactions.md;
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.List;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mockito;
27 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
28 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
29 import org.opendaylight.ovsdb.lib.message.TableUpdates;
30 import org.opendaylight.ovsdb.lib.notation.Column;
31 import org.opendaylight.ovsdb.lib.notation.UUID;
32 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
33 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
34 import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
35 import org.opendaylight.ovsdb.schema.openvswitch.Controller;
36 import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
37 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
38 import org.opendaylight.ovsdb.southbound.SouthboundUtil;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
51 import org.powermock.api.mockito.PowerMockito;
52 import org.powermock.api.support.membermodification.MemberMatcher;
53 import org.powermock.api.support.membermodification.MemberModifier;
54 import org.powermock.core.classloader.annotations.PrepareForTest;
55 import org.powermock.modules.junit4.PowerMockRunner;
56 import org.powermock.reflect.Whitebox;
58 import com.google.common.base.Optional;
60 @PrepareForTest({OvsdbControllerUpdateCommand.class, SouthboundMapper.class, SouthboundUtil.class, InstanceIdentifier.class})
61 @RunWith(PowerMockRunner.class)
62 public class OvsdbControllerUpdateCommandTest {
63 private Map<UUID, Controller> updatedControllerRows;
64 private Map<UUID, Bridge> updatedBridgeRows;
65 private OvsdbControllerUpdateCommand ovsdbControllerUpdateCommand;
67 private static final String BRIDGE_NAME = "br-int";
68 private static final String NODE_ID = "OF|00:00:00:0c:29:70:45:9b";
72 ovsdbControllerUpdateCommand = PowerMockito.mock(OvsdbControllerUpdateCommand.class, Mockito.CALLS_REAL_METHODS);
76 public void testOvsdbControllerUpdateCommand() {
77 OvsdbConnectionInstance key = mock(OvsdbConnectionInstance.class);
78 TableUpdates updates = mock(TableUpdates.class);
79 DatabaseSchema dbSchema = mock(DatabaseSchema.class);
80 OvsdbControllerUpdateCommand ovsdbControllerUpdateCommand1 = new OvsdbControllerUpdateCommand(key, updates, dbSchema);
81 assertEquals(key, Whitebox.getInternalState(ovsdbControllerUpdateCommand1, "key"));
82 assertEquals(updates, Whitebox.getInternalState(ovsdbControllerUpdateCommand1, "updates"));
83 assertEquals(dbSchema, Whitebox.getInternalState(ovsdbControllerUpdateCommand1, "dbSchema"));
87 public void testExecute() throws Exception {
88 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
89 updatedControllerRows = new HashMap<UUID, Controller>();
90 updatedControllerRows.put(mock(UUID.class), mock(Controller.class));
91 MemberModifier.field(OvsdbControllerUpdateCommand.class, "updatedControllerRows").set(ovsdbControllerUpdateCommand, updatedControllerRows);
92 MemberModifier.suppress(MemberMatcher.method(OvsdbControllerUpdateCommand.class, "updateController", ReadWriteTransaction.class, Map.class, Map.class));
93 MemberModifier.suppress(MemberMatcher.method(OvsdbControllerUpdateCommand.class, "updateController", ReadWriteTransaction.class, Map.class));
95 //updatedBridgeRows null case
96 ovsdbControllerUpdateCommand.execute(transaction);
97 PowerMockito.verifyPrivate(ovsdbControllerUpdateCommand).invoke("updateController", any(ReadWriteTransaction.class), any(Map.class));
99 //updatedBridgeRows not null case
100 updatedBridgeRows = new HashMap<UUID, Bridge>();
101 updatedBridgeRows.put(mock(UUID.class), mock(Bridge.class));
102 MemberModifier.field(OvsdbControllerUpdateCommand.class, "updatedBridgeRows").set(ovsdbControllerUpdateCommand, updatedBridgeRows);
105 @SuppressWarnings("unchecked")
107 public void testUpdateController1() throws Exception {
108 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
109 Map<UUID, Controller> updatedControllerRows = new HashMap<>();
110 Map<UUID, Bridge> updatedBridgeRows = new HashMap<>();
111 Bridge bridge = mock(Bridge.class);
112 updatedBridgeRows.put(mock(UUID.class), bridge);
114 PowerMockito.mockStatic(SouthboundMapper.class);
115 List<ControllerEntry> controllerEntries = new ArrayList<ControllerEntry>();
116 controllerEntries.add(mock(ControllerEntry.class));
117 when(SouthboundMapper.createControllerEntries(any(Bridge.class), any(Map.class))).thenReturn(controllerEntries);
118 Column<GenericTableSchema, String> column = mock(Column.class);
119 when(bridge.getNameColumn()).thenReturn(column);
120 when(column.getData()).thenReturn(BRIDGE_NAME);
122 //suppress call to getControllerEntryIid()
123 MemberModifier.suppress(MemberMatcher.method(OvsdbControllerUpdateCommand.class, "getControllerEntryIid", ControllerEntry.class, String.class));
124 doNothing().when(transaction).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(ControllerEntry.class));
125 Whitebox.invokeMethod(ovsdbControllerUpdateCommand, "updateController", transaction, updatedControllerRows, updatedBridgeRows);
126 verify(transaction).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(ControllerEntry.class));
127 verify(bridge).getNameColumn();
130 @SuppressWarnings("unchecked")
132 public void testUpdateController2() throws Exception {
133 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
134 Map<UUID, Controller> updatedControllerRows = new HashMap<>();
135 Map<InstanceIdentifier<Node>, Node> bridgeNodes = new HashMap<>();
136 Node node = mock(Node.class);
137 InstanceIdentifier<Node> bridgeIid = mock(InstanceIdentifier.class);
138 bridgeNodes.put(bridgeIid, node);
139 PowerMockito.doReturn(bridgeNodes).when(ovsdbControllerUpdateCommand, "getBridgeNodes", any(ReadWriteTransaction.class));
141 Whitebox.invokeMethod(ovsdbControllerUpdateCommand, "updateController", transaction, updatedControllerRows);
142 PowerMockito.verifyPrivate(ovsdbControllerUpdateCommand).invoke("getBridgeNodes", any(ReadWriteTransaction.class));
145 @SuppressWarnings("unchecked")
147 public void testGetBridgeNodes() throws Exception {
148 ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
150 Map<InstanceIdentifier<Node>, Node> testBridgeNodes = new HashMap<>();
151 OvsdbConnectionInstance ovsdbConnectionInstance = mock(OvsdbConnectionInstance.class);
152 when(ovsdbControllerUpdateCommand.getOvsdbConnectionInstance()).thenReturn(ovsdbConnectionInstance);
153 InstanceIdentifier<Node> connectionIId = mock(InstanceIdentifier.class);
154 when(ovsdbConnectionInstance.getInstanceIdentifier()).thenReturn(connectionIId);
155 PowerMockito.mockStatic(SouthboundUtil.class);
156 Optional<Node> ovsdbNode = mock(Optional.class);
157 when(SouthboundUtil.readNode(transaction, connectionIId)).thenReturn(ovsdbNode);
158 when(ovsdbNode.isPresent()).thenReturn(true);
159 Node node = mock(Node.class);
160 when(ovsdbNode.get()).thenReturn(node);
161 OvsdbNodeAugmentation ovsdbNodeAugmentation = mock(OvsdbNodeAugmentation.class);
162 when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(ovsdbNodeAugmentation);
164 List<ManagedNodeEntry> managedNodeEntries = new ArrayList<>();
165 ManagedNodeEntry managedNodeEntry = mock(ManagedNodeEntry.class);
166 managedNodeEntries.add(managedNodeEntry);
167 when(ovsdbNodeAugmentation.getManagedNodeEntry()).thenReturn(managedNodeEntries);
168 InstanceIdentifier<Node> bridgeIid = mock(InstanceIdentifier.class);
169 OvsdbBridgeRef ovsdbBridgeRef = mock(OvsdbBridgeRef.class);
170 when(managedNodeEntry.getBridgeRef()).thenReturn(ovsdbBridgeRef);
171 when((InstanceIdentifier<Node>) ovsdbBridgeRef.getValue()).thenReturn(bridgeIid);
172 Optional<Node> bridgeNode = mock(Optional.class);
173 when(SouthboundUtil.readNode(transaction, bridgeIid)).thenReturn(bridgeNode);
174 when(bridgeNode.isPresent()).thenReturn(true);
175 when(bridgeNode.get()).thenReturn(node);
177 testBridgeNodes.put(bridgeIid, node);
179 //verify if getBridgeNodes() returns expected value
180 assertEquals(testBridgeNodes, Whitebox.invokeMethod(ovsdbControllerUpdateCommand, "getBridgeNodes", transaction));
184 public void testGetControllerEntryIid() throws Exception {
185 ControllerEntry controllerEntry = mock(ControllerEntry.class);
186 OvsdbConnectionInstance client = mock(OvsdbConnectionInstance.class);
187 when(ovsdbControllerUpdateCommand.getOvsdbConnectionInstance()).thenReturn(client);
188 NodeKey nodeKey = mock(NodeKey.class);
189 when(client.getNodeKey()).thenReturn(nodeKey);
190 NodeId nodeId = mock(NodeId.class);
191 when(nodeKey.getNodeId()).thenReturn(nodeId);
192 when(nodeId.getValue()).thenReturn(NODE_ID);
193 PowerMockito.whenNew(Uri.class).withAnyArguments().thenReturn(mock(Uri.class));
194 PowerMockito.whenNew(NodeId.class).withAnyArguments().thenReturn(nodeId);
195 PowerMockito.whenNew(NodeKey.class).withAnyArguments().thenReturn(nodeKey);
196 PowerMockito.whenNew(TopologyKey.class).withAnyArguments().thenReturn(mock(TopologyKey.class));
197 //PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(InstanceIdentifier.class));
198 when(controllerEntry.getKey()).thenReturn(mock(ControllerEntryKey.class));
199 assertEquals(KeyedInstanceIdentifier.class, (Whitebox.invokeMethod(ovsdbControllerUpdateCommand, "getControllerEntryIid", controllerEntry, BRIDGE_NAME).getClass()));