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
8 package org.opendaylight.mdsal.singleton.impl;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.mockito.Mockito.never;
13 import static org.mockito.Mockito.verify;
14 import static org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange.LOCAL_OWNERSHIP_GRANTED;
15 import static org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange.LOCAL_OWNERSHIP_LOST_NEW_OWNER;
16 import static org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange.LOCAL_OWNERSHIP_RETAINED_WITH_NO_CHANGE;
17 import static org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange.REMOTE_OWNERSHIP_CHANGED;
19 import com.google.common.util.concurrent.ListenableFuture;
20 import com.google.common.util.concurrent.SettableFuture;
21 import java.util.Timer;
22 import java.util.TimerTask;
23 import org.junit.AfterClass;
24 import org.junit.BeforeClass;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.opendaylight.mdsal.singleton.api.ClusterSingletonService;
31 * Testing {@link DOMClusterSingletonServiceProviderImpl} implementation
33 @RunWith(MockitoJUnitRunner.StrictStubs.class)
34 public final class AsyncEOSClusterSingletonServiceProviderTest extends AbstractEOSClusterSingletonServiceProviderTest {
36 * Test implementation of {@link ClusterSingletonService}
38 public static class TestClusterSingletonAsyncServiceInstance extends TestClusterSingletonService {
40 public ListenableFuture<Void> closeServiceInstance() {
41 super.closeServiceInstance();
43 final var future = SettableFuture.<Void>create();
44 TIMER.schedule(new TimerTask() {
49 }, ASYNC_TIME_DELAY_MILLIS);
54 public static final long ASYNC_TIME_DELAY_MILLIS = 100L;
55 public static Timer TIMER;
58 public static void asyncInitTest() {
63 public static void cleanTest() {
68 TestClusterSingletonService instantiateService() {
69 return new TestClusterSingletonAsyncServiceInstance();
73 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
75 * @throws Exception if the condition does not meet
78 public void takeDoubleLeadershipClusterSingletonServiceTest() throws Exception {
79 final var reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService);
81 verify(mockEos).registerCandidate(ENTITY);
82 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
83 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
84 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
85 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
86 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
87 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_LOST_NEW_OWNER, false);
88 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
89 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
90 verify(mockDoubleEntityCandReg).close();
91 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
92 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
93 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, REMOTE_OWNERSHIP_CHANGED, false);
94 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
95 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
96 verify(mockEosDoubleEntityListReg, never()).close();
97 verify(mockEosEntityListReg, never()).close();
98 verify(mockEntityCandReg, never()).close();
102 * Test checks unexpected change for MASTER-TO-SLAVE double Candidate role change.
104 * @throws Exception if the condition does not meet
107 public void unexpectedLostLeadershipDoubleCandidateTest() throws Exception {
108 final var reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService);
110 verify(mockEos).registerCandidate(ENTITY);
111 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
112 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
113 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
114 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, REMOTE_OWNERSHIP_CHANGED, false);
115 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
116 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
117 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
118 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_LOST_NEW_OWNER, false);
119 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
120 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
121 verify(mockEosDoubleEntityListReg, never()).close();
122 verify(mockEntityCandReg, never()).close();
123 verify(mockDoubleEntityCandReg, never()).close();
125 verify(mockEosDoubleEntityListReg, never()).close();
126 verify(mockEntityCandReg).close();
127 verify(mockDoubleEntityCandReg).close();
131 * Test checks inJeopardy Cluster Node state for Master Instance.
133 * @throws Exception if the condition does not meet
136 public void inJeopardyMasterTest() throws Exception {
137 final var reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService);
139 verify(mockEos).registerCandidate(ENTITY);
140 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
141 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
142 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
143 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, REMOTE_OWNERSHIP_CHANGED, false);
144 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
145 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
146 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
147 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_RETAINED_WITH_NO_CHANGE, true);
148 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
149 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_RETAINED_WITH_NO_CHANGE, true);
150 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
151 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
152 verify(mockEosEntityListReg, never()).close();
153 verify(mockEosDoubleEntityListReg, never()).close();
154 verify(mockEntityCandReg, never()).close();
155 verify(mockDoubleEntityCandReg, never()).close();
159 * Test checks close processing for {@link ServiceRegistration}.
161 * @throws Exception if the condition does not meet
164 public void closeClusterSingletonServiceRegistrationMasterTest() throws Exception {
165 final var reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService);
167 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
168 verify(mockEos).registerCandidate(ENTITY);
169 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
170 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
171 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
172 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
174 verify(mockEntityCandReg).close();
175 verify(mockDoubleEntityCandReg, never()).close();
176 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
177 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
178 verify(mockDoubleEntityCandReg).close();
179 verify(mockEosEntityListReg, never()).close();
180 verify(mockEosDoubleEntityListReg, never()).close();
184 * Test checks close processing for {@link ServiceRegistration}.
186 * @throws Exception if the condition does not meet
189 public void closeClusterSingletonServiceRegistrationMasterCloseWithNotificationTimesTest() throws Exception {
190 final var reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService);
192 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
193 verify(mockEos).registerCandidate(ENTITY);
194 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
195 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
196 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
197 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
199 verify(mockEntityCandReg).close();
200 verify(mockDoubleEntityCandReg, never()).close();
201 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
202 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
203 verify(mockDoubleEntityCandReg).close();
204 verify(mockEosEntityListReg, never()).close();
205 verify(mockEosDoubleEntityListReg, never()).close();
209 * Test checks close processing for {@link ServiceRegistration}.
211 * @throws Exception if the condition does not meet
214 public void closeClusterSingletonServiceRegistrationMasterCloseCoupleTimesTest() throws Exception {
215 final var reg = clusterSingletonServiceProvider.registerClusterSingletonService(clusterSingletonService);
217 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
218 verify(mockEos).registerCandidate(ENTITY);
219 clusterSingletonServiceProvider.ownershipChanged(ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
220 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
221 clusterSingletonServiceProvider.ownershipChanged(DOUBLE_ENTITY, LOCAL_OWNERSHIP_GRANTED, false);
222 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
225 verify(mockEntityCandReg).close();
226 verify(mockDoubleEntityCandReg, never()).close();
227 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
229 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
230 verify(mockEosEntityListReg, never()).close();
231 verify(mockEosDoubleEntityListReg, never()).close();
232 verify(mockDoubleEntityCandReg).close();