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.reset;
16 import static org.mockito.Mockito.verify;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
21 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
22 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
25 * Synchronous test suite.
27 public class DOMClusterSingletonServiceProviderImplTest extends AbstractDOMClusterServiceProviderTest {
29 * Initialization functionality for every Tests in this suite.
31 * @throws CandidateAlreadyRegisteredException if the condition does not meet
35 public void setup() throws CandidateAlreadyRegisteredException {
40 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
42 * @throws Exception if the condition does not meet
45 public void takeDoubleLeadershipClusterSingletonServiceTest() throws Exception {
46 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
47 .registerClusterSingletonService(clusterSingletonService);
49 verify(mockEos).registerCandidate(ENTITY);
50 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
51 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
52 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
53 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
54 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
55 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
56 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
57 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
58 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
59 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
60 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
61 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
62 verify(mockEosDoubleEntityListReg, never()).close();
63 verify(mockEosEntityListReg, never()).close();
64 verify(mockEntityCandReg, never()).close();
65 verify(mockDoubleEntityCandReg).close();
69 * Test checks unexpected change for MASTER-TO-SLAVE double Candidate role change.
71 * @throws Exception if the condition does not meet
74 public void unexpectedLostLeadershipDoubleCandidateTest() throws Exception {
75 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
76 .registerClusterSingletonService(clusterSingletonService);
78 verify(mockEos).registerCandidate(ENTITY);
79 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
80 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
81 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
82 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
83 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
84 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
85 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
86 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
87 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
88 verify(mockEosDoubleEntityListReg, never()).close();
89 verify(mockEntityCandReg, never()).close();
90 verify(mockDoubleEntityCandReg, never()).close();
92 verify(mockEosEntityListReg, never()).close();
93 verify(mockEosDoubleEntityListReg, never()).close();
94 verify(mockEntityCandReg, atLeastOnce()).close();
95 verify(mockDoubleEntityCandReg, never()).close();
96 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
97 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
98 verify(mockEntityCandReg, atLeastOnce()).close();
99 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
100 verify(mockEosDoubleEntityListReg, never()).close();
101 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
105 * Test checks inJeopardy Cluster Node state for Master Instance.
107 * @throws Exception if the condition does not meet
110 public void inJeopardyMasterTest() throws Exception {
111 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
112 .registerClusterSingletonService(clusterSingletonService);
114 verify(mockEos).registerCandidate(ENTITY);
115 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
116 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
117 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
118 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
119 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
120 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
121 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
122 clusterSingletonServiceProvider.ownershipChanged(getEntityToJeopardy());
123 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
124 verify(mockEosEntityListReg, never()).close();
125 verify(mockEosDoubleEntityListReg, never()).close();
126 verify(mockEntityCandReg, never()).close();
127 verify(mockDoubleEntityCandReg).close();
131 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
133 * @throws Exception if the condition does not meet
136 public void closeClusterSingletonServiceRegistrationMasterTest() throws Exception {
137 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
138 .registerClusterSingletonService(clusterSingletonService);
140 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
141 verify(mockEos).registerCandidate(ENTITY);
142 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
143 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
144 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
145 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
147 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
148 verify(mockEosEntityListReg, never()).close();
149 verify(mockEosDoubleEntityListReg, never()).close();
150 verify(mockEntityCandReg).close();
151 verify(mockDoubleEntityCandReg).close();
152 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
156 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
158 * @throws Exception if the condition does not meet
161 public void closeClusterSingletonServiceRegistrationMasterCloseWithNotificationTimesTest() throws Exception {
162 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
163 .registerClusterSingletonService(clusterSingletonService);
165 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
166 verify(mockEos).registerCandidate(ENTITY);
167 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
168 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
169 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
170 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
172 verify(mockEosEntityListReg, never()).close();
173 verify(mockEosDoubleEntityListReg, never()).close();
174 verify(mockEntityCandReg, atLeastOnce()).close();
175 verify(mockDoubleEntityCandReg, never()).close();
176 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
177 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
178 verify(mockEntityCandReg, atLeastOnce()).close();
179 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
180 verify(mockEosDoubleEntityListReg, never()).close();
181 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
185 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
187 * @throws Exception if the condition does not meet
190 public void closeClusterSingletonServiceRegistrationMasterCloseCoupleTimesTest() throws Exception {
191 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
192 .registerClusterSingletonService(clusterSingletonService);
194 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
195 verify(mockEos).registerCandidate(ENTITY);
196 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
197 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
198 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
199 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
202 verify(mockEosEntityListReg, never()).close();
203 verify(mockEosDoubleEntityListReg, never()).close();
204 verify(mockEntityCandReg, atLeastOnce()).close();
205 verify(mockDoubleEntityCandReg, never()).close();
206 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
207 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
208 verify(mockEntityCandReg, atLeastOnce()).close();
209 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
210 verify(mockEosDoubleEntityListReg, never()).close();
211 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
216 * Verify that closing a group does not prevent next incarnation of it to be registered and the next incarnation
217 * will become active once the old incarnation finishes cleaning up.
220 public void testTwoIncarnations() throws Exception {
221 ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
222 .registerClusterSingletonService(clusterSingletonService);
224 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
225 verify(mockEos).registerCandidate(ENTITY);
226 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
227 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
228 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
229 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
231 // Close, triggers unregistration, but we will not continue with it.
233 verify(mockEosEntityListReg, never()).close();
234 verify(mockEosDoubleEntityListReg, never()).close();
235 verify(mockEntityCandReg).close();
236 verify(mockDoubleEntityCandReg, never()).close();
238 // Instantiate the next incarnation
240 reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService2);
241 verify(mockEos, never()).registerCandidate(ENTITY);
242 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
244 // Drive the old incarnation to closure, resetting mocks as needed
245 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
246 verify(mockEntityCandReg).close();
247 verify(mockDoubleEntityCandReg).close();
248 verify(mockEosDoubleEntityListReg, never()).close();
249 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
251 // Reset mocks for reuse. The next change should see the previous group terminate and the next incarnation
252 // to start coming up
253 reset(mockEntityCandReg);
254 reset(mockDoubleEntityCandReg);
255 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
256 verify(mockEos).registerCandidate(ENTITY);
257 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
258 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
259 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
260 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
262 // Check for potential service mixup
263 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
265 verify(mockEosEntityListReg, never()).close();
266 verify(mockEosDoubleEntityListReg, never()).close();