[cvs] / jsr166 / src / test / tck / AtomicIntegerFieldUpdaterTest.java Repository:
ViewVC logotype

Annotation of /jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.31 - (view) (download)

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.AtomicIntegerFieldUpdater;
10 : dl 1.1
11 : jsr166 1.27 import junit.framework.Test;
12 :     import junit.framework.TestSuite;
13 :    
14 : dl 1.2 public class AtomicIntegerFieldUpdaterTest extends JSR166TestCase {
15 : dl 1.1 volatile int x = 0;
16 : dl 1.30 protected volatile int protectedField;
17 :     private volatile int privateField;
18 : dl 1.4 int 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(AtomicIntegerFieldUpdaterTest.class);
25 :     }
26 :    
27 : dl 1.30 // for testing subclass access
28 :     static class AtomicIntegerFieldUpdaterTestSubclass extends AtomicIntegerFieldUpdaterTest {
29 :     public void checkPrivateAccess() {
30 :     try {
31 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a =
32 :     AtomicIntegerFieldUpdater.newUpdater
33 :     (AtomicIntegerFieldUpdaterTest.class, "privateField");
34 :     shouldThrow();
35 :     } catch (RuntimeException success) {
36 :     assertNotNull(success.getCause());
37 :     }
38 :     }
39 :    
40 :     public void checkCompareAndSetProtectedSub() {
41 : jsr166 1.31 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a =
42 :     AtomicIntegerFieldUpdater.newUpdater
43 :     (AtomicIntegerFieldUpdaterTest.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(AtomicIntegerFieldUpdaterTest obj) {
57 :     obj.x = 72;
58 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a =
59 :     AtomicIntegerFieldUpdater.newUpdater
60 :     (AtomicIntegerFieldUpdaterTest.class, "x");
61 :     assertEquals(72, a.get(obj));
62 :     assertTrue(a.compareAndSet(obj, 72, 73));
63 :     assertEquals(73, a.get(obj));
64 :     }
65 :    
66 :     public void checkPrivateAccess(AtomicIntegerFieldUpdaterTest obj) {
67 : dl 1.30 try {
68 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a =
69 :     AtomicIntegerFieldUpdater.newUpdater
70 : jsr166 1.31 (AtomicIntegerFieldUpdaterTest.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 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> updaterFor(String fieldName) {
79 :     return AtomicIntegerFieldUpdater.newUpdater
80 :     (AtomicIntegerFieldUpdaterTest.class, fieldName);
81 :     }
82 :    
83 : dl 1.3 /**
84 : dl 1.7 * Construction with non-existent field throws RuntimeException
85 : dl 1.3 */
86 :     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.2 }
94 :    
95 : dl 1.3 /**
96 : jsr166 1.25 * construction with field not of given type throws IllegalArgumentException
97 : dl 1.3 */
98 :     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.4 */
108 :     public void testConstructor3() {
109 : jsr166 1.11 try {
110 : jsr166 1.24 updaterFor("w");
111 : dl 1.4 shouldThrow();
112 : jsr166 1.25 } catch (IllegalArgumentException success) {}
113 : dl 1.4 }
114 :    
115 :     /**
116 : dl 1.30 * construction using private field from subclass throws RuntimeException
117 :     */
118 :     public void testPrivateFieldInSubclass() {
119 :     AtomicIntegerFieldUpdaterTestSubclass s =
120 :     new AtomicIntegerFieldUpdaterTestSubclass();
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 :     public void testGetSet() {
137 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetLazySet() {
151 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testCompareAndSet() {
165 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     AtomicIntegerFieldUpdaterTestSubclass s =
200 :     new AtomicIntegerFieldUpdaterTestSubclass();
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 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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(AtomicIntegerFieldUpdaterTest.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 :     public void testWeakCompareAndSet() {
231 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndSet() {
245 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndAdd() {
257 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndDecrement() {
270 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndIncrement() {
282 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testAddAndGet() {
298 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 : dl 1.4 * decrementAndGet decrements and returns current value
309 : dl 1.3 */
310 :     public void testDecrementAndGet() {
311 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testIncrementAndGet() {
324 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     }

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8