e5e54d5944bf424b6acc46ea637eefe07e17093a
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / behaviors / LeaderTest.java
1 package org.opendaylight.controller.cluster.raft.behaviors;
2
3 import akka.actor.ActorRef;
4 import akka.actor.Props;
5 import akka.testkit.JavaTestKit;
6 import junit.framework.Assert;
7 import org.junit.Test;
8 import org.opendaylight.controller.cluster.raft.MockRaftActorContext;
9 import org.opendaylight.controller.cluster.raft.RaftActorContext;
10 import org.opendaylight.controller.cluster.raft.RaftState;
11 import org.opendaylight.controller.cluster.raft.internal.messages.SendHeartBeat;
12 import org.opendaylight.controller.cluster.raft.messages.AppendEntries;
13 import org.opendaylight.controller.cluster.raft.utils.DoNothingActor;
14
15 import java.util.HashMap;
16 import java.util.Map;
17
18 import static org.junit.Assert.assertEquals;
19
20 public class LeaderTest extends AbstractRaftActorBehaviorTest {
21
22     private ActorRef leaderActor = getSystem().actorOf(Props.create(DoNothingActor.class));
23     private ActorRef senderActor = getSystem().actorOf(Props.create(DoNothingActor.class));
24
25     @Test
26     public void testHandleMessageForUnknownMessage() throws Exception {
27         new JavaTestKit(getSystem()) {{
28             Leader leader =
29                 new Leader(createActorContext());
30
31             // handle message should return the Leader state when it receives an
32             // unknown message
33             RaftState state = leader.handleMessage(senderActor, "foo");
34             Assert.assertEquals(RaftState.Leader, state);
35         }};
36     }
37
38
39     @Test
40     public void testThatLeaderSendsAHeartbeatMessageToAllFollowers(){
41         new JavaTestKit(getSystem()) {{
42
43             new Within(duration("1 seconds")) {
44                 protected void run() {
45
46                     ActorRef followerActor = getTestActor();
47
48                     MockRaftActorContext actorContext = (MockRaftActorContext) createActorContext();
49
50                     Map<String, String> peerAddresses = new HashMap();
51
52                     peerAddresses.put(followerActor.path().toString(), followerActor.path().toString());
53
54                     actorContext.setPeerAddresses(peerAddresses);
55
56                     Leader leader = new Leader(actorContext);
57                     leader.handleMessage(senderActor, new SendHeartBeat());
58
59                     final String out = new ExpectMsg<String>(duration("1 seconds"), "match hint") {
60                         // do not put code outside this method, will run afterwards
61                         protected String match(Object in) {
62                             if (in instanceof AppendEntries) {
63                                 if (((AppendEntries) in).getTerm()
64                                     == 0) {
65                                     return "match";
66                                 }
67                                 return null;
68                             } else {
69                                 throw noMatch();
70                             }
71                         }
72                     }.get(); // this extracts the received message
73
74                     assertEquals("match", out);
75
76                 }
77
78
79             };
80         }};
81     }
82
83     @Override protected RaftActorBehavior createBehavior(RaftActorContext actorContext) {
84         return new Leader(actorContext);
85     }
86
87     @Override protected RaftActorContext createActorContext() {
88         return new MockRaftActorContext("test", getSystem(), leaderActor);
89     }
90 }