Merge "Serialization/Deserialization and a host of other fixes"
[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
18 import java.util.ArrayList;
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 public class MockRaftActorContext implements RaftActorContext {
25
26     private String id;
27     private ActorSystem system;
28     private ActorRef actor;
29     private long index = 0;
30     private long lastApplied = 0;
31     private final ElectionTerm electionTerm;
32     private ReplicatedLog replicatedLog;
33     private Map<String, String> peerAddresses = new HashMap();
34
35     public MockRaftActorContext(){
36         electionTerm = null;
37
38         initReplicatedLog();
39     }
40
41     public MockRaftActorContext(String id, ActorSystem system, ActorRef actor){
42         this.id = id;
43         this.system = system;
44         this.actor = actor;
45
46         final String id1 = id;
47         electionTerm = new ElectionTerm() {
48             /**
49              * Identifier of the actor whose election term information this is
50              */
51             private final String id = id1;
52             private long currentTerm = 0;
53             private String votedFor = "";
54
55             public long getCurrentTerm() {
56                 return currentTerm;
57             }
58
59             public String getVotedFor() {
60                 return votedFor;
61             }
62
63             public void update(long currentTerm, String votedFor){
64                 this.currentTerm = currentTerm;
65                 this.votedFor = votedFor;
66
67                 // TODO : Write to some persistent state
68             }
69
70             @Override public void updateAndPersist(long currentTerm,
71                 String votedFor) {
72                 update(currentTerm, votedFor);
73             }
74         };
75
76         initReplicatedLog();
77     }
78
79
80     public void initReplicatedLog(){
81         this.replicatedLog = new SimpleReplicatedLog();
82         this.replicatedLog.append(new MockReplicatedLogEntry(1, 1, ""));
83     }
84
85     @Override public ActorRef actorOf(Props props) {
86         return system.actorOf(props);
87     }
88
89     @Override public ActorSelection actorSelection(String path) {
90         return system.actorSelection(path);
91     }
92
93     @Override public String getId() {
94         return id;
95     }
96
97     @Override public ActorRef getActor() {
98         return actor;
99     }
100
101     @Override public ElectionTerm getTermInformation() {
102         return electionTerm;
103     }
104
105     public void setIndex(long index){
106         this.index = index;
107     }
108
109     @Override public long getCommitIndex() {
110         return index;
111     }
112
113     @Override public void setCommitIndex(long commitIndex) {
114         this.index = commitIndex;
115     }
116
117     @Override public void setLastApplied(long lastApplied){
118         this.lastApplied = lastApplied;
119     }
120
121     @Override public long getLastApplied() {
122         return lastApplied;
123     }
124
125     public void setReplicatedLog(ReplicatedLog replicatedLog) {
126         this.replicatedLog = replicatedLog;
127     }
128
129     @Override public ReplicatedLog getReplicatedLog() {
130         return replicatedLog;
131     }
132
133     @Override public ActorSystem getActorSystem() {
134         return this.system;
135     }
136
137     @Override public LoggingAdapter getLogger() {
138         return Logging.getLogger(system, this);
139     }
140
141     @Override public Map<String, String> getPeerAddresses() {
142         return peerAddresses;
143     }
144
145     @Override public String getPeerAddress(String peerId) {
146         return peerAddresses.get(peerId);
147     }
148
149     @Override public void addToPeers(String name, String address) {
150         peerAddresses.put(name, address);
151     }
152
153     @Override public void removePeer(String name) {
154         peerAddresses.remove(name);
155     }
156
157     public void setPeerAddresses(Map<String, String> peerAddresses) {
158         this.peerAddresses = peerAddresses;
159     }
160
161
162
163     public static class SimpleReplicatedLog implements ReplicatedLog {
164         private final List<ReplicatedLogEntry> log = new ArrayList<>();
165
166         @Override public ReplicatedLogEntry get(long index) {
167             if(index >= log.size() || index < 0){
168                 return null;
169             }
170             return log.get((int) index);
171         }
172
173         @Override public ReplicatedLogEntry last() {
174             if(log.size() == 0){
175                 return null;
176             }
177             return log.get(log.size()-1);
178         }
179
180         @Override public long lastIndex() {
181             if(log.size() == 0){
182                 return -1;
183             }
184
185             return last().getIndex();
186         }
187
188         @Override public long lastTerm() {
189             if(log.size() == 0){
190                 return -1;
191             }
192
193             return last().getTerm();
194         }
195
196         @Override public void removeFrom(long index) {
197             if(index >= log.size() || index < 0){
198                 return;
199             }
200
201             log.subList((int) index, log.size()).clear();
202             //log.remove((int) index);
203         }
204
205         @Override public void removeFromAndPersist(long index) {
206             removeFrom(index);
207         }
208
209         @Override public void append(ReplicatedLogEntry replicatedLogEntry) {
210             log.add(replicatedLogEntry);
211         }
212
213         @Override public void appendAndPersist(
214             ReplicatedLogEntry replicatedLogEntry) {
215             append(replicatedLogEntry);
216         }
217
218         @Override public List<ReplicatedLogEntry> getFrom(long index) {
219             if(index >= log.size() || index < 0){
220                 return Collections.EMPTY_LIST;
221             }
222             List<ReplicatedLogEntry> entries = new ArrayList<>();
223             for(int i=(int) index ; i < log.size() ; i++) {
224                 entries.add(get(i));
225             }
226             return entries;
227         }
228
229         @Override public long size() {
230             return log.size();
231         }
232
233         @Override public boolean isPresent(long index) {
234             if(index >= log.size() || index < 0){
235                 return false;
236             }
237
238             return true;
239         }
240
241         @Override public boolean isInSnapshot(long index) {
242             return false;
243         }
244
245         @Override public Object getSnapshot() {
246             return null;
247         }
248
249         @Override public long getSnapshotIndex() {
250             return -1;
251         }
252
253         @Override public long getSnapshotTerm() {
254             return -1;
255         }
256     }
257
258     public static class MockReplicatedLogEntry implements ReplicatedLogEntry {
259
260         private final long term;
261         private final long index;
262         private final Object data;
263
264         public MockReplicatedLogEntry(long term, long index, Object data){
265
266             this.term = term;
267             this.index = index;
268             this.data = data;
269         }
270
271         @Override public Object getData() {
272             return data;
273         }
274
275         @Override public long getTerm() {
276             return term;
277         }
278
279         @Override public long getIndex() {
280             return index;
281         }
282     }
283 }