2 * Copyright (c) 2016 Cisco Systems, Inc. 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.mdsal.singleton.dom.impl;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.mockito.Mockito.atLeastOnce;
14 import static org.mockito.Mockito.never;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21 import org.mockito.junit.MockitoJUnitRunner;
22 import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
23 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
24 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
27 * Synchronous test suite.
29 @RunWith(MockitoJUnitRunner.StrictStubs.class)
30 public class DOMClusterSingletonServiceProviderImplTest extends AbstractDOMClusterServiceProviderTest {
32 * Initialization functionality for every Tests in this suite.
34 * @throws CandidateAlreadyRegisteredException if the condition does not meet
38 public void setup() throws CandidateAlreadyRegisteredException {
43 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
45 * @throws Exception if the condition does not meet
48 public void takeDoubleLeadershipClusterSingletonServiceTest() throws Exception {
49 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
50 .registerClusterSingletonService(clusterSingletonService);
52 verify(mockEos).registerCandidate(ENTITY);
53 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
54 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
55 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
56 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
57 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
58 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
59 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
60 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
61 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
62 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
63 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
64 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
65 verify(mockEosDoubleEntityListReg, never()).close();
66 verify(mockEosEntityListReg, never()).close();
67 verify(mockEntityCandReg, never()).close();
68 verify(mockDoubleEntityCandReg).close();
72 * Test checks unexpected change for MASTER-TO-SLAVE double Candidate role change.
74 * @throws Exception if the condition does not meet
77 public void unexpectedLostLeadershipDoubleCandidateTest() throws Exception {
78 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
79 .registerClusterSingletonService(clusterSingletonService);
81 verify(mockEos).registerCandidate(ENTITY);
82 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
83 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
84 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
85 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
86 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
87 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
88 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
89 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
90 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
91 verify(mockEosDoubleEntityListReg, never()).close();
92 verify(mockEntityCandReg, never()).close();
93 verify(mockDoubleEntityCandReg, never()).close();
95 verify(mockEosEntityListReg, never()).close();
96 verify(mockEosDoubleEntityListReg, never()).close();
97 verify(mockEntityCandReg, atLeastOnce()).close();
98 verify(mockDoubleEntityCandReg).close();
99 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
100 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
101 verify(mockEntityCandReg).close();
102 verify(mockEosDoubleEntityListReg, never()).close();
106 * Test checks inJeopardy Cluster Node state for Master Instance.
108 * @throws Exception if the condition does not meet
111 public void inJeopardyMasterTest() throws Exception {
112 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
113 .registerClusterSingletonService(clusterSingletonService);
115 verify(mockEos).registerCandidate(ENTITY);
116 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
117 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
118 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
119 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
120 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
121 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
122 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
123 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToJeopardy());
124 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
125 verify(mockEosEntityListReg, never()).close();
126 verify(mockEosDoubleEntityListReg, never()).close();
127 verify(mockEntityCandReg, never()).close();
128 verify(mockDoubleEntityCandReg, never()).close();
132 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
134 * @throws Exception if the condition does not meet
137 public void closeClusterSingletonServiceRegistrationMasterTest() throws Exception {
138 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
139 .registerClusterSingletonService(clusterSingletonService);
141 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
142 verify(mockEos).registerCandidate(ENTITY);
143 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
144 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
145 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
146 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
148 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
149 verify(mockEosEntityListReg, never()).close();
150 verify(mockEosDoubleEntityListReg, never()).close();
151 verify(mockEntityCandReg).close();
152 verify(mockDoubleEntityCandReg).close();
153 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
157 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
159 * @throws Exception if the condition does not meet
162 public void closeClusterSingletonServiceRegistrationMasterCloseWithNotificationTimesTest() throws Exception {
163 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
164 .registerClusterSingletonService(clusterSingletonService);
166 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
167 verify(mockEos).registerCandidate(ENTITY);
168 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
169 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
170 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
171 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
173 verify(mockEosEntityListReg, never()).close();
174 verify(mockEosDoubleEntityListReg, never()).close();
175 verify(mockEntityCandReg, atLeastOnce()).close();
176 verify(mockDoubleEntityCandReg).close();
177 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
181 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
183 * @throws Exception if the condition does not meet
186 public void closeClusterSingletonServiceRegistrationMasterCloseCoupleTimesTest() throws Exception {
187 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
188 .registerClusterSingletonService(clusterSingletonService);
190 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
191 verify(mockEos).registerCandidate(ENTITY);
192 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
193 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
194 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
195 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
198 verify(mockEosEntityListReg, never()).close();
199 verify(mockEosDoubleEntityListReg, never()).close();
200 verify(mockEntityCandReg).close();
201 verify(mockDoubleEntityCandReg).close();
202 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
203 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
204 verify(mockEosDoubleEntityListReg, never()).close();
208 * Verify that closing a group does not prevent next incarnation of it to be registered and the next incarnation
209 * will become active once the old incarnation finishes cleaning up.
212 public void testTwoIncarnations() throws Exception {
213 ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
214 .registerClusterSingletonService(clusterSingletonService);
216 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
217 verify(mockEos).registerCandidate(ENTITY);
218 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
219 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
220 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
221 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
223 // Close, triggers unregistration, but we will not continue with it.
225 verify(mockEosEntityListReg, never()).close();
226 verify(mockEosDoubleEntityListReg, never()).close();
227 verify(mockEntityCandReg).close();
228 verify(mockDoubleEntityCandReg).close();
229 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
231 // Instantiate the next incarnation
232 reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService2);
233 verify(mockEos).registerCandidate(ENTITY);
234 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
236 // Drive the old incarnation to closure, resetting mocks as needed
237 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
238 verify(mockEosDoubleEntityListReg, never()).close();
240 // Reset mocks for reuse. The next change should see the previous group terminate and the next incarnation
241 // to start coming up
242 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
243 verify(mockEos, times(2)).registerCandidate(ENTITY);
244 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
245 verify(mockEos, times(2)).registerCandidate(DOUBLE_ENTITY);
246 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
247 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
249 // Check for potential service mixup
250 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
252 verify(mockEosEntityListReg, never()).close();
253 verify(mockEosDoubleEntityListReg, never()).close();