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