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