ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongArrayTest.java
Revision: 1.25
Committed: Wed Aug 10 07:14:48 2011 UTC (12 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.24: +139 -129 lines
Log Message:
minor improvements

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