Committed by
Mahesh Poojary Huawei
[ONOS-3163] Test wrapper on VtnEventuallyConsistentMap
Change-Id: Idb61208fb128ee30d04ea967daf190fbf4d88497
Showing
1 changed file
with
242 additions
and
0 deletions
apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/util/VtnEventuallyConsistentMapTest.java
0 → 100644
1 | +/* | ||
2 | + * Copyright 2015 Open Networking Laboratory | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.onosproject.vtnrsc.util; | ||
17 | + | ||
18 | +import java.util.Collection; | ||
19 | +import java.util.HashMap; | ||
20 | +import java.util.LinkedList; | ||
21 | +import java.util.List; | ||
22 | +import java.util.Map; | ||
23 | +import java.util.Set; | ||
24 | +import java.util.concurrent.ExecutorService; | ||
25 | +import java.util.concurrent.ScheduledExecutorService; | ||
26 | +import java.util.concurrent.TimeUnit; | ||
27 | +import java.util.function.BiFunction; | ||
28 | + | ||
29 | +import org.onlab.util.KryoNamespace; | ||
30 | +import org.onosproject.cluster.NodeId; | ||
31 | +import org.onosproject.store.Timestamp; | ||
32 | + | ||
33 | +import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.*; | ||
34 | +import org.onosproject.store.service.EventuallyConsistentMapListener; | ||
35 | +import org.onosproject.store.service.EventuallyConsistentMapEvent; | ||
36 | +import org.onosproject.store.service.EventuallyConsistentMapBuilder; | ||
37 | +import org.onosproject.store.service.EventuallyConsistentMap; | ||
38 | + | ||
39 | +/** | ||
40 | + * Testing version of an Eventually Consistent Map. | ||
41 | + */ | ||
42 | + | ||
43 | +public final class VtnEventuallyConsistentMapTest<K, V> extends VtnEventuallyConsistentMapAdapter<K, V> { | ||
44 | + | ||
45 | + private final HashMap<K, V> map; | ||
46 | + private final String mapName; | ||
47 | + private final List<EventuallyConsistentMapListener<K, V>> listeners; | ||
48 | + private final BiFunction<K, V, Collection<NodeId>> peerUpdateFunction; | ||
49 | + | ||
50 | + private VtnEventuallyConsistentMapTest(String mapName, | ||
51 | + BiFunction<K, V, Collection<NodeId>> peerUpdateFunction) { | ||
52 | + map = new HashMap<>(); | ||
53 | + listeners = new LinkedList<>(); | ||
54 | + this.mapName = mapName; | ||
55 | + this.peerUpdateFunction = peerUpdateFunction; | ||
56 | + } | ||
57 | + | ||
58 | + /** | ||
59 | + * Notify all listeners of an event. | ||
60 | + */ | ||
61 | + private void notifyListeners(EventuallyConsistentMapEvent<K, V> event) { | ||
62 | + listeners.forEach( | ||
63 | + listener -> listener.event(event) | ||
64 | + ); | ||
65 | + } | ||
66 | + | ||
67 | + @Override | ||
68 | + public int size() { | ||
69 | + return map.size(); | ||
70 | + } | ||
71 | + | ||
72 | + @Override | ||
73 | + public boolean isEmpty() { | ||
74 | + return map.isEmpty(); | ||
75 | + } | ||
76 | + | ||
77 | + @Override | ||
78 | + public boolean containsKey(K key) { | ||
79 | + return map.containsKey(key); | ||
80 | + } | ||
81 | + | ||
82 | + @Override | ||
83 | + public boolean containsValue(V value) { | ||
84 | + return map.containsValue(value); | ||
85 | + } | ||
86 | + | ||
87 | + @Override | ||
88 | + public V get(K key) { | ||
89 | + return map.get(key); | ||
90 | + } | ||
91 | + | ||
92 | + @Override | ||
93 | + public void put(K key, V value) { | ||
94 | + map.put(key, value); | ||
95 | + EventuallyConsistentMapEvent<K, V> addEvent = | ||
96 | + new EventuallyConsistentMapEvent<>(mapName, PUT, key, value); | ||
97 | + notifyListeners(addEvent); | ||
98 | + if (peerUpdateFunction != null) { | ||
99 | + peerUpdateFunction.apply(key, value); | ||
100 | + } | ||
101 | + } | ||
102 | + | ||
103 | + @Override | ||
104 | + public V remove(K key) { | ||
105 | + V result = map.remove(key); | ||
106 | + if (result != null) { | ||
107 | + EventuallyConsistentMapEvent<K, V> removeEvent = | ||
108 | + new EventuallyConsistentMapEvent<>(mapName, REMOVE, | ||
109 | + key, map.get(key)); | ||
110 | + notifyListeners(removeEvent); | ||
111 | + } | ||
112 | + return result; | ||
113 | + } | ||
114 | + | ||
115 | + @Override | ||
116 | + public void remove(K key, V value) { | ||
117 | + boolean removed = map.remove(key, value); | ||
118 | + if (removed) { | ||
119 | + EventuallyConsistentMapEvent<K, V> removeEvent = | ||
120 | + new EventuallyConsistentMapEvent<>(mapName, REMOVE, key, value); | ||
121 | + notifyListeners(removeEvent); | ||
122 | + } | ||
123 | + } | ||
124 | + | ||
125 | + @Override | ||
126 | + public V compute(K key, BiFunction<K, V, V> recomputeFunction) { | ||
127 | + return map.compute(key, recomputeFunction); | ||
128 | + } | ||
129 | + | ||
130 | + @Override | ||
131 | + public void putAll(Map<? extends K, ? extends V> m) { | ||
132 | + map.putAll(m); | ||
133 | + } | ||
134 | + | ||
135 | + @Override | ||
136 | + public void clear() { | ||
137 | + map.clear(); | ||
138 | + } | ||
139 | + | ||
140 | + @Override | ||
141 | + public Set<K> keySet() { | ||
142 | + return map.keySet(); | ||
143 | + } | ||
144 | + | ||
145 | + @Override | ||
146 | + public Collection<V> values() { | ||
147 | + return map.values(); | ||
148 | + } | ||
149 | + | ||
150 | + @Override | ||
151 | + public Set<Map.Entry<K, V>> entrySet() { | ||
152 | + return map.entrySet(); | ||
153 | + } | ||
154 | + | ||
155 | + public static <K, V> Builder<K, V> builder() { | ||
156 | + return new Builder<>(); | ||
157 | + } | ||
158 | + | ||
159 | + @Override | ||
160 | + public void addListener(EventuallyConsistentMapListener<K, V> listener) { | ||
161 | + listeners.add(listener); | ||
162 | + } | ||
163 | + | ||
164 | + @Override | ||
165 | + public void removeListener(EventuallyConsistentMapListener<K, V> listener) { | ||
166 | + listeners.remove(listener); | ||
167 | + } | ||
168 | + | ||
169 | + public static class Builder<K, V> implements EventuallyConsistentMapBuilder<K, V> { | ||
170 | + private String name; | ||
171 | + private BiFunction<K, V, Collection<NodeId>> peerUpdateFunction; | ||
172 | + | ||
173 | + @Override | ||
174 | + public EventuallyConsistentMapBuilder<K, V> withName(String name) { | ||
175 | + this.name = name; | ||
176 | + return this; | ||
177 | + } | ||
178 | + | ||
179 | + @Override | ||
180 | + public EventuallyConsistentMapBuilder<K, V> withSerializer(KryoNamespace.Builder serializerBuilder) { | ||
181 | + return this; | ||
182 | + } | ||
183 | + | ||
184 | + @Override | ||
185 | + public EventuallyConsistentMapBuilder<K, V> | ||
186 | + withTimestampProvider(BiFunction<K, V, Timestamp> timestampProvider) { | ||
187 | + return this; | ||
188 | + } | ||
189 | + | ||
190 | + @Override | ||
191 | + public EventuallyConsistentMapBuilder<K, V> withEventExecutor(ExecutorService executor) { | ||
192 | + return this; | ||
193 | + } | ||
194 | + | ||
195 | + @Override | ||
196 | + public EventuallyConsistentMapBuilder<K, V> withCommunicationExecutor(ExecutorService executor) { | ||
197 | + return this; | ||
198 | + } | ||
199 | + | ||
200 | + @Override | ||
201 | + public EventuallyConsistentMapBuilder<K, V> withBackgroundExecutor(ScheduledExecutorService executor) { | ||
202 | + return this; | ||
203 | + } | ||
204 | + | ||
205 | + @Override | ||
206 | + public EventuallyConsistentMapBuilder<K, V> | ||
207 | + withPeerUpdateFunction(BiFunction<K, V, Collection<NodeId>> peerUpdateFunction) { | ||
208 | + this.peerUpdateFunction = peerUpdateFunction; | ||
209 | + return this; | ||
210 | + } | ||
211 | + | ||
212 | + @Override | ||
213 | + public EventuallyConsistentMapBuilder<K, V> withTombstonesDisabled() { | ||
214 | + return this; | ||
215 | + } | ||
216 | + | ||
217 | + @Override | ||
218 | + public EventuallyConsistentMapBuilder<K, V> withAntiEntropyPeriod(long period, TimeUnit unit) { | ||
219 | + return this; | ||
220 | + } | ||
221 | + | ||
222 | + @Override | ||
223 | + public EventuallyConsistentMapBuilder<K, V> withFasterConvergence() { | ||
224 | + return this; | ||
225 | + } | ||
226 | + | ||
227 | + @Override | ||
228 | + public EventuallyConsistentMapBuilder<K, V> withPersistence() { | ||
229 | + return this; | ||
230 | + } | ||
231 | + | ||
232 | + @Override | ||
233 | + public EventuallyConsistentMap<K, V> build() { | ||
234 | + if (name == null) { | ||
235 | + name = "test"; | ||
236 | + } | ||
237 | + return new VtnEventuallyConsistentMapTest<>(name, peerUpdateFunction); | ||
238 | + } | ||
239 | + } | ||
240 | + | ||
241 | +} | ||
242 | + |
-
Please register or login to post a comment