Unit tests for OVSDB clustering
[ovsdb.git] / southbound / southbound-impl / src / test / java / org / opendaylight / ovsdb / southbound / SouthboundProviderTest.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;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Matchers.anyString;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.when;
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.ReadWriteTransaction;
26 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
27 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
28 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange;
29 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener;
30 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListenerRegistration;
31 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
32 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
33 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
34 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
35 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
36 import org.opendaylight.ovsdb.lib.OvsdbConnection;
37 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvoker;
38 import org.opendaylight.ovsdb.southbound.transactions.md.TransactionInvokerImpl;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopologyBuilder;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.powermock.api.mockito.PowerMockito;
46 import org.powermock.api.support.membermodification.MemberMatcher;
47 import org.powermock.api.support.membermodification.MemberModifier;
48 import org.powermock.core.classloader.annotations.PrepareForTest;
49 import org.powermock.modules.junit4.PowerMockRunner;
50 import org.powermock.reflect.Whitebox;
51
52 import com.google.common.base.Optional;
53 import com.google.common.util.concurrent.CheckedFuture;
54
55 @PrepareForTest({SouthboundProvider.class, InstanceIdentifier.class, LogicalDatastoreType.class})
56 @RunWith(PowerMockRunner.class)
57 public class SouthboundProviderTest {
58     @Mock private DataBroker db;
59     @Mock private OvsdbConnectionManager cm;
60     @Mock private TransactionInvoker txInvoker;
61     @Mock private OvsdbDataChangeListener ovsdbDataChangeListener;
62     @Mock private SouthboundProvider southboundProvider;
63     @Mock private EntityOwnershipService entityOwnershipService;
64     @Mock private EntityOwnershipCandidateRegistration registration;
65     @Mock private EntityOwnershipListener entityOwnershipListener;
66     @Mock private OvsdbConnection ovsdbConnection;
67
68     @Before
69     public void setUp() throws Exception {
70         southboundProvider = PowerMockito.mock(SouthboundProvider.class, Mockito.CALLS_REAL_METHODS);
71         MemberModifier.field(SouthboundProvider.class, "cm").set(southboundProvider, cm);
72         MemberModifier.field(SouthboundProvider.class, "ovsdbDataChangeListener").set(southboundProvider, ovsdbDataChangeListener);
73         MemberModifier.field(SouthboundProvider.class, "db").set(southboundProvider, db);
74         MemberModifier.field(SouthboundProvider.class, "entityOwnershipService").set(southboundProvider, entityOwnershipService);
75         MemberModifier.field(SouthboundProvider.class, "registration").set(southboundProvider, registration);
76         MemberModifier.field(SouthboundProvider.class, "ovsdbConnection").set(southboundProvider, ovsdbConnection);
77     }
78
79     @Test
80     public void testOnSessionInitiated() throws Exception {
81         ProviderContext session = mock(ProviderContext.class);
82         when(session.getSALService(DataBroker.class)).thenReturn(db);
83         TransactionInvokerImpl transactionInvokerImpl = mock(TransactionInvokerImpl.class);
84         PowerMockito.whenNew(TransactionInvokerImpl.class).withArguments(any(DataBroker.class)).thenReturn(transactionInvokerImpl);
85         PowerMockito.whenNew(OvsdbConnectionManager.class).withArguments(any(DataBroker.class), any(TransactionInvoker.class), any(EntityOwnershipService.class), any(OvsdbConnection.class)).thenReturn(cm);
86         PowerMockito.whenNew(OvsdbDataChangeListener.class).withArguments(any(DataBroker.class), any(OvsdbConnectionManager.class)).thenReturn(ovsdbDataChangeListener);
87
88         when(entityOwnershipService.registerListener(anyString(), any(EntityOwnershipListener.class))).thenReturn(mock(EntityOwnershipListenerRegistration.class));
89         when(entityOwnershipService.registerCandidate(any(Entity.class))).thenReturn(registration);
90         EntityOwnershipState entityOwnershipState = mock(EntityOwnershipState.class);
91         when(entityOwnershipService.getOwnershipState(any(Entity.class))).thenReturn(Optional.of(entityOwnershipState));
92
93         southboundProvider.onSessionInitiated(session);
94
95         verify(entityOwnershipService, times(2)).registerListener(anyString(), any(EntityOwnershipListener.class));
96         verify(entityOwnershipService).registerCandidate(any(Entity.class));
97     }
98
99     @SuppressWarnings("unchecked")
100     @Test
101     public void testInitializeTopology() throws Exception {
102         InstanceIdentifier<NetworkTopology> path = mock(InstanceIdentifier.class);
103         PowerMockito.mockStatic(InstanceIdentifier.class);
104         when(InstanceIdentifier.create(NetworkTopology.class)).thenReturn(path);
105
106         CheckedFuture<Optional<NetworkTopology>, ReadFailedException> topology = mock(CheckedFuture.class);
107         ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
108         when(db.newReadWriteTransaction()).thenReturn(transaction);
109         when(transaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(topology);
110
111         Optional<NetworkTopology> optNetTopo = mock(Optional.class);
112         when(topology.get()).thenReturn(optNetTopo);
113         when(optNetTopo.isPresent()).thenReturn(false);
114         NetworkTopologyBuilder ntb = mock(NetworkTopologyBuilder.class);
115         PowerMockito.whenNew(NetworkTopologyBuilder.class).withNoArguments().thenReturn(ntb);
116         NetworkTopology networkTopology = mock(NetworkTopology.class);
117         when(ntb.build()).thenReturn(networkTopology);
118         doNothing().when(transaction).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(NetworkTopology.class));
119         when(transaction.submit()).thenReturn(mock(CheckedFuture.class));
120
121         LogicalDatastoreType type = PowerMockito.mock(LogicalDatastoreType.class);
122         Whitebox.invokeMethod(southboundProvider, "initializeTopology", type);
123         verify(ntb).build();
124     }
125
126     @SuppressWarnings("unchecked")
127     @Test
128     public void testInitializeOvsdbTopology() throws Exception {
129         ReadWriteTransaction transaction = mock(ReadWriteTransaction.class);
130         when(db.newReadWriteTransaction()).thenReturn(transaction);
131
132         //suppress calls to initializeTopology()
133         MemberModifier.suppress(MemberMatcher.method(SouthboundProvider.class, "initializeTopology", LogicalDatastoreType.class));
134
135         CheckedFuture<Optional<Topology>, ReadFailedException> ovsdbTp = mock(CheckedFuture.class);
136         when(transaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(ovsdbTp);
137
138         //true case
139         Optional<Topology> optTopo = mock(Optional.class);
140         when(ovsdbTp.get()).thenReturn(optTopo);
141         when(optTopo.isPresent()).thenReturn(false);
142         TopologyBuilder tpb = mock(TopologyBuilder.class);
143         PowerMockito.whenNew(TopologyBuilder.class).withNoArguments().thenReturn(tpb);
144         when(tpb.setTopologyId(any(TopologyId.class))).thenReturn(tpb);
145         Topology data = mock(Topology.class);
146         when(tpb.build()).thenReturn(data);
147         doNothing().when(transaction).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Topology.class));
148         when(transaction.submit()).thenReturn(mock(CheckedFuture.class));
149
150         LogicalDatastoreType type = PowerMockito.mock(LogicalDatastoreType.class);
151         Whitebox.invokeMethod(southboundProvider, "initializeOvsdbTopology", type);
152         PowerMockito.verifyPrivate(southboundProvider).invoke("initializeTopology", any(LogicalDatastoreType.class));
153         verify(tpb).setTopologyId(any(TopologyId.class));
154         verify(tpb).build();
155
156         //false case
157         when(optTopo.isPresent()).thenReturn(false);
158         when(transaction.cancel()).thenReturn(true);
159         Whitebox.invokeMethod(southboundProvider, "initializeOvsdbTopology", type);
160         PowerMockito.verifyPrivate(southboundProvider, times(2)).invoke("initializeTopology", any(LogicalDatastoreType.class));
161     }
162
163     @Test
164     public void testHandleOwnershipChange() throws Exception {
165         EntityOwnershipChange entityOwner = mock(EntityOwnershipChange.class);
166         //suppress calls to initializeOvsdbTopology()
167         MemberModifier.suppress(MemberMatcher.method(SouthboundProvider.class, "initializeOvsdbTopology", LogicalDatastoreType.class));
168         doNothing().when(ovsdbConnection).registerConnectionListener(any(OvsdbConnectionManager.class));
169         when(ovsdbConnection.startOvsdbManager(any(Integer.class))).thenReturn(false);
170         // Entity ownership given to this instance.
171         when(entityOwner.isOwner()).thenReturn(true);
172         Whitebox.invokeMethod(southboundProvider, "handleOwnershipChange", entityOwner);
173         PowerMockito.verifyPrivate(southboundProvider, times(2)).invoke("initializeOvsdbTopology", any(LogicalDatastoreType.class));
174         // Entity ownership not awarded to this instance.
175         when(entityOwner.isOwner()).thenReturn(false);
176         Whitebox.invokeMethod(southboundProvider, "handleOwnershipChange", entityOwner);
177         PowerMockito.verifyPrivate(southboundProvider, times(2)).invoke("initializeOvsdbTopology", any(LogicalDatastoreType.class));
178         verify(ovsdbConnection, times(2)).registerConnectionListener(any(OvsdbConnectionManager.class));
179     }
180 }