blob: 55f70a03b7b30623978e56d94e2376b16ca36c2e [file] [log] [blame]
Ray Milkey2eb91672018-04-24 10:07:52 -07001/*
2 * Copyright 2018-present Open Networking Foundation
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
17package org.onosproject.store.primitives;
18
19import org.junit.Before;
20import org.junit.Test;
21import org.onosproject.store.service.ConsistentMapException;
22
23import java.util.concurrent.CompletableFuture;
24
25import static org.hamcrest.MatcherAssert.assertThat;
26import static org.hamcrest.Matchers.is;
27import static org.hamcrest.Matchers.notNullValue;
28import static org.onosproject.store.primitives.TestingCompletableFutures.ErrorState.NONE;
29
30/**
31 * Unit tests for the DefaultAtomicCounter class.
32 */
33
34public class DefaultAtomicCounterMapTest {
35
36 private static final String KEY1 = "myKey1";
37 private static final long VALUE1 = 444L;
38 private static final long DELTA1 = 555L;
39
40 private DefaultAtomicCounterMap<String> atomicCounterMap;
41
42 private DefaultAtomicCounterMap<String> createMap() {
43 AsyncAtomicCounterMapAdapter<String> asyncMap = new AsyncAtomicCounterMapAdapter<>();
44 DefaultAtomicCounterMap<String> map = new DefaultAtomicCounterMap<>(asyncMap, 1000L);
45 assertThat(map, notNullValue());
46 assertThat(map.isEmpty(), is(true));
47 return map;
48 }
49
50 @Before
51 public void setUpMap() {
52 atomicCounterMap = createMap();
53 }
54
55 @Test
56 public void testConstruction() {
57 assertThat(atomicCounterMap.size(), is(0));
58 }
59
60 @Test
61 public void testPutAndGet() {
62 atomicCounterMap.put(KEY1, VALUE1);
63 long value = atomicCounterMap.get(KEY1);
64 assertThat(value, is(VALUE1));
65 }
66
67 @Test
68 public void testGetAndIncrement() {
69 atomicCounterMap.put(KEY1, VALUE1);
70 Long beforeIncrement = atomicCounterMap.getAndIncrement(KEY1);
71 assertThat(beforeIncrement, is(VALUE1));
72 Long afterIncrement = atomicCounterMap.get(KEY1);
73 assertThat(afterIncrement, is(VALUE1 + 1));
74 }
75
76 @Test
77 public void testIncrementAndGet() {
78 atomicCounterMap.put(KEY1, VALUE1);
79 Long afterIncrement = atomicCounterMap.incrementAndGet(KEY1);
80 assertThat(afterIncrement, is(VALUE1 + 1));
81 }
82
83 @Test
84 public void testGetAndDecrement() {
85 atomicCounterMap.put(KEY1, VALUE1);
86 Long beforeDecrement = atomicCounterMap.getAndDecrement(KEY1);
87 assertThat(beforeDecrement, is(VALUE1));
88 Long afterDecrement = atomicCounterMap.get(KEY1);
89 assertThat(afterDecrement, is(VALUE1 - 1));
90 }
91
92 @Test
93 public void testDecrementAndGet() {
94 atomicCounterMap.put(KEY1, VALUE1);
95 Long afterIncrement = atomicCounterMap.decrementAndGet(KEY1);
96 assertThat(afterIncrement, is(VALUE1 - 1));
97 }
98
99 @Test
100 public void testGetAndAdd() {
101 atomicCounterMap.put(KEY1, VALUE1);
102 Long beforeIncrement = atomicCounterMap.getAndAdd(KEY1, DELTA1);
103 assertThat(beforeIncrement, is(VALUE1));
104 Long afterIncrement = atomicCounterMap.get(KEY1);
105 assertThat(afterIncrement, is(VALUE1 + DELTA1));
106 }
107
108 @Test
109 public void testAddAndGet() {
110 atomicCounterMap.put(KEY1, VALUE1);
111 Long afterIncrement = atomicCounterMap.addAndGet(KEY1, DELTA1);
112 assertThat(afterIncrement, is(VALUE1 + DELTA1));
113 }
114
115 @Test
116 public void testPutIfAbsent() {
117 atomicCounterMap.putIfAbsent(KEY1, VALUE1);
118 Long afterIncrement = atomicCounterMap.addAndGet(KEY1, DELTA1);
119 assertThat(afterIncrement, is(VALUE1 + DELTA1));
120 }
121
122 @Test
123 public void testClear() {
124 atomicCounterMap.putIfAbsent(KEY1, VALUE1);
125 assertThat(atomicCounterMap.size(), is(1));
126 atomicCounterMap.clear();
127 assertThat(atomicCounterMap.size(), is(0));
128 }
129
130 @Test
131 public void testReplace() {
132 atomicCounterMap.putIfAbsent(KEY1, VALUE1);
133
134 boolean replaced = atomicCounterMap.replace(KEY1, VALUE1, VALUE1 * 2);
135 assertThat(replaced, is(true));
136 Long afterReplace = atomicCounterMap.get(KEY1);
137 assertThat(afterReplace, is(VALUE1 * 2));
138
139 boolean notReplaced = atomicCounterMap.replace(KEY1, VALUE1, VALUE1 * 2);
140 assertThat(notReplaced, is(false));
141 Long afterNotReplaced = atomicCounterMap.get(KEY1);
142 assertThat(afterNotReplaced, is(VALUE1 * 2));
143 }
144
145 @Test
146 public void testRemove() {
147 atomicCounterMap.putIfAbsent(KEY1, VALUE1);
148 assertThat(atomicCounterMap.size(), is(1));
149 atomicCounterMap.remove(KEY1);
150 assertThat(atomicCounterMap.size(), is(0));
151 }
152
153 @Test
154 public void testRemoveVale() {
155 atomicCounterMap.putIfAbsent(KEY1, VALUE1);
156 assertThat(atomicCounterMap.size(), is(1));
157 atomicCounterMap.remove(KEY1, VALUE1 * 2);
158 assertThat(atomicCounterMap.size(), is(1));
159 atomicCounterMap.remove(KEY1, VALUE1);
160 assertThat(atomicCounterMap.size(), is(0));
161 }
162
163 class AtomicCounterMapWithErrors<K> extends AsyncAtomicCounterMapAdapter<K> {
164
165 TestingCompletableFutures.ErrorState errorState = NONE;
166
167 void setErrorState(TestingCompletableFutures.ErrorState errorState) {
168 this.errorState = errorState;
169 }
170
171 AtomicCounterMapWithErrors() {
172 super();
173 }
174
175 @Override
176 public CompletableFuture<Long> get(K key) {
177 return TestingCompletableFutures.createFuture(errorState);
178 }
179 }
180
181 @Test(expected = ConsistentMapException.Timeout.class)
182 public void testTimeout() {
183 AtomicCounterMapWithErrors<String> atomicCounterMap =
184 new AtomicCounterMapWithErrors<>();
185 atomicCounterMap.setErrorState(TestingCompletableFutures.ErrorState.TIMEOUT_EXCEPTION);
186 DefaultAtomicCounterMap<String> map =
187 new DefaultAtomicCounterMap<>(atomicCounterMap, 1000);
188
189 map.get(KEY1);
190 }
191
192
193 @Test(expected = ConsistentMapException.Interrupted.class)
194 public void testInterrupted() {
195 AtomicCounterMapWithErrors<String> atomicCounterMap =
196 new AtomicCounterMapWithErrors<>();
197 atomicCounterMap.setErrorState(TestingCompletableFutures.ErrorState.INTERRUPTED_EXCEPTION);
198 DefaultAtomicCounterMap<String> map =
199 new DefaultAtomicCounterMap<>(atomicCounterMap, 1000);
200
201 map.get(KEY1);
202 }
203
204 @Test(expected = ConsistentMapException.class)
205 public void testExecutionError() {
206 AtomicCounterMapWithErrors<String> atomicCounterMap =
207 new AtomicCounterMapWithErrors<>();
208 atomicCounterMap.setErrorState(TestingCompletableFutures.ErrorState.EXECUTION_EXCEPTION);
209 DefaultAtomicCounterMap<String> map =
210 new DefaultAtomicCounterMap<>(atomicCounterMap, 1000);
211
212 map.get(KEY1);
213 }
214
215}