ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.32
Committed: Mon Nov 9 18:42:41 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +4 -3 lines
Log Message:
improve tests for caller class != declaring class

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