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.verify;
17 import com.google.common.util.concurrent.ListenableFuture;
18 import com.google.common.util.concurrent.SettableFuture;
19 import java.util.Timer;
20 import java.util.TimerTask;
21 import org.junit.AfterClass;
22 import org.junit.BeforeClass;
23 import org.junit.Test;
24 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
25 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
28 * Testing {@link DOMClusterSingletonServiceProviderImpl} implementation
30 public final class DOMClusterSingletonServiceProviderAsyncImplTest extends AbstractDOMClusterServiceProviderTest {
32 * Test implementation of {@link ClusterSingletonService}
34 static class TestClusterSingletonAsyncServiceInstance extends TestClusterSingletonService {
36 public ListenableFuture<Void> closeServiceInstance() {
37 super.closeServiceInstance();
39 final SettableFuture<Void> future = SettableFuture.create();
40 TIMER.schedule(new TimerTask() {
45 }, ASYNC_TIME_DELAY_MILLIS);
50 protected static final long ASYNC_TIME_DELAY_MILLIS = 100L;
51 protected static Timer TIMER;
54 public static void asyncInitTest() {
59 public static void cleanTest() {
64 TestClusterSingletonService instantiateService() {
65 return new TestClusterSingletonAsyncServiceInstance();
69 * Test GoldPath for takeLeadership with ownership result MASTER {@link ClusterSingletonService}.
71 * @throws Exception if the condition does not meet
74 public void takeDoubleLeadershipClusterSingletonServiceTest() 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(getDoubleEntityToMaster());
83 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
84 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
85 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
86 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
87 verify(mockDoubleEntityCandReg).close();
88 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
89 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
90 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
91 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
92 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
93 verify(mockEosDoubleEntityListReg, never()).close();
94 verify(mockEosEntityListReg, never()).close();
95 verify(mockEntityCandReg, never()).close();
99 * Test checks unexpected change for MASTER-TO-SLAVE double Candidate role change.
101 * @throws Exception if the condition does not meet
104 public void unexpectedLostLeadershipDoubleCandidateTest() throws Exception {
105 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
106 .registerClusterSingletonService(clusterSingletonService);
108 verify(mockEos).registerCandidate(ENTITY);
109 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
110 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
111 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
112 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
113 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
114 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
115 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
116 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToSlave());
117 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
118 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
119 verify(mockEosDoubleEntityListReg, never()).close();
120 verify(mockEntityCandReg, never()).close();
121 verify(mockDoubleEntityCandReg, never()).close();
123 verify(mockEosDoubleEntityListReg, never()).close();
124 verify(mockEntityCandReg, atLeastOnce()).close();
125 verify(mockDoubleEntityCandReg, never()).close();
126 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
127 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
128 verify(mockEntityCandReg, atLeastOnce()).close();
129 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
130 verify(mockEosDoubleEntityListReg, never()).close();
131 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
135 * Test checks inJeopardy Cluster Node state for Master Instance.
137 * @throws Exception if the condition does not meet
140 public void inJeopardyMasterTest() throws Exception {
141 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
142 .registerClusterSingletonService(clusterSingletonService);
144 verify(mockEos).registerCandidate(ENTITY);
145 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
146 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
147 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
148 clusterSingletonServiceProvider.ownershipChanged(getInitDoubleEntityToSlave());
149 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
150 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
151 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
152 clusterSingletonServiceProvider.ownershipChanged(getEntityMasterJeopardy());
153 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
154 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityMasterJeopardy());
155 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
156 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
157 verify(mockEosEntityListReg, never()).close();
158 verify(mockEosDoubleEntityListReg, never()).close();
159 verify(mockEntityCandReg, never()).close();
160 verify(mockDoubleEntityCandReg, never()).close();
164 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
166 * @throws Exception if the condition does not meet
169 public void closeClusterSingletonServiceRegistrationMasterTest() throws Exception {
170 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
171 .registerClusterSingletonService(clusterSingletonService);
173 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
174 verify(mockEos).registerCandidate(ENTITY);
175 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
176 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
177 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
178 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
180 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
181 verify(mockEosEntityListReg, never()).close();
182 verify(mockEosDoubleEntityListReg, never()).close();
183 verify(mockEntityCandReg, atLeastOnce()).close();
184 verify(mockDoubleEntityCandReg, never()).close();
185 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
186 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
187 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
188 verify(mockEntityCandReg, atLeastOnce()).close();
189 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
190 verify(mockEosDoubleEntityListReg, never()).close();
191 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
195 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
197 * @throws Exception if the condition does not meet
200 public void closeClusterSingletonServiceRegistrationMasterCloseWithNotificationTimesTest() throws Exception {
201 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
202 .registerClusterSingletonService(clusterSingletonService);
204 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
205 verify(mockEos).registerCandidate(ENTITY);
206 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
207 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
208 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
209 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
211 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
212 verify(mockEosEntityListReg, never()).close();
213 verify(mockEosDoubleEntityListReg, never()).close();
214 verify(mockEntityCandReg, atLeastOnce()).close();
215 verify(mockDoubleEntityCandReg, never()).close();
216 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
217 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
218 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
219 verify(mockEntityCandReg, atLeastOnce()).close();
220 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
221 verify(mockEosDoubleEntityListReg, never()).close();
222 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());
226 * Test checks close processing for {@link ClusterSingletonServiceRegistration}.
228 * @throws Exception if the condition does not meet
231 public void closeClusterSingletonServiceRegistrationMasterCloseCoupleTimesTest() throws Exception {
232 final ClusterSingletonServiceRegistration reg = clusterSingletonServiceProvider
233 .registerClusterSingletonService(clusterSingletonService);
235 assertEquals(TestClusterSingletonServiceState.INITIALIZED, clusterSingletonService.getServiceState());
236 verify(mockEos).registerCandidate(ENTITY);
237 clusterSingletonServiceProvider.ownershipChanged(getEntityToMaster());
238 verify(mockEos).registerCandidate(DOUBLE_ENTITY);
239 clusterSingletonServiceProvider.ownershipChanged(getDoubleEntityToMaster());
240 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
243 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
244 verify(mockEosEntityListReg, never()).close();
245 verify(mockEosDoubleEntityListReg, never()).close();
246 verify(mockEntityCandReg, atLeastOnce()).close();
247 verify(mockDoubleEntityCandReg, never()).close();
248 assertEquals(TestClusterSingletonServiceState.STARTED, clusterSingletonService.getServiceState());
249 clusterSingletonServiceProvider.ownershipChanged(getEntityToSlave());
250 Thread.sleep(ASYNC_TIME_DELAY_MILLIS * 2);
251 verify(mockEntityCandReg, atLeastOnce()).close();
252 verify(mockDoubleEntityCandReg, atLeastOnce()).close();
253 verify(mockEosDoubleEntityListReg, never()).close();
254 assertEquals(TestClusterSingletonServiceState.DESTROYED, clusterSingletonService.getServiceState());