ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongArrayTest.java
Revision: 1.35
Committed: Fri Jun 17 19:00:48 2016 UTC (7 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.34: +0 -242 lines
Log Message:
split jdk9 Atomic tests into separate *9Test.java files

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.6 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.19 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.10 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.21 import java.util.Arrays;
10     import java.util.concurrent.atomic.AtomicLongArray;
11 dl 1.1
12 jsr166 1.28 import junit.framework.Test;
13     import junit.framework.TestSuite;
14    
15 dl 1.3 public class AtomicLongArrayTest extends JSR166TestCase {
16 jsr166 1.16 public static void main(String[] args) {
17 jsr166 1.31 main(suite(), args);
18 dl 1.1 }
19     public static Test suite() {
20     return new TestSuite(AtomicLongArrayTest.class);
21     }
22    
23 dl 1.4 /**
24 dl 1.5 * constructor creates array of given size with all elements zero
25 dl 1.4 */
26 jsr166 1.12 public void testConstructor() {
27 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
28     for (int i = 0; i < SIZE; i++)
29     assertEquals(0, aa.get(i));
30 dl 1.1 }
31    
32 dl 1.4 /**
33 dl 1.7 * constructor with null array throws NPE
34     */
35     public void testConstructor2NPE() {
36     try {
37     long[] a = null;
38 jsr166 1.30 new AtomicLongArray(a);
39 jsr166 1.13 shouldThrow();
40     } catch (NullPointerException success) {}
41 dl 1.7 }
42    
43     /**
44     * constructor with array is of same size and has all elements
45     */
46     public void testConstructor2() {
47 jsr166 1.22 long[] a = { 17L, 3L, -42L, 99L, -7L };
48 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(a);
49     assertEquals(a.length, aa.length());
50     for (int i = 0; i < a.length; i++)
51     assertEquals(a[i], aa.get(i));
52 dl 1.7 }
53    
54     /**
55 dl 1.5 * get and set for out of bound indices throw IndexOutOfBoundsException
56     */
57 jsr166 1.12 public void testIndexing() {
58 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
59     for (int index : new int[] { -1, SIZE }) {
60     try {
61     aa.get(index);
62     shouldThrow();
63     } catch (IndexOutOfBoundsException success) {}
64     try {
65     aa.set(index, 1);
66     shouldThrow();
67     } catch (IndexOutOfBoundsException success) {}
68     try {
69     aa.lazySet(index, 1);
70     shouldThrow();
71     } catch (IndexOutOfBoundsException success) {}
72     try {
73     aa.compareAndSet(index, 1, 2);
74     shouldThrow();
75     } catch (IndexOutOfBoundsException success) {}
76     try {
77     aa.weakCompareAndSet(index, 1, 2);
78     shouldThrow();
79     } catch (IndexOutOfBoundsException success) {}
80     try {
81     aa.getAndAdd(index, 1);
82     shouldThrow();
83     } catch (IndexOutOfBoundsException success) {}
84     try {
85     aa.addAndGet(index, 1);
86     shouldThrow();
87     } catch (IndexOutOfBoundsException success) {}
88 dl 1.5 }
89     }
90    
91     /**
92     * get returns the last value set at index
93 dl 1.4 */
94 jsr166 1.12 public void testGetSet() {
95 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
96     for (int i = 0; i < SIZE; i++) {
97     aa.set(i, 1);
98     assertEquals(1, aa.get(i));
99     aa.set(i, 2);
100     assertEquals(2, aa.get(i));
101     aa.set(i, -3);
102     assertEquals(-3, aa.get(i));
103 dl 1.1 }
104     }
105    
106 dl 1.4 /**
107 dl 1.9 * get returns the last value lazySet at index by same thread
108     */
109 jsr166 1.12 public void testGetLazySet() {
110 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
111     for (int i = 0; i < SIZE; i++) {
112     aa.lazySet(i, 1);
113     assertEquals(1, aa.get(i));
114     aa.lazySet(i, 2);
115     assertEquals(2, aa.get(i));
116     aa.lazySet(i, -3);
117     assertEquals(-3, aa.get(i));
118 dl 1.9 }
119     }
120    
121     /**
122 dl 1.5 * compareAndSet succeeds in changing value if equal to expected else fails
123 dl 1.4 */
124 jsr166 1.12 public void testCompareAndSet() {
125 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
126     for (int i = 0; i < SIZE; i++) {
127     aa.set(i, 1);
128     assertTrue(aa.compareAndSet(i, 1, 2));
129     assertTrue(aa.compareAndSet(i, 2, -4));
130     assertEquals(-4, aa.get(i));
131     assertFalse(aa.compareAndSet(i, -5, 7));
132     assertEquals(-4, aa.get(i));
133     assertTrue(aa.compareAndSet(i, -4, 7));
134     assertEquals(7, aa.get(i));
135 dl 1.1 }
136     }
137    
138 dl 1.4 /**
139 dl 1.5 * compareAndSet in one thread enables another waiting for value
140     * to succeed
141     */
142 jsr166 1.13 public void testCompareAndSetInMultipleThreads() throws InterruptedException {
143 dl 1.5 final AtomicLongArray a = new AtomicLongArray(1);
144     a.set(0, 1);
145 jsr166 1.14 Thread t = new Thread(new CheckedRunnable() {
146     public void realRun() {
147     while (!a.compareAndSet(0, 2, 3))
148     Thread.yield();
149     }});
150 jsr166 1.13
151     t.start();
152     assertTrue(a.compareAndSet(0, 1, 2));
153     t.join(LONG_DELAY_MS);
154     assertFalse(t.isAlive());
155 jsr166 1.24 assertEquals(3, a.get(0));
156 dl 1.5 }
157    
158     /**
159     * repeated weakCompareAndSet succeeds in changing value when equal
160 jsr166 1.10 * to expected
161 dl 1.4 */
162 jsr166 1.12 public void testWeakCompareAndSet() {
163 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
164     for (int i = 0; i < SIZE; i++) {
165     aa.set(i, 1);
166 jsr166 1.29 do {} while (!aa.weakCompareAndSet(i, 1, 2));
167     do {} while (!aa.weakCompareAndSet(i, 2, -4));
168 jsr166 1.25 assertEquals(-4, aa.get(i));
169 jsr166 1.29 do {} while (!aa.weakCompareAndSet(i, -4, 7));
170 jsr166 1.25 assertEquals(7, aa.get(i));
171 dl 1.1 }
172     }
173    
174 dl 1.4 /**
175 jsr166 1.18 * getAndSet returns previous value and sets to given value at given index
176 dl 1.4 */
177 jsr166 1.12 public void testGetAndSet() {
178 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
179     for (int i = 0; i < SIZE; i++) {
180     aa.set(i, 1);
181     assertEquals(1, aa.getAndSet(i, 0));
182     assertEquals(0, aa.getAndSet(i, -10));
183     assertEquals(-10, aa.getAndSet(i, 1));
184 dl 1.1 }
185     }
186    
187 dl 1.4 /**
188 jsr166 1.18 * getAndAdd returns previous value and adds given value
189 dl 1.4 */
190 jsr166 1.12 public void testGetAndAdd() {
191 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
192     for (int i = 0; i < SIZE; i++) {
193     aa.set(i, 1);
194     assertEquals(1, aa.getAndAdd(i, 2));
195     assertEquals(3, aa.get(i));
196     assertEquals(3, aa.getAndAdd(i, -4));
197     assertEquals(-1, aa.get(i));
198 dl 1.1 }
199     }
200    
201 dl 1.4 /**
202 dl 1.5 * getAndDecrement returns previous value and decrements
203 dl 1.4 */
204 jsr166 1.12 public void testGetAndDecrement() {
205 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
206     for (int i = 0; i < SIZE; i++) {
207     aa.set(i, 1);
208     assertEquals(1, aa.getAndDecrement(i));
209     assertEquals(0, aa.getAndDecrement(i));
210     assertEquals(-1, aa.getAndDecrement(i));
211 dl 1.1 }
212     }
213    
214 dl 1.4 /**
215 dl 1.5 * getAndIncrement returns previous value and increments
216 dl 1.4 */
217 jsr166 1.12 public void testGetAndIncrement() {
218 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
219     for (int i = 0; i < SIZE; i++) {
220     aa.set(i, 1);
221     assertEquals(1, aa.getAndIncrement(i));
222     assertEquals(2, aa.get(i));
223     aa.set(i, -2);
224     assertEquals(-2, aa.getAndIncrement(i));
225     assertEquals(-1, aa.getAndIncrement(i));
226     assertEquals(0, aa.getAndIncrement(i));
227     assertEquals(1, aa.get(i));
228 dl 1.1 }
229     }
230    
231 dl 1.4 /**
232 jsr166 1.18 * addAndGet adds given value to current, and returns current value
233 dl 1.4 */
234 dl 1.1 public void testAddAndGet() {
235 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
236     for (int i = 0; i < SIZE; i++) {
237     aa.set(i, 1);
238     assertEquals(3, aa.addAndGet(i, 2));
239     assertEquals(3, aa.get(i));
240     assertEquals(-1, aa.addAndGet(i, -4));
241     assertEquals(-1, aa.get(i));
242 dl 1.1 }
243     }
244    
245 dl 1.4 /**
246 dl 1.5 * decrementAndGet decrements and returns current value
247 dl 1.4 */
248 jsr166 1.12 public void testDecrementAndGet() {
249 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
250     for (int i = 0; i < SIZE; i++) {
251     aa.set(i, 1);
252     assertEquals(0, aa.decrementAndGet(i));
253     assertEquals(-1, aa.decrementAndGet(i));
254     assertEquals(-2, aa.decrementAndGet(i));
255     assertEquals(-2, aa.get(i));
256 dl 1.1 }
257     }
258    
259 dl 1.4 /**
260 dl 1.5 * incrementAndGet increments and returns current value
261 dl 1.4 */
262 dl 1.1 public void testIncrementAndGet() {
263 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(SIZE);
264     for (int i = 0; i < SIZE; i++) {
265     aa.set(i, 1);
266     assertEquals(2, aa.incrementAndGet(i));
267     assertEquals(2, aa.get(i));
268     aa.set(i, -2);
269     assertEquals(-1, aa.incrementAndGet(i));
270     assertEquals(0, aa.incrementAndGet(i));
271     assertEquals(1, aa.incrementAndGet(i));
272     assertEquals(1, aa.get(i));
273 dl 1.1 }
274     }
275 dl 1.2
276 jsr166 1.17 class Counter extends CheckedRunnable {
277 jsr166 1.25 final AtomicLongArray aa;
278 dl 1.3 volatile long counts;
279 jsr166 1.25 Counter(AtomicLongArray a) { aa = a; }
280 jsr166 1.17 public void realRun() {
281 dl 1.3 for (;;) {
282     boolean done = true;
283 jsr166 1.25 for (int i = 0; i < aa.length(); i++) {
284     long v = aa.get(i);
285 jsr166 1.17 assertTrue(v >= 0);
286 dl 1.3 if (v != 0) {
287     done = false;
288 jsr166 1.32 if (aa.compareAndSet(i, v, v - 1))
289 dl 1.3 ++counts;
290     }
291     }
292     if (done)
293     break;
294     }
295     }
296     }
297    
298 dl 1.4 /**
299 dl 1.5 * Multiple threads using same array of counters successfully
300     * update a number of times equal to total count
301 dl 1.4 */
302 jsr166 1.13 public void testCountingInMultipleThreads() throws InterruptedException {
303 jsr166 1.25 final AtomicLongArray aa = new AtomicLongArray(SIZE);
304 jsr166 1.27 long countdown = 10000;
305 jsr166 1.25 for (int i = 0; i < SIZE; i++)
306 jsr166 1.27 aa.set(i, countdown);
307 jsr166 1.25 Counter c1 = new Counter(aa);
308     Counter c2 = new Counter(aa);
309 jsr166 1.13 Thread t1 = new Thread(c1);
310     Thread t2 = new Thread(c2);
311     t1.start();
312     t2.start();
313     t1.join();
314     t2.join();
315 jsr166 1.27 assertEquals(c1.counts+c2.counts, SIZE * countdown);
316 dl 1.3 }
317    
318 dl 1.4 /**
319 dl 1.5 * a deserialized serialized array holds same values
320 dl 1.4 */
321 jsr166 1.13 public void testSerialization() throws Exception {
322 jsr166 1.21 AtomicLongArray x = new AtomicLongArray(SIZE);
323 jsr166 1.25 for (int i = 0; i < SIZE; i++)
324 jsr166 1.21 x.set(i, -i);
325     AtomicLongArray y = serialClone(x);
326 jsr166 1.26 assertNotSame(x, y);
327 jsr166 1.21 assertEquals(x.length(), y.length());
328 jsr166 1.25 for (int i = 0; i < SIZE; i++) {
329 jsr166 1.21 assertEquals(x.get(i), y.get(i));
330 dl 1.2 }
331 dl 1.8 }
332    
333     /**
334     * toString returns current value.
335 jsr166 1.10 */
336 dl 1.8 public void testToString() {
337 jsr166 1.22 long[] a = { 17, 3, -42, 99, -7 };
338 jsr166 1.25 AtomicLongArray aa = new AtomicLongArray(a);
339     assertEquals(Arrays.toString(a), aa.toString());
340 dl 1.2 }
341    
342 dl 1.1 }