Merge changes I9865d0cd,Ic71d525f,Ib8faba91,Ia10e5ec9,I35591747,If456a131,I9f8709cc
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / MockRaftActorContext.java
1 /*
2  * Copyright (c) 2014 Cisco 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
9 package org.opendaylight.controller.cluster.raft;
10
11 import akka.actor.ActorRef;
12 import akka.actor.ActorSelection;
13 import akka.actor.ActorSystem;
14 import akka.actor.Props;
15 import akka.event.Logging;
16 import akka.event.LoggingAdapter;
17 import com.google.common.base.Preconditions;
18 import com.google.protobuf.GeneratedMessage;
19 import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
20 import org.opendaylight.controller.protobuff.messages.cluster.raft.AppendEntriesMessages;
21 import org.opendaylight.controller.protobuff.messages.cluster.raft.test.MockPayloadMessages;
22
23 import java.io.Serializable;
24 import java.util.HashMap;
25 import java.util.Map;
26
27 public class MockRaftActorContext implements RaftActorContext {
28
29     private String id;
30     private ActorSystem system;
31     private ActorRef actor;
32     private long index = 0;
33     private long lastApplied = 0;
34     private final ElectionTerm electionTerm;
35     private ReplicatedLog replicatedLog;
36     private Map<String, String> peerAddresses = new HashMap<>();
37     private ConfigParams configParams;
38
39     public MockRaftActorContext(){
40         electionTerm = null;
41
42         initReplicatedLog();
43     }
44
45     public MockRaftActorContext(String id, ActorSystem system, ActorRef actor){
46         this.id = id;
47         this.system = system;
48         this.actor = actor;
49
50         final String id1 = id;
51         electionTerm = new ElectionTerm() {
52             /**
53              * Identifier of the actor whose election term information this is
54              */
55             private final String id = id1;
56             private long currentTerm = 0;
57             private String votedFor = "";
58
59             public long getCurrentTerm() {
60                 return currentTerm;
61             }
62
63             public String getVotedFor() {
64                 return votedFor;
65             }
66
67             public void update(long currentTerm, String votedFor){
68                 this.currentTerm = currentTerm;
69                 this.votedFor = votedFor;
70
71                 // TODO : Write to some persistent state
72             }
73
74             @Override public void updateAndPersist(long currentTerm,
75                 String votedFor) {
76                 update(currentTerm, votedFor);
77             }
78         };
79
80         configParams = new DefaultConfigParamsImpl();
81
82         initReplicatedLog();
83     }
84
85
86     public void initReplicatedLog(){
87         this.replicatedLog = new SimpleReplicatedLog();
88         this.replicatedLog.append(new MockReplicatedLogEntry(1, 1, new MockPayload("")));
89     }
90
91     @Override public ActorRef actorOf(Props props) {
92         return system.actorOf(props);
93     }
94
95     @Override public ActorSelection actorSelection(String path) {
96         return system.actorSelection(path);
97     }
98
99     @Override public String getId() {
100         return id;
101     }
102
103     @Override public ActorRef getActor() {
104         return actor;
105     }
106
107     @Override public ElectionTerm getTermInformation() {
108         return electionTerm;
109     }
110
111     public void setIndex(long index){
112         this.index = index;
113     }
114
115     @Override public long getCommitIndex() {
116         return index;
117     }
118
119     @Override public void setCommitIndex(long commitIndex) {
120         this.index = commitIndex;
121     }
122
123     @Override public void setLastApplied(long lastApplied){
124         this.lastApplied = lastApplied;
125     }
126
127     @Override public long getLastApplied() {
128         return lastApplied;
129     }
130
131     public void setReplicatedLog(ReplicatedLog replicatedLog) {
132         this.replicatedLog = replicatedLog;
133     }
134
135     @Override public ReplicatedLog getReplicatedLog() {
136         return replicatedLog;
137     }
138
139     @Override public ActorSystem getActorSystem() {
140         return this.system;
141     }
142
143     @Override public LoggingAdapter getLogger() {
144         return Logging.getLogger(system, this);
145     }
146
147     @Override public Map<String, String> getPeerAddresses() {
148         return peerAddresses;
149     }
150
151     @Override public String getPeerAddress(String peerId) {
152         return peerAddresses.get(peerId);
153     }
154
155     @Override public void addToPeers(String name, String address) {
156         peerAddresses.put(name, address);
157     }
158
159     @Override public void removePeer(String name) {
160         peerAddresses.remove(name);
161     }
162
163     @Override public ActorSelection getPeerActorSelection(String peerId) {
164         String peerAddress = getPeerAddress(peerId);
165         if(peerAddress != null){
166             return actorSelection(peerAddress);
167         }
168         return null;
169     }
170
171     @Override public void setPeerAddress(String peerId, String peerAddress) {
172         Preconditions.checkState(peerAddresses.containsKey(peerId));
173         peerAddresses.put(peerId, peerAddress);
174     }
175
176     public void setPeerAddresses(Map<String, String> peerAddresses) {
177         this.peerAddresses = peerAddresses;
178     }
179
180     @Override
181     public ConfigParams getConfigParams() {
182         return configParams;
183     }
184
185     public void setConfigParams(ConfigParams configParams) {
186         this.configParams = configParams;
187     }
188
189     public static class SimpleReplicatedLog extends AbstractReplicatedLogImpl {
190         @Override public void appendAndPersist(
191             ReplicatedLogEntry replicatedLogEntry) {
192             append(replicatedLogEntry);
193         }
194
195         @Override public void removeFromAndPersist(long index) {
196             removeFrom(index);
197         }
198     }
199
200     public static class MockPayload extends Payload implements Serializable {
201         private String value = "";
202
203         public MockPayload(){
204
205         }
206
207         public MockPayload(String s) {
208             this.value = s;
209         }
210
211         @Override public  Map<GeneratedMessage.GeneratedExtension, String> encode() {
212             Map<GeneratedMessage.GeneratedExtension, String> map = new HashMap<GeneratedMessage.GeneratedExtension, String>();
213             map.put(MockPayloadMessages.value, value);
214             return map;
215         }
216
217         @Override public Payload decode(
218             AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload payloadProtoBuff) {
219             String value = payloadProtoBuff.getExtension(MockPayloadMessages.value);
220             this.value = value;
221             return this;
222         }
223
224         @Override public String getClientPayloadClassName() {
225             return MockPayload.class.getName();
226         }
227
228         public String toString() {
229             return value;
230         }
231     }
232
233     public static class MockReplicatedLogEntry implements ReplicatedLogEntry, Serializable {
234
235         private final long term;
236         private final long index;
237         private final Payload data;
238
239         public MockReplicatedLogEntry(long term, long index, Payload data){
240
241             this.term = term;
242             this.index = index;
243             this.data = data;
244         }
245
246         @Override public Payload getData() {
247             return data;
248         }
249
250         @Override public long getTerm() {
251             return term;
252         }
253
254         @Override public long getIndex() {
255             return index;
256         }
257     }
258
259     public static class MockReplicatedLogBuilder {
260         private ReplicatedLog mockLog = new SimpleReplicatedLog();
261
262         public  MockReplicatedLogBuilder createEntries(int start, int end, int term) {
263             for (int i=start; i<end; i++) {
264                 this.mockLog.append(new ReplicatedLogImplEntry(i, term, new MockRaftActorContext.MockPayload("foo" + i)));
265             }
266             return this;
267         }
268
269         public  MockReplicatedLogBuilder addEntry(int index, int term, MockPayload payload) {
270             this.mockLog.append(new ReplicatedLogImplEntry(index, term, payload));
271             return this;
272         }
273
274         public ReplicatedLog build() {
275             return this.mockLog;
276         }
277     }
278 }