2 * Copyright (c) 2015 Brocade Communications 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.controller.cluster.raft;
10 import static org.mockito.Mockito.mock;
11 import static org.mockito.Mockito.never;
12 import static org.mockito.Mockito.timeout;
13 import static org.mockito.Mockito.verify;
15 import akka.dispatch.Dispatchers;
16 import java.util.function.Function;
17 import org.junit.After;
18 import org.junit.Test;
19 import org.opendaylight.controller.cluster.raft.RaftActorLeadershipTransferCohort.OnComplete;
20 import org.opendaylight.controller.cluster.raft.behaviors.Leader;
21 import org.opendaylight.controller.cluster.raft.policy.DisableElectionsRaftPolicy;
24 * Unit tests for RaftActorLeadershipTransferCohort.
26 * @author Thomas Pantelis
28 public class RaftActorLeadershipTransferCohortTest extends AbstractActorTest {
29 private final TestActorFactory factory = new TestActorFactory(getSystem());
30 private MockRaftActor mockRaftActor;
31 private RaftActorLeadershipTransferCohort cohort;
32 private final OnComplete onComplete = mock(OnComplete.class);
33 private final DefaultConfigParamsImpl config = new DefaultConfigParamsImpl();
34 private Function<Runnable, Void> pauseLeaderFunction;
37 public void tearDown() {
41 private void setup(final String testName) {
42 String persistenceId = factory.generateActorId(testName + "-leader-");
43 config.setCustomRaftPolicyImplementationClass(DisableElectionsRaftPolicy.class.getName());
44 mockRaftActor = factory.<MockRaftActor>createTestActor(MockRaftActor.builder().id(persistenceId).config(config)
45 .pauseLeaderFunction(pauseLeaderFunction).props().withDispatcher(Dispatchers.DefaultDispatcherId()),
46 persistenceId).underlyingActor();
47 cohort = new RaftActorLeadershipTransferCohort(mockRaftActor);
48 cohort.addOnComplete(onComplete);
49 mockRaftActor.waitForInitializeBehaviorComplete();
53 public void testOnNewLeader() {
54 setup("testOnNewLeader");
55 cohort.setNewLeaderTimeoutInMillis(20000);
57 cohort.onNewLeader("new-leader");
58 verify(onComplete, never()).onSuccess(mockRaftActor.self());
60 cohort.transferComplete();
62 cohort.onNewLeader(null);
63 verify(onComplete, never()).onSuccess(mockRaftActor.self());
65 cohort.onNewLeader("new-leader");
66 verify(onComplete).onSuccess(mockRaftActor.self());
70 public void testNewLeaderTimeout() {
71 setup("testNewLeaderTimeout");
72 cohort.setNewLeaderTimeoutInMillis(200);
73 cohort.transferComplete();
74 verify(onComplete, timeout(3000)).onSuccess(mockRaftActor.self());
78 public void testNotLeaderOnDoTransfer() {
79 setup("testNotLeaderOnDoTransfer");
81 verify(onComplete).onSuccess(mockRaftActor.self());
85 public void testAbortTransfer() {
86 setup("testAbortTransfer");
87 cohort.abortTransfer();
88 verify(onComplete).onFailure(mockRaftActor.self());
92 public void testPauseLeaderTimeout() {
93 pauseLeaderFunction = input -> null;
94 setup("testPauseLeaderTimeout");
96 Leader leader = new Leader(mockRaftActor.getRaftActorContext()) {
98 public void transferLeadership(final RaftActorLeadershipTransferCohort leadershipTransferCohort) {
99 leadershipTransferCohort.transferComplete();
102 mockRaftActor.setCurrentBehavior(leader);
105 verify(onComplete, timeout(2000)).onSuccess(mockRaftActor.self());