e02994bb06bed6a400f18b532f06dce93a92d934
[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         electionTerm = new ElectionTermImpl(id);
47
48         initReplicatedLog();
49     }
50
51
52     public void initReplicatedLog(){
53         this.replicatedLog = new SimpleReplicatedLog();
54         this.replicatedLog.append(new MockReplicatedLogEntry(1, 1, ""));
55     }
56
57     @Override public ActorRef actorOf(Props props) {
58         return system.actorOf(props);
59     }
60
61     @Override public ActorSelection actorSelection(String path) {
62         return system.actorSelection(path);
63     }
64
65     @Override public String getId() {
66         return id;
67     }
68
69     @Override public ActorRef getActor() {
70         return actor;
71     }
72
73     @Override public ElectionTerm getTermInformation() {
74         return electionTerm;
75     }
76
77     public void setIndex(long index){
78         this.index = index;
79     }
80
81     @Override public long getCommitIndex() {
82         return index;
83     }
84
85     @Override public void setCommitIndex(long commitIndex) {
86         this.index = commitIndex;
87     }
88
89     @Override public void setLastApplied(long lastApplied){
90         this.lastApplied = lastApplied;
91     }
92
93     @Override public long getLastApplied() {
94         return lastApplied;
95     }
96
97     public void setReplicatedLog(ReplicatedLog replicatedLog) {
98         this.replicatedLog = replicatedLog;
99     }
100
101     @Override public ReplicatedLog getReplicatedLog() {
102         return replicatedLog;
103     }
104
105     @Override public ActorSystem getActorSystem() {
106         return this.system;
107     }
108
109     @Override public LoggingAdapter getLogger() {
110         return Logging.getLogger(system, this);
111     }
112
113     @Override public Map<String, String> getPeerAddresses() {
114         return peerAddresses;
115     }
116
117     @Override public String getPeerAddress(String peerId) {
118         return peerAddresses.get(peerId);
119     }
120
121     @Override public void addToPeers(String name, String address) {
122         peerAddresses.put(name, address);
123     }
124
125     @Override public void removePeer(String name) {
126         peerAddresses.remove(name);
127     }
128
129     public void setPeerAddresses(Map<String, String> peerAddresses) {
130         this.peerAddresses = peerAddresses;
131     }
132
133
134     public static class SimpleReplicatedLog implements ReplicatedLog {
135         private final List<ReplicatedLogEntry> log = new ArrayList<>(10000);
136
137         @Override public ReplicatedLogEntry get(long index) {
138             if(index >= log.size() || index < 0){
139                 return null;
140             }
141             return log.get((int) index);
142         }
143
144         @Override public ReplicatedLogEntry last() {
145             if(log.size() == 0){
146                 return null;
147             }
148             return log.get(log.size()-1);
149         }
150
151         @Override public long lastIndex() {
152             if(log.size() == 0){
153                 return -1;
154             }
155
156             return last().getIndex();
157         }
158
159         @Override public long lastTerm() {
160             if(log.size() == 0){
161                 return -1;
162             }
163
164             return last().getTerm();
165         }
166
167         @Override public void removeFrom(long index) {
168             if(index >= log.size() || index < 0){
169                 return;
170             }
171             for(int i=(int) index ; i < log.size() ; i++) {
172                 log.remove(i);
173             }
174         }
175
176         @Override public void append(ReplicatedLogEntry replicatedLogEntry) {
177             log.add(replicatedLogEntry);
178         }
179
180         @Override public void appendAndPersist(
181             ReplicatedLogEntry replicatedLogEntry) {
182             append(replicatedLogEntry);
183         }
184
185         @Override public List<ReplicatedLogEntry> getFrom(long index) {
186             if(index >= log.size() || index < 0){
187                 return Collections.EMPTY_LIST;
188             }
189             List<ReplicatedLogEntry> entries = new ArrayList<>();
190             for(int i=(int) index ; i < log.size() ; i++) {
191                 entries.add(get(i));
192             }
193             return entries;
194         }
195
196         @Override public long size() {
197             return log.size();
198         }
199
200         @Override public boolean isPresent(long index) {
201             if(index >= log.size() || index < 0){
202                 return false;
203             }
204
205             return true;
206         }
207
208         @Override public boolean isInSnapshot(long index) {
209             return false;
210         }
211
212         @Override public Object getSnapshot() {
213             return null;
214         }
215
216         @Override public long getSnapshotIndex() {
217             return -1;
218         }
219
220         @Override public long getSnapshotTerm() {
221             return -1;
222         }
223     }
224
225     public static class MockReplicatedLogEntry implements ReplicatedLogEntry {
226
227         private final long term;
228         private final long index;
229         private final Object data;
230
231         public MockReplicatedLogEntry(long term, long index, Object data){
232
233             this.term = term;
234             this.index = index;
235             this.data = data;
236         }
237
238         @Override public Object getData() {
239             return data;
240         }
241
242         @Override public long getTerm() {
243             return term;
244         }
245
246         @Override public long getIndex() {
247             return index;
248         }
249     }
250 }