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.mockito.Matchers.any;
12 import static org.mockito.Matchers.eq;
13 import static org.mockito.Mockito.atLeastOnce;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.doThrow;
17 import static org.mockito.Mockito.never;
18 import static org.mockito.Mockito.verify;
20 import com.google.common.util.concurrent.ListenableFuture;
21 import com.google.common.util.concurrent.SettableFuture;
22 import java.util.Timer;
23 import java.util.TimerTask;
24 import org.junit.AfterClass;
25 import org.junit.Assert;
26 import org.junit.Before;
27 import org.junit.BeforeClass;
28 import org.junit.Test;
29 import org.mockito.Mock;
30 import org.mockito.MockitoAnnotations;
31 import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
32 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState;
33 import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
34 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration;
35 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange;
36 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListenerRegistration;
37 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
38 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
39 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
40 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
43 * Testing {@link DOMClusterSingletonServiceProviderImpl} implementation
45 public final class DOMClusterSingletonServiceProviderAsyncImplTest {
47 private static final String SERVICE_ENTITY_TYPE = "org.opendaylight.mdsal.ServiceEntityType";
48 private static final String CLOSE_SERVICE_ENTITY_TYPE = "org.opendaylight.mdsal.AsyncServiceCloseEntityType";
49 private static final String SERVICE_NAME = "testServiceName";
52 private DOMEntityOwnershipService mockEos;
54 private DOMEntityOwnershipCandidateRegistration mockEntityCandReg;
56 private DOMEntityOwnershipCandidateRegistration mockDoubleEntityCandReg;
58 private DOMEntityOwnershipListenerRegistration mockEosEntityListReg;
60 private DOMEntityOwnershipListenerRegistration mockEosDoubleEntityListReg;
62 private DOMClusterSingletonServiceProviderImpl clusterSingletonServiceProvider;
63 private TestClusterSingletonAsyncServiceInstance clusterSingletonService;
64 private TestClusterSingletonAsyncServiceInstance clusterSingletonService2;
66 private final DOMEntity entity = new DOMEntity(SERVICE_ENTITY_TYPE, SERVICE_NAME);
67 private final DOMEntity doubleEntity = new DOMEntity(CLOSE_SERVICE_ENTITY_TYPE, SERVICE_NAME);
69 protected static Timer timer;
70 protected static long ASYNC_TIME_DELAY_SEC = 100L;
73 public static void asyncInitTest() {
78 public static void cleanTest() {
83 * Initialization functionality for every Tests in this suite.
85 * @throws Exception if the condition does not meet
88 public void setup() throws Exception {
89 MockitoAnnotations.initMocks(this);
91 doNothing().when(mockEosEntityListReg).close();
92 doNothing().when(mockEosDoubleEntityListReg).close();
93 doNothing().when(mockEntityCandReg).close();
94 doNothing().when(mockDoubleEntityCandReg).close();
95 doReturn(mockEosEntityListReg).when(mockEos).registerListener(eq(SERVICE_ENTITY_TYPE),
96 any(DOMClusterSingletonServiceProviderImpl.class));
97 doReturn(mockEosDoubleEntityListReg).when(mockEos).registerListener(eq(CLOSE_SERVICE_ENTITY_TYPE),
98 any(DOMClusterSingletonServiceProviderImpl.class));
99 doReturn(mockEntityCandReg).when(mockEos).registerCandidate(entity);
100 doReturn(mockDoubleEntityCandReg).when(mockEos).registerCandidate(doubleEntity);
102 clusterSingletonServiceProvider = new DOMClusterSingletonServiceProviderImpl(mockEos);
103 clusterSingletonServiceProvider.initializeProvider();
104 verify(mockEos).registerListener(SERVICE_ENTITY_TYPE, clusterSingletonServiceProvider);
105 verify(mockEos).registerListener(CLOSE_SERVICE_ENTITY_TYPE, clusterSingletonServiceProvider);
107 clusterSingletonService = new TestClusterSingletonAsyncServiceInstance();
108 clusterSingletonService2 = new TestClusterSingletonAsyncServiceInstance();
110 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
111 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
115 * Test checks NullPointer for null {@link DOMEntityOwnershipService} input value.
117 * @throws Exception if the condition does not meet
119 @Test(expected = NullPointerException.class)
120 public void initializationClusterSingletonServiceProviderNullInputTest() throws Exception {
121 clusterSingletonServiceProvider = new DOMClusterSingletonServiceProviderImpl(null);
125 * Test GoldPath for close {@link DOMClusterSingletonServiceProviderImpl}.
127 * @throws Exception if the condition does not meet
130 public void closeClusterSingletonServiceProviderTest() throws Exception {
131 verify(mockEos).registerListener(SERVICE_ENTITY_TYPE, clusterSingletonServiceProvider);
132 verify(mockEos).registerListener(CLOSE_SERVICE_ENTITY_TYPE, clusterSingletonServiceProvider);
133 clusterSingletonServiceProvider.close();
134 verify(mockEosEntityListReg).close();
135 verify(mockEosDoubleEntityListReg).close();
139 * Test parser ServiceIdentifier from Entity.
141 * @throws Exception if the condition does not meet
144 public void makeEntityClusterSingletonServiceProviderTest() throws Exception {
145 final DOMEntity testEntity = clusterSingletonServiceProvider.createEntity(SERVICE_ENTITY_TYPE, SERVICE_NAME);
146 Assert.assertEquals(entity, testEntity);
147 final DOMEntity testDbEn = clusterSingletonServiceProvider.createEntity(CLOSE_SERVICE_ENTITY_TYPE,
149 Assert.assertEquals(doubleEntity, testDbEn);
153 * Test parser ServiceIdentifier from Entity.
155 * @throws Exception if the condition does not meet
158 public void getIdentifierClusterSingletonServiceProviderTest() throws Exception {
159 final String entityIdentifier = clusterSingletonServiceProvider.getServiceIdentifierFromEntity(entity);
160 Assert.assertEquals(SERVICE_NAME, entityIdentifier);
161 final String doubleEntityId = clusterSingletonServiceProvider.getServiceIdentifierFromEntity(doubleEntity);
162 Assert.assertEquals(SERVICE_NAME, doubleEntityId);
166 * Test GoldPath for initialization {@link ClusterSingletonService}.
168 * @throws Exception if the condition does not meet
171 public void initializationClusterSingletonServiceTest() throws Exception {
172 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
173 .registerClusterSingletonService(clusterSingletonService);
174 Assert.assertNotNull(reg);
175 verify(mockEos).registerCandidate(entity);
176 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
180 * Test GoldPath for initialization with init ownership result SLAVE {@link ClusterSingletonService}.
182 * @throws Exception if the condition does not meet
185 public void slaveInitClusterSingletonServiceTest() throws Exception {
186 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
187 .registerClusterSingletonService(clusterSingletonService);
188 Assert.assertNotNull(reg);
189 verify(mockEos).registerCandidate(entity);
190 clusterSingletonServiceProvider.ownershipChanged(getInitEntityToSlave());
191 verify(mockEos, never()).registerCandidate(doubleEntity);
192 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
196 * Test GoldPath for initialization with init ownership result SLAVE, but NO-MASTER {@link ClusterSingletonService}.
198 * @throws Exception if the condition does not meet
201 public void slaveInitNoMasterClusterSingletonServiceTest() throws Exception {
202 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
203 .registerClusterSingletonService(clusterSingletonService);
204 Assert.assertNotNull(reg);
205 verify(mockEos).registerCandidate(entity);
206 clusterSingletonServiceProvider.ownershipChanged(getInitEntityToSlaveNoMaster());
207 verify(mockEos, never()).registerCandidate(doubleEntity);
208 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
212 * Test GoldPath for initialization with init ownership result MASTER {@link ClusterSingletonService}.
214 * @throws Exception if the condition does not meet
217 public void masterInitClusterSingletonServiceTest() throws Exception {
218 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
219 .registerClusterSingletonService(clusterSingletonService);
220 Assert.assertNotNull(reg);
221 verify(mockEos).registerCandidate(entity);
222 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
223 verify(mockEos).registerCandidate(doubleEntity);
224 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
228 * Test GoldPath for initialization with init ownership result MASTER {@link ClusterSingletonService}.
230 * @throws Exception if the condition does not meet
233 public void masterInitSlaveDoubleCandidateClusterSingletonServiceTest() throws Exception {
234 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
235 .registerClusterSingletonService(clusterSingletonService);
236 Assert.assertNotNull(reg);
237 verify(mockEos).registerCandidate(entity);
238 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
239 verify(mockEos).registerCandidate(doubleEntity);
240 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
241 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
245 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
247 * @throws Exception if the condition does not meet
250 public void takeLeadershipClusterSingletonServiceTest() throws Exception {
251 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
252 .registerClusterSingletonService(clusterSingletonService);
253 Assert.assertNotNull(reg);
254 verify(mockEos).registerCandidate(entity);
255 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
256 verify(mockEos).registerCandidate(doubleEntity);
257 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
258 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
259 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
263 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
265 * @throws Exception if the condition does not meet
268 public void takeDoubleLeadershipClusterSingletonServiceTest() throws Exception {
269 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
270 .registerClusterSingletonService(clusterSingletonService);
271 Assert.assertNotNull(reg);
272 verify(mockEos).registerCandidate(entity);
273 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
274 verify(mockEos).registerCandidate(doubleEntity);
275 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
276 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
277 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
278 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
279 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
280 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
281 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
282 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
283 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
284 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
285 verify(mockEosDoubleEntityListReg, never()).close();
286 verify(mockEosEntityListReg, never()).close();
287 verify(mockEntityCandReg, never()).close();
288 verify(mockDoubleEntityCandReg).close();
292 * Test GoldPath for initialization with init ownership result MASTER {@link ClusterSingletonService}.
294 * @throws Exception if the condition does not meet
297 public void masterInitClusterSingletonServiceTwoServicesTest() throws Exception {
298 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
299 .registerClusterSingletonService(clusterSingletonService);
300 Assert.assertNotNull(reg);
301 verify(mockEos).registerCandidate(entity);
302 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
303 verify(mockEos).registerCandidate(doubleEntity);
304 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
305 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
306 .registerClusterSingletonService(clusterSingletonService2);
307 Assert.assertNotNull(reg2);
308 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
312 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
314 * @throws Exception if the condition does not meet
317 public void takeLeadershipClusterSingletonServiceTwoAddDuringWaitPhaseServicesTest() throws Exception {
318 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
319 .registerClusterSingletonService(clusterSingletonService);
320 Assert.assertNotNull(reg);
321 verify(mockEos).registerCandidate(entity);
322 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
323 verify(mockEos).registerCandidate(doubleEntity);
324 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
325 .registerClusterSingletonService(clusterSingletonService2);
326 Assert.assertNotNull(reg2);
327 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
328 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
329 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
330 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
331 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
335 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
337 * @throws Exception if the condition does not meet
340 public void takeLeadershipClusterSingletonServiceTowServicesTest() throws Exception {
341 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
342 .registerClusterSingletonService(clusterSingletonService);
343 Assert.assertNotNull(reg);
344 verify(mockEos).registerCandidate(entity);
345 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
346 verify(mockEos).registerCandidate(doubleEntity);
347 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
348 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
349 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
350 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
351 .registerClusterSingletonService(clusterSingletonService2);
352 Assert.assertNotNull(reg2);
353 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
357 * Test checks CandidateAlreadyRegisteredException processing in initialization phase.
359 * @throws Exception if the condition does not meet
361 @Test(expected = RuntimeException.class)
362 public void initializationClusterSingletonServiceCandidateAlreadyRegistredTest() throws Exception {
363 doThrow(CandidateAlreadyRegisteredException.class).when(mockEos).registerCandidate(entity);
364 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
365 .registerClusterSingletonService(clusterSingletonService);
366 Assert.assertNull(reg);
370 * Test GoldPath for lostLeadership during tryToTakeLeadership with ownership result MASTER
371 * {@link ClusterSingletonService}.
373 * @throws Exception if the condition does not meet
376 public void lostLeadershipDuringTryToTakeLeadershipClusterSingletonServiceTest() throws Exception {
377 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
378 .registerClusterSingletonService(clusterSingletonService);
379 Assert.assertNotNull(reg);
380 verify(mockEos).registerCandidate(entity);
381 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
382 verify(mockEos).registerCandidate(doubleEntity);
383 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
384 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
385 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
386 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
387 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
391 * Test GoldPath for lostLeadership with ownership result MASTER-TO-SLAVE {@link ClusterSingletonService}.
393 * @throws Exception if the condition does not meet
396 public void lostLeadershipClusterSingletonServiceTest() throws Exception {
397 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
398 .registerClusterSingletonService(clusterSingletonService);
399 Assert.assertNotNull(reg);
400 verify(mockEos).registerCandidate(entity);
401 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
402 verify(mockEos).registerCandidate(doubleEntity);
403 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
404 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
405 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
406 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
407 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
408 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
409 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
413 * Test checks unexpected change for MASTER-TO-SLAVE double Candidate role change.
415 * @throws Exception if the condition does not meet
418 public void unexpectedLostLeadershipDoubleCandidateTest() throws Exception {
419 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
420 .registerClusterSingletonService(clusterSingletonService);
421 Assert.assertNotNull(reg);
422 verify(mockEos).registerCandidate(entity);
423 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
424 verify(mockEos).registerCandidate(doubleEntity);
425 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
426 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
427 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
428 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
429 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
430 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
431 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
432 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
433 verify(mockEosDoubleEntityListReg, never()).close();
434 verify(mockEntityCandReg, never()).close();
435 verify(mockDoubleEntityCandReg, never()).close();
437 verify(mockEosDoubleEntityListReg, never()).close();
438 verify(mockEntityCandReg, atLeastOnce()).close();
439 verify(mockDoubleEntityCandReg, never()).close();
440 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
441 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
442 verify(mockEntityCandReg, atLeastOnce()).close();
443 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
444 verify(mockEosDoubleEntityListReg, never()).close();
445 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
449 * Test checks inJeopardy Cluster Node state for Master Instance.
451 * @throws Exception if the condition does not meet
454 public void inJeopardyMasterTest() throws Exception {
455 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
456 .registerClusterSingletonService(clusterSingletonService);
457 Assert.assertNotNull(reg);
458 verify(mockEos).registerCandidate(entity);
459 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
460 verify(mockEos).registerCandidate(doubleEntity);
461 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
462 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
463 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
464 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
465 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
466 clusterSingletonServiceProvider.ownershipChanged(getEntityToJeopardy());
467 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
468 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
469 verify(mockEosEntityListReg, never()).close();
470 verify(mockEosDoubleEntityListReg, never()).close();
471 verify(mockEntityCandReg, never()).close();
472 verify(mockDoubleEntityCandReg).close();
476 * Test checks inJeopardy Cluster Node state for Slave Instance.
478 * @throws Exception if the condition does not meet
481 public void inJeopardySlaveTest() throws Exception {
482 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
483 .registerClusterSingletonService(clusterSingletonService);
484 Assert.assertNotNull(reg);
485 verify(mockEos).registerCandidate(entity);
486 clusterSingletonServiceProvider.ownershipChanged(getInitEntityToSlave());
487 verify(mockEos, never()).registerCandidate(doubleEntity);
488 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
489 clusterSingletonServiceProvider.ownershipChanged(getEntityToJeopardy());
490 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
491 verify(mockEosEntityListReg, never()).close();
492 verify(mockEosDoubleEntityListReg, never()).close();
493 verify(mockEntityCandReg, never()).close();
494 verify(mockDoubleEntityCandReg, never()).close();
498 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
500 * @throws Exception if the condition does not meet
503 public void closeClusterSingletonServiceRegistrationNoRoleTest() throws Exception {
504 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
505 .registerClusterSingletonService(clusterSingletonService);
506 Assert.assertNotNull(reg);
507 verify(mockEos).registerCandidate(entity);
508 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
510 verify(mockEosEntityListReg, never()).close();
511 verify(mockEosDoubleEntityListReg, never()).close();
512 verify(mockEntityCandReg).close();
513 verify(mockDoubleEntityCandReg, never()).close();
514 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
518 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
520 * @throws Exception if the condition does not meet
523 public void closeClusterSingletonServiceRegistrationNoRoleTwoServicesTest() throws Exception {
524 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
525 .registerClusterSingletonService(clusterSingletonService);
526 Assert.assertNotNull(reg);
527 verify(mockEos).registerCandidate(entity);
528 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
529 .registerClusterSingletonService(clusterSingletonService2);
530 Assert.assertNotNull(reg2);
531 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
532 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
534 verify(mockEosEntityListReg, never()).close();
535 verify(mockEosDoubleEntityListReg, never()).close();
536 verify(mockEntityCandReg, never()).close();
537 verify(mockDoubleEntityCandReg, never()).close();
538 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
539 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
543 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
545 * @throws Exception if the condition does not meet
548 public void closeClusterSingletonServiceRegistrationSlaveTest() throws Exception {
549 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
550 .registerClusterSingletonService(clusterSingletonService);
551 Assert.assertNotNull(reg);
552 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
553 verify(mockEos).registerCandidate(entity);
554 clusterSingletonServiceProvider.ownershipChanged(getInitEntityToSlave());
556 verify(mockEosEntityListReg, never()).close();
557 verify(mockEosDoubleEntityListReg, never()).close();
558 verify(mockEntityCandReg).close();
559 verify(mockDoubleEntityCandReg, never()).close();
560 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
564 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
566 * @throws Exception if the condition does not meet
569 public void closeClusterSingletonServiceRegistrationSlaveTwoServicesTest() throws Exception {
570 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
571 .registerClusterSingletonService(clusterSingletonService);
572 Assert.assertNotNull(reg);
573 verify(mockEos).registerCandidate(entity);
574 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
575 .registerClusterSingletonService(clusterSingletonService2);
576 Assert.assertNotNull(reg2);
577 clusterSingletonServiceProvider.ownershipChanged(getInitEntityToSlave());
578 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
579 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
581 verify(mockEosEntityListReg, never()).close();
582 verify(mockEosDoubleEntityListReg, never()).close();
583 verify(mockEntityCandReg, never()).close();
584 verify(mockDoubleEntityCandReg, never()).close();
585 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
586 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
590 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
592 * @throws Exception if the condition does not meet
595 public void closeClusterSingletonServiceRegistrationMasterTest() throws Exception {
596 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
597 .registerClusterSingletonService(clusterSingletonService);
598 Assert.assertNotNull(reg);
599 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
600 verify(mockEos).registerCandidate(entity);
601 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
602 verify(mockEos).registerCandidate(doubleEntity);
603 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
604 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
606 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
607 verify(mockEosEntityListReg, never()).close();
608 verify(mockEosDoubleEntityListReg, never()).close();
609 verify(mockEntityCandReg, atLeastOnce()).close();
610 verify(mockDoubleEntityCandReg, never()).close();
611 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
612 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
613 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
614 verify(mockEntityCandReg, atLeastOnce()).close();
615 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
616 verify(mockEosDoubleEntityListReg, never()).close();
617 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
621 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
623 * @throws Exception if the condition does not meet
626 public void closeClusterSingletonServiceRegistrationMasterCloseWithNotificationTimesTest() throws Exception {
627 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
628 .registerClusterSingletonService(clusterSingletonService);
629 Assert.assertNotNull(reg);
630 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
631 verify(mockEos).registerCandidate(entity);
632 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
633 verify(mockEos).registerCandidate(doubleEntity);
634 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
635 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
637 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
638 verify(mockEosEntityListReg, never()).close();
639 verify(mockEosDoubleEntityListReg, never()).close();
640 verify(mockEntityCandReg, atLeastOnce()).close();
641 verify(mockDoubleEntityCandReg, never()).close();
642 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
643 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
644 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
645 verify(mockEntityCandReg, atLeastOnce()).close();
646 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
647 verify(mockEosDoubleEntityListReg, never()).close();
648 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
652 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
654 * @throws Exception if the condition does not meet
657 public void closeClusterSingletonServiceRegistrationMasterCloseCoupleTimesTest() throws Exception {
658 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
659 .registerClusterSingletonService(clusterSingletonService);
660 Assert.assertNotNull(reg);
661 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
662 verify(mockEos).registerCandidate(entity);
663 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
664 verify(mockEos).registerCandidate(doubleEntity);
665 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
666 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
669 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
670 verify(mockEosEntityListReg, never()).close();
671 verify(mockEosDoubleEntityListReg, never()).close();
672 verify(mockEntityCandReg, atLeastOnce()).close();
673 verify(mockDoubleEntityCandReg, never()).close();
674 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
675 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
676 Thread.sleep(ASYNC_TIME_DELAY_SEC * 2);
677 verify(mockEntityCandReg, atLeastOnce()).close();
678 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
679 verify(mockEosDoubleEntityListReg, never()).close();
680 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
684 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
686 * @throws Exception if the condition does not meet
689 public void closeClusterSingletonServiceRegistrationMasterTwoServicesTest() throws Exception {
690 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
691 .registerClusterSingletonService(clusterSingletonService);
692 Assert.assertNotNull(reg);
693 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
694 .registerClusterSingletonService(clusterSingletonService2);
695 Assert.assertNotNull(reg2);
696 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
697 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
698 verify(mockEos).registerCandidate(entity);
699 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
700 verify(mockEos).registerCandidate(doubleEntity);
701 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
702 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
703 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
705 verify(mockEosEntityListReg, never()).close();
706 verify(mockEosDoubleEntityListReg, never()).close();
707 verify(mockEntityCandReg, never()).close();
708 verify(mockDoubleEntityCandReg, never()).close();
709 Assert.assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
710 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
714 * Test checks validation Error processing for SLAVE-TO-MASTER entity Candidate role change.
716 * @throws Exception if the condition does not meet
719 public void tryToTakeLeaderForClosedServiceRegistrationTest() throws Exception {
720 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
721 .registerClusterSingletonService(clusterSingletonService);
722 Assert.assertNotNull(reg);
723 final ClusterSingletonServiceRegistration reg2 = clusterSingletonServiceProvider
724 .registerClusterSingletonService(clusterSingletonService2);
725 Assert.assertNotNull(reg2);
726 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
727 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService2.getServiceState());
728 verify(mockEos).registerCandidate(entity);
730 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
731 verify(mockEos).registerCandidate(doubleEntity);
732 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
733 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
734 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
735 verify(mockEosEntityListReg, never()).close();
736 verify(mockEosDoubleEntityListReg, never()).close();
737 verify(mockEntityCandReg, never()).close();
738 verify(mockDoubleEntityCandReg, never()).close();
739 Assert.assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
740 Assert.assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService2.getServiceState());
743 private DOMEntityOwnershipChange getEntityToMaster() {
744 return new DOMEntityOwnershipChange(entity, EntityOwnershipChangeState.from(false, true, true));
747 private DOMEntityOwnershipChange getEntityToSlave() {
748 return new DOMEntityOwnershipChange(entity, EntityOwnershipChangeState.from(true, false, true));
751 private DOMEntityOwnershipChange getInitEntityToSlave() {
752 return new DOMEntityOwnershipChange(entity, EntityOwnershipChangeState.from(false, false, true));
755 private DOMEntityOwnershipChange getInitEntityToSlaveNoMaster() {
756 return new DOMEntityOwnershipChange(entity, EntityOwnershipChangeState.from(false, false, false));
759 private DOMEntityOwnershipChange getDoubleEntityToMaster() {
760 return new DOMEntityOwnershipChange(doubleEntity, EntityOwnershipChangeState.from(false, true, true));
763 private DOMEntityOwnershipChange getInitDoubleEntityToSlave() {
764 return new DOMEntityOwnershipChange(doubleEntity, EntityOwnershipChangeState.from(false, false, true));
767 private DOMEntityOwnershipChange getDoubleEntityToSlave() {
768 return new DOMEntityOwnershipChange(doubleEntity, EntityOwnershipChangeState.from(true, false, true));
771 private DOMEntityOwnershipChange getEntityToJeopardy() {
772 return new DOMEntityOwnershipChange(entity, EntityOwnershipChangeState.from(false, false, false), true);
776 * Base states for AbstractClusterProjectProvider
778 enum TestClusterSingletonServiceState {
780 * State represents a correct Instantiated process
784 * State represents a correct call abstract method instantiatingProject
788 * State represents a correct call abstract method destryingProject
794 * Test implementation of {@link ClusterSingletonService}
796 class TestClusterSingletonAsyncServiceInstance implements ClusterSingletonService {
798 private final ServiceGroupIdentifier serviceId = ServiceGroupIdentifier.create(SERVICE_NAME);
799 private TestClusterSingletonServiceState serviceState;
800 protected SettableFuture<Void> future;
802 TestClusterSingletonAsyncServiceInstance() {
803 this.serviceState = TestClusterSingletonServiceState.INITIALIZED;
807 public void instantiateServiceInstance() {
808 this.serviceState = TestClusterSingletonServiceState.STARTED;
812 public ListenableFuture<Void> closeServiceInstance() {
813 this.serviceState = TestClusterSingletonServiceState.DESTROYED;
814 future = SettableFuture.create();
815 timer.schedule(new TimerTask() {
821 }, ASYNC_TIME_DELAY_SEC);
825 public TestClusterSingletonServiceState getServiceState() {
830 public ServiceGroupIdentifier getIdentifier() {