cf09ab59e6bd5f10cb5d7890e84c74493245e4c2
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / RaftActorContextImplTest.java
1 /*
2  * Copyright (c) 2015 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.raft;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13 import static org.mockito.ArgumentMatchers.anyString;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.never;
17 import static org.mockito.Mockito.reset;
18 import static org.mockito.Mockito.verify;
19
20 import akka.actor.Props;
21 import akka.testkit.TestActorRef;
22 import com.google.common.collect.ImmutableMap;
23 import com.google.common.collect.Maps;
24 import com.google.common.util.concurrent.MoreExecutors;
25 import java.util.Arrays;
26 import java.util.HashMap;
27 import java.util.Map;
28 import org.junit.After;
29 import org.junit.Test;
30 import org.opendaylight.controller.cluster.DataPersistenceProvider;
31 import org.opendaylight.controller.cluster.NonPersistentDataProvider;
32 import org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload;
33 import org.opendaylight.controller.cluster.raft.persisted.ServerInfo;
34 import org.opendaylight.controller.cluster.raft.utils.DoNothingActor;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 /**
39  * Unit tests for RaftActorContextImpl.
40  *
41  * @author Thomas Pantelis
42  */
43 public class RaftActorContextImplTest extends AbstractActorTest {
44     private final TestActorFactory actorFactory = new TestActorFactory(getSystem());
45
46     private final TestActorRef<DoNothingActor> actor = actorFactory.createTestActor(
47             Props.create(DoNothingActor.class), actorFactory.generateActorId("actor"));
48
49     private static final Logger LOG = LoggerFactory.getLogger(RaftActorContextImplTest.class);
50
51     @After
52     public void tearDown() {
53         actorFactory.close();
54     }
55
56     @Test
57     public void testGetPeerAddress() {
58         Map<String, String> peerMap = new HashMap<>();
59         peerMap.put("peer1", "peerAddress1");
60         peerMap.put("peer2", null);
61         DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
62         RaftActorContextImpl context = new RaftActorContextImpl(actor, actor.underlyingActor().getContext(),
63                 "test", new ElectionTermImpl(createProvider(), "test", LOG), -1, -1,
64                 peerMap, configParams, createProvider(), applyState -> { }, LOG,  MoreExecutors.directExecutor());
65
66         assertEquals("getPeerAddress", "peerAddress1", context.getPeerAddress("peer1"));
67         assertEquals("getPeerAddress", null, context.getPeerAddress("peer2"));
68
69         PeerAddressResolver mockResolver = mock(PeerAddressResolver.class);
70         doReturn("peerAddress2").when(mockResolver).resolve("peer2");
71         doReturn("peerAddress3").when(mockResolver).resolve("peer3");
72         configParams.setPeerAddressResolver(mockResolver);
73
74         assertEquals("getPeerAddress", "peerAddress2", context.getPeerAddress("peer2"));
75         assertEquals("getPeerAddress", "peerAddress3", context.getPeerAddress("peer3"));
76
77         reset(mockResolver);
78         assertEquals("getPeerAddress", "peerAddress1", context.getPeerAddress("peer1"));
79         assertEquals("getPeerAddress", "peerAddress2", context.getPeerAddress("peer2"));
80         verify(mockResolver, never()).resolve(anyString());
81     }
82
83     @Test
84     public void testSetPeerAddress() {
85         DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
86         RaftActorContextImpl context = new RaftActorContextImpl(actor, actor.underlyingActor().getContext(),
87                 "test", new ElectionTermImpl(createProvider(), "test", LOG), -1, -1,
88                 Maps.newHashMap(ImmutableMap.<String, String>of("peer1", "peerAddress1")), configParams,
89                 createProvider(), applyState -> { }, LOG,  MoreExecutors.directExecutor());
90
91         context.setPeerAddress("peer1", "peerAddress1_1");
92         assertEquals("getPeerAddress", "peerAddress1_1", context.getPeerAddress("peer1"));
93
94         context.setPeerAddress("peer2", "peerAddress2");
95         assertEquals("getPeerAddress", null, context.getPeerAddress("peer2"));
96     }
97
98     @Test
99     public void testUpdatePeerIds() {
100         RaftActorContextImpl context = new RaftActorContextImpl(actor, actor.underlyingActor().getContext(),
101                 "self", new ElectionTermImpl(createProvider(), "test", LOG), -1, -1,
102                 Maps.newHashMap(ImmutableMap.<String, String>of("peer1", "peerAddress1")),
103                 new DefaultConfigParamsImpl(), createProvider(), applyState -> { }, LOG,
104                 MoreExecutors.directExecutor());
105
106         context.updatePeerIds(new ServerConfigurationPayload(Arrays.asList(new ServerInfo("self", false),
107                 new ServerInfo("peer2", true), new ServerInfo("peer3", false))));
108         verifyPeerInfo(context, "peer1", null);
109         verifyPeerInfo(context, "peer2", true);
110         verifyPeerInfo(context, "peer3", false);
111         assertEquals("isVotingMember", false, context.isVotingMember());
112
113         context.updatePeerIds(new ServerConfigurationPayload(Arrays.asList(new ServerInfo("self", true),
114                 new ServerInfo("peer2", true), new ServerInfo("peer3", true))));
115         verifyPeerInfo(context, "peer2", true);
116         verifyPeerInfo(context, "peer3", true);
117         assertEquals("isVotingMember", true, context.isVotingMember());
118
119         context.updatePeerIds(new ServerConfigurationPayload(Arrays.asList(new ServerInfo("peer2", true),
120                 new ServerInfo("peer3", true))));
121         verifyPeerInfo(context, "peer2", true);
122         verifyPeerInfo(context, "peer3", true);
123         assertEquals("isVotingMember", false, context.isVotingMember());
124     }
125
126     private static DataPersistenceProvider createProvider() {
127         return new NonPersistentDataProvider(Runnable::run);
128     }
129
130     private static void verifyPeerInfo(final RaftActorContextImpl context, final String peerId, final Boolean voting) {
131         PeerInfo peerInfo = context.getPeerInfo(peerId);
132         if (voting != null) {
133             assertNotNull("Expected peer " + peerId, peerInfo);
134             assertEquals("getVotingState for " + peerId, voting.booleanValue()
135                     ? VotingState.VOTING : VotingState.NON_VOTING, peerInfo.getVotingState());
136         } else {
137             assertNull("Unexpected peer " + peerId, peerInfo);
138         }
139     }
140 }