ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.30
Committed: Sun Nov 8 15:34:01 2015 UTC (8 years, 6 months ago) by dl
Branch: MAIN
Changes since 1.29: +88 -2 lines
Log Message:
Add tests checking the forms of thrown exceptions

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.concurrent.atomic.AtomicLongFieldUpdater;
10 dl 1.1
11 jsr166 1.27 import junit.framework.Test;
12     import junit.framework.TestSuite;
13    
14 dl 1.2 public class AtomicLongFieldUpdaterTest extends JSR166TestCase {
15 dl 1.1 volatile long x = 0;
16 dl 1.30 protected volatile long protectedField;
17     private volatile long privateField;
18 dl 1.4 long w;
19 dl 1.30 float z;
20 jsr166 1.12 public static void main(String[] args) {
21 jsr166 1.29 main(suite(), args);
22 dl 1.1 }
23     public static Test suite() {
24     return new TestSuite(AtomicLongFieldUpdaterTest.class);
25     }
26    
27 dl 1.30 // for testing subclass access
28     static class AtomicLongFieldUpdaterTestSubclass extends AtomicLongFieldUpdaterTest {
29     public void checkPrivateAccess() {
30     try {
31     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a =
32     AtomicLongFieldUpdater.newUpdater
33     (AtomicLongFieldUpdaterTest.class, "privateField");
34     shouldThrow();
35     } catch (RuntimeException success) {
36     assertNotNull(success.getCause());
37     }
38     }
39    
40     public void checkCompareAndSetProtectedSub() {
41     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
42     a = updaterFor("protectedField");
43     protectedField = 1;
44     assertTrue(a.compareAndSet(this, 1, 2));
45     assertTrue(a.compareAndSet(this, 2, -4));
46     assertEquals(-4, a.get(this));
47     assertFalse(a.compareAndSet(this, -5, 7));
48     assertEquals(-4, a.get(this));
49     assertTrue(a.compareAndSet(this, -4, 7));
50     assertEquals(7, a.get(this));
51     }
52     }
53    
54     static class UnrelatedClass {
55     public void checkPrivateAccess() {
56     Exception ex = null;
57     try {
58     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a =
59     AtomicLongFieldUpdater.newUpdater
60     (AtomicLongFieldUpdaterTest.class, "x");
61     } catch (RuntimeException rex) {
62     ex = rex;
63     }
64     if (ex != null) throw new Error();
65     }
66     }
67    
68 jsr166 1.24 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> updaterFor(String fieldName) {
69     return AtomicLongFieldUpdater.newUpdater
70     (AtomicLongFieldUpdaterTest.class, fieldName);
71     }
72    
73 dl 1.3 /**
74 dl 1.7 * Construction with non-existent field throws RuntimeException
75 dl 1.3 */
76 jsr166 1.12 public void testConstructor() {
77 jsr166 1.11 try {
78 jsr166 1.24 updaterFor("y");
79 dl 1.3 shouldThrow();
80 jsr166 1.25 } catch (RuntimeException success) {
81 jsr166 1.26 assertNotNull(success.getCause());
82 jsr166 1.25 }
83 dl 1.1 }
84    
85 dl 1.3 /**
86 jsr166 1.25 * construction with field not of given type throws IllegalArgumentException
87 dl 1.3 */
88 jsr166 1.12 public void testConstructor2() {
89 jsr166 1.11 try {
90 jsr166 1.24 updaterFor("z");
91 dl 1.3 shouldThrow();
92 jsr166 1.25 } catch (IllegalArgumentException success) {}
93 dl 1.1 }
94    
95 dl 1.3 /**
96 jsr166 1.25 * construction with non-volatile field throws IllegalArgumentException
97 dl 1.3 */
98 jsr166 1.12 public void testConstructor3() {
99 jsr166 1.11 try {
100 jsr166 1.24 updaterFor("w");
101 dl 1.3 shouldThrow();
102 jsr166 1.25 } catch (IllegalArgumentException success) {}
103 dl 1.1 }
104    
105 dl 1.3 /**
106 dl 1.30 * construction using private field from subclass throws RuntimeException
107     */
108     public void testPrivateFieldInSubclass() {
109     AtomicLongFieldUpdaterTestSubclass s =
110     new AtomicLongFieldUpdaterTestSubclass();
111     s.checkPrivateAccess();
112     }
113    
114     /**
115     * construction from unrelated class throws RuntimeException
116     */
117     public void testUnrelatedClassAccess() {
118     UnrelatedClass s = new UnrelatedClass();
119     s.checkPrivateAccess();
120     }
121    
122     /**
123 jsr166 1.18 * get returns the last value set or assigned
124 dl 1.3 */
125 jsr166 1.12 public void testGetSet() {
126 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
127 jsr166 1.24 a = updaterFor("x");
128 dl 1.1 x = 1;
129 jsr166 1.22 assertEquals(1, a.get(this));
130     a.set(this, 2);
131     assertEquals(2, a.get(this));
132     a.set(this, -3);
133     assertEquals(-3, a.get(this));
134 dl 1.1 }
135 dl 1.9
136     /**
137 jsr166 1.18 * get returns the last value lazySet by same thread
138 dl 1.9 */
139 jsr166 1.12 public void testGetLazySet() {
140 dl 1.9 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
141 jsr166 1.24 a = updaterFor("x");
142 dl 1.9 x = 1;
143 jsr166 1.22 assertEquals(1, a.get(this));
144     a.lazySet(this, 2);
145     assertEquals(2, a.get(this));
146     a.lazySet(this, -3);
147     assertEquals(-3, a.get(this));
148 dl 1.9 }
149    
150 dl 1.3 /**
151 dl 1.4 * compareAndSet succeeds in changing value if equal to expected else fails
152 dl 1.3 */
153 jsr166 1.12 public void testCompareAndSet() {
154 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
155 jsr166 1.24 a = updaterFor("x");
156 dl 1.1 x = 1;
157 jsr166 1.22 assertTrue(a.compareAndSet(this, 1, 2));
158     assertTrue(a.compareAndSet(this, 2, -4));
159     assertEquals(-4, a.get(this));
160     assertFalse(a.compareAndSet(this, -5, 7));
161     assertEquals(-4, a.get(this));
162     assertTrue(a.compareAndSet(this, -4, 7));
163     assertEquals(7, a.get(this));
164 dl 1.1 }
165    
166 dl 1.4 /**
167 dl 1.30 * compareAndSet succeeds in changing protected field value if
168     * equal to expected else fails
169     */
170     public void testCompareAndSetProtected() {
171     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
172     a = updaterFor("protectedField");
173     protectedField = 1;
174     assertTrue(a.compareAndSet(this, 1, 2));
175     assertTrue(a.compareAndSet(this, 2, -4));
176     assertEquals(-4, a.get(this));
177     assertFalse(a.compareAndSet(this, -5, 7));
178     assertEquals(-4, a.get(this));
179     assertTrue(a.compareAndSet(this, -4, 7));
180     assertEquals(7, a.get(this));
181     }
182    
183     /**
184     * compareAndSet succeeds in changing protected field value if
185     * equal to expected else fails
186     */
187     public void testCompareAndSetProtectedInSubclass() {
188     AtomicLongFieldUpdaterTestSubclass s =
189     new AtomicLongFieldUpdaterTestSubclass();
190     s.checkCompareAndSetProtectedSub();
191     }
192    
193     /**
194 dl 1.4 * compareAndSet in one thread enables another waiting for value
195     * to succeed
196     */
197 jsr166 1.13 public void testCompareAndSetInMultipleThreads() throws Exception {
198 dl 1.4 x = 1;
199 jsr166 1.24 final AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
200     a = updaterFor("x");
201 dl 1.4
202 jsr166 1.14 Thread t = new Thread(new CheckedRunnable() {
203     public void realRun() {
204     while (!a.compareAndSet(AtomicLongFieldUpdaterTest.this, 2, 3))
205     Thread.yield();
206     }});
207 jsr166 1.13
208     t.start();
209     assertTrue(a.compareAndSet(this, 1, 2));
210     t.join(LONG_DELAY_MS);
211     assertFalse(t.isAlive());
212 jsr166 1.23 assertEquals(3, a.get(this));
213 dl 1.4 }
214    
215 dl 1.3 /**
216 dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
217 jsr166 1.10 * to expected
218 dl 1.3 */
219 jsr166 1.12 public void testWeakCompareAndSet() {
220 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
221 jsr166 1.24 a = updaterFor("x");
222 dl 1.1 x = 1;
223 jsr166 1.28 do {} while (!a.weakCompareAndSet(this, 1, 2));
224     do {} while (!a.weakCompareAndSet(this, 2, -4));
225 jsr166 1.22 assertEquals(-4, a.get(this));
226 jsr166 1.28 do {} while (!a.weakCompareAndSet(this, -4, 7));
227 jsr166 1.22 assertEquals(7, a.get(this));
228 dl 1.1 }
229    
230 dl 1.3 /**
231 jsr166 1.18 * getAndSet returns previous value and sets to given value
232 dl 1.3 */
233 jsr166 1.12 public void testGetAndSet() {
234 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
235 jsr166 1.24 a = updaterFor("x");
236 dl 1.1 x = 1;
237 jsr166 1.22 assertEquals(1, a.getAndSet(this, 0));
238     assertEquals(0, a.getAndSet(this, -10));
239     assertEquals(-10, a.getAndSet(this, 1));
240 dl 1.1 }
241    
242 dl 1.3 /**
243 dl 1.4 * getAndAdd returns previous value and adds given value
244 dl 1.3 */
245 jsr166 1.12 public void testGetAndAdd() {
246 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
247 jsr166 1.24 a = updaterFor("x");
248 dl 1.1 x = 1;
249 jsr166 1.22 assertEquals(1, a.getAndAdd(this, 2));
250     assertEquals(3, a.get(this));
251     assertEquals(3, a.getAndAdd(this, -4));
252     assertEquals(-1, a.get(this));
253 dl 1.1 }
254    
255 dl 1.3 /**
256 dl 1.4 * getAndDecrement returns previous value and decrements
257 dl 1.3 */
258 jsr166 1.12 public void testGetAndDecrement() {
259 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
260 jsr166 1.24 a = updaterFor("x");
261 dl 1.1 x = 1;
262 jsr166 1.22 assertEquals(1, a.getAndDecrement(this));
263     assertEquals(0, a.getAndDecrement(this));
264     assertEquals(-1, a.getAndDecrement(this));
265 dl 1.1 }
266    
267 dl 1.3 /**
268 dl 1.4 * getAndIncrement returns previous value and increments
269 dl 1.3 */
270 jsr166 1.12 public void testGetAndIncrement() {
271 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
272 jsr166 1.24 a = updaterFor("x");
273 dl 1.1 x = 1;
274 jsr166 1.22 assertEquals(1, a.getAndIncrement(this));
275     assertEquals(2, a.get(this));
276     a.set(this, -2);
277     assertEquals(-2, a.getAndIncrement(this));
278     assertEquals(-1, a.getAndIncrement(this));
279     assertEquals(0, a.getAndIncrement(this));
280     assertEquals(1, a.get(this));
281 dl 1.1 }
282    
283 dl 1.3 /**
284 dl 1.4 * addAndGet adds given value to current, and returns current value
285 dl 1.3 */
286 jsr166 1.12 public void testAddAndGet() {
287 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
288 jsr166 1.24 a = updaterFor("x");
289 dl 1.1 x = 1;
290 jsr166 1.22 assertEquals(3, a.addAndGet(this, 2));
291     assertEquals(3, a.get(this));
292     assertEquals(-1, a.addAndGet(this, -4));
293     assertEquals(-1, a.get(this));
294 dl 1.1 }
295    
296 dl 1.3 /**
297 jsr166 1.18 * decrementAndGet decrements and returns current value
298 dl 1.3 */
299 jsr166 1.12 public void testDecrementAndGet() {
300 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
301 jsr166 1.24 a = updaterFor("x");
302 dl 1.1 x = 1;
303 jsr166 1.22 assertEquals(0, a.decrementAndGet(this));
304     assertEquals(-1, a.decrementAndGet(this));
305     assertEquals(-2, a.decrementAndGet(this));
306     assertEquals(-2, a.get(this));
307 dl 1.1 }
308    
309 dl 1.3 /**
310 dl 1.4 * incrementAndGet increments and returns current value
311 dl 1.3 */
312 jsr166 1.12 public void testIncrementAndGet() {
313 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
314 jsr166 1.24 a = updaterFor("x");
315 dl 1.1 x = 1;
316 jsr166 1.22 assertEquals(2, a.incrementAndGet(this));
317     assertEquals(2, a.get(this));
318     a.set(this, -2);
319     assertEquals(-1, a.incrementAndGet(this));
320     assertEquals(0, a.incrementAndGet(this));
321     assertEquals(1, a.incrementAndGet(this));
322     assertEquals(1, a.get(this));
323 dl 1.1 }
324    
325     }