ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.31
Committed: Mon Nov 9 07:54:28 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.30: +19 -9 lines
Log Message:
improve "UnrelatedClass" tests

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