Upgrade powermock to 2.0.0
[ovsdb.git] / southbound / southbound-impl / src / test / java / org / opendaylight / ovsdb / southbound / reconciliation / configuration / BridgeConfigReconciliationTaskTest.java
1 /*
2  * Copyright © 2016, 2017 NEC Corporation 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 package org.opendaylight.ovsdb.southbound.reconciliation.configuration;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.spy;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.CheckedFuture;
20 import com.google.common.util.concurrent.Futures;
21 import java.util.ArrayList;
22 import java.util.Collections;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mock;
30 import org.mockito.Mockito;
31 import org.mockito.runners.MockitoJUnitRunner;
32 import org.mockito.stubbing.Answer;
33 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
34 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
35 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
36 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
37 import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
38 import org.opendaylight.ovsdb.southbound.OvsdbConnectionInstance;
39 import org.opendaylight.ovsdb.southbound.OvsdbConnectionManager;
40 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
41 import org.opendaylight.ovsdb.southbound.reconciliation.ReconciliationManager;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolBase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeProtocolOpenflow10;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntry;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryKey;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
56 import org.opendaylight.yangtools.yang.binding.DataObject;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
59
60 @RunWith(MockitoJUnitRunner.class)
61 public class BridgeConfigReconciliationTaskTest {
62     private static final String BR01 = "br01";
63     private static final String BR02 = "br02";
64     private static final String NODE_ID = "ovsdb://uuid/6ff3d0cf-4102-429d-b41c-f8027a0fd7f4";
65     private BridgeConfigReconciliationTask configurationReconciliationTask;
66     @Mock private OvsdbConnectionManager ovsdbConnectionManager;
67     @Mock private OvsdbConnectionInstance ovsdbConnectionInstance;
68     @Mock private DataBroker db;
69     @Mock private ReconciliationManager reconciliationManager;
70     @Mock private Topology topology;
71     @Mock private InstanceIdentifier<Node> iid;
72
73     @Before
74     public void setUp() throws Exception {
75         NodeKey nodeKey = new NodeKey(new NodeId(new Uri(NODE_ID)));
76         List<Node> bridgeNodes = new ArrayList<>();
77
78
79         when(topology.getNode()).thenReturn(bridgeNodes);
80
81         Optional<Topology> topologyOptional = Optional.of(topology);
82         CheckedFuture<Optional<Topology>, ReadFailedException> readTopologyFuture =
83                 Futures.immediateCheckedFuture(topologyOptional);
84
85         when(reconciliationManager.getDb()).thenReturn(db);
86         ReadOnlyTransaction tx = mock(ReadOnlyTransaction.class);
87         Mockito.when(db.newReadOnlyTransaction()).thenReturn(tx);
88         Mockito.when(tx.read(any(LogicalDatastoreType.class),any(InstanceIdentifier.class)))
89                 .thenReturn(readTopologyFuture);
90
91         when(topology.getNode()).thenReturn(bridgeNodes);
92         when(ovsdbConnectionInstance.getNodeKey()).thenReturn(nodeKey);
93         bridgeNodes.add(createBridgeNode(BR01));
94         bridgeNodes.add(createBridgeNode(BR02));
95
96         configurationReconciliationTask =
97                 new BridgeConfigReconciliationTask(reconciliationManager, ovsdbConnectionManager, iid,
98                         ovsdbConnectionInstance, mock(InstanceIdentifierCodec.class));
99     }
100
101     @Test
102     public void testReconcileConfiguration() throws Exception {
103         BridgeConfigReconciliationTask underTest = spy(configurationReconciliationTask);
104         doNothing().when(underTest).reconcileBridgeConfigurations(any(Map.class));
105         assertTrue(underTest.reconcileConfiguration(ovsdbConnectionManager));
106         Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>();
107         for (Node bridgeNode : topology.getNode()) {
108             changes.putAll(createExpectedConfigurationChanges(bridgeNode));
109         }
110         verify(underTest).reconcileBridgeConfigurations(changes);
111     }
112
113     private Node createBridgeNode(final String bridgeName) {
114         Node bridgeNode = mock(Node.class);
115         String nodeString = ovsdbConnectionInstance.getNodeKey().getNodeId().getValue()
116                 + "/bridge/" + bridgeName;
117         when(bridgeNode.getNodeId()).thenReturn(new NodeId(new Uri(nodeString)));
118         OvsdbBridgeAugmentation ovsdbBridgeAugmentation = mock(OvsdbBridgeAugmentation.class);
119         OvsdbNodeRef ovsdbNodeRef = mock(OvsdbNodeRef.class);
120
121         when((InstanceIdentifier<Node>)ovsdbNodeRef.getValue()).thenReturn(iid);
122         OvsdbBridgeName ovsdbBridgeName = new OvsdbBridgeName(bridgeName);
123         when(bridgeNode.augmentation(OvsdbBridgeAugmentation.class)).thenReturn(ovsdbBridgeAugmentation);
124         ProtocolEntry protocolEntry = mock(ProtocolEntry.class);
125         ProtocolEntryKey protocolEntryKey = mock(ProtocolEntryKey.class);
126         Mockito.when(protocolEntry.getProtocol()).thenAnswer(
127                 (Answer<Class<? extends OvsdbBridgeProtocolBase>>) invocation -> OvsdbBridgeProtocolOpenflow10.class);
128         when(protocolEntry.key()).thenReturn(protocolEntryKey);
129         when(ovsdbBridgeAugmentation.getProtocolEntry()).thenReturn(Collections.singletonList(protocolEntry));
130
131         ControllerEntry controllerEntry = mock(ControllerEntry.class);
132         ControllerEntryKey controllerEntryKey = mock(ControllerEntryKey.class);
133         when(controllerEntry.key()).thenReturn(controllerEntryKey);
134         when(ovsdbBridgeAugmentation.getControllerEntry()).thenReturn(Collections.singletonList(controllerEntry));
135
136         when(ovsdbBridgeAugmentation.getManagedBy()).thenReturn(ovsdbNodeRef);
137
138         return bridgeNode;
139     }
140
141     private Map<InstanceIdentifier<?>, DataObject> createExpectedConfigurationChanges(final Node bridgeNode) {
142         OvsdbBridgeAugmentation ovsdbBridge = bridgeNode.augmentation(OvsdbBridgeAugmentation.class);
143
144         Map<InstanceIdentifier<?>, DataObject> changes = new HashMap<>();
145         final InstanceIdentifier<Node> bridgeNodeIid =
146                 SouthboundMapper.createInstanceIdentifier(bridgeNode.getNodeId());
147         final InstanceIdentifier<OvsdbBridgeAugmentation> ovsdbBridgeIid =
148                 bridgeNodeIid.builder().augmentation(OvsdbBridgeAugmentation.class).build();
149         changes.put(bridgeNodeIid, bridgeNode);
150         changes.put(ovsdbBridgeIid, ovsdbBridge);
151         for (ProtocolEntry protocolEntry : ovsdbBridge.getProtocolEntry()) {
152             KeyedInstanceIdentifier<ProtocolEntry, ProtocolEntryKey> protocolIid =
153                     ovsdbBridgeIid.child(ProtocolEntry.class, protocolEntry.key());
154             changes.put(protocolIid, protocolEntry);
155         }
156         for (ControllerEntry controller : ovsdbBridge.getControllerEntry()) {
157             KeyedInstanceIdentifier<ControllerEntry, ControllerEntryKey> controllerIid =
158                     ovsdbBridgeIid.child(ControllerEntry.class, controller.key());
159             changes.put(controllerIid, controller);
160         }
161         return changes;
162     }
163 }