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