[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.30 - (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 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a =
59 :     AtomicIntegerFieldUpdater.newUpdater
60 :     (AtomicIntegerFieldUpdaterTest.class, "x");
61 :     } catch (RuntimeException rex) {
62 :     ex = rex;
63 :     }
64 :     if (ex != null) throw new Error();
65 :     }
66 :     }
67 :    
68 : jsr166 1.24 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> updaterFor(String fieldName) {
69 :     return AtomicIntegerFieldUpdater.newUpdater
70 :     (AtomicIntegerFieldUpdaterTest.class, fieldName);
71 :     }
72 :    
73 : dl 1.3 /**
74 : dl 1.7 * Construction with non-existent field throws RuntimeException
75 : dl 1.3 */
76 :     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.2 }
84 :    
85 : dl 1.3 /**
86 : jsr166 1.25 * construction with field not of given type throws IllegalArgumentException
87 : dl 1.3 */
88 :     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.4 */
98 :     public void testConstructor3() {
99 : jsr166 1.11 try {
100 : jsr166 1.24 updaterFor("w");
101 : dl 1.4 shouldThrow();
102 : jsr166 1.25 } catch (IllegalArgumentException success) {}
103 : dl 1.4 }
104 :    
105 :     /**
106 : dl 1.30 * construction using private field from subclass throws RuntimeException
107 :     */
108 :     public void testPrivateFieldInSubclass() {
109 :     AtomicIntegerFieldUpdaterTestSubclass s =
110 :     new AtomicIntegerFieldUpdaterTestSubclass();
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 :     public void testGetSet() {
126 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetLazySet() {
140 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testCompareAndSet() {
154 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     AtomicIntegerFieldUpdaterTestSubclass s =
189 :     new AtomicIntegerFieldUpdaterTestSubclass();
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 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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(AtomicIntegerFieldUpdaterTest.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 :     public void testWeakCompareAndSet() {
220 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndSet() {
234 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndAdd() {
246 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndDecrement() {
259 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testGetAndIncrement() {
271 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testAddAndGet() {
287 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 : dl 1.4 * decrementAndGet decrements and returns current value
298 : dl 1.3 */
299 :     public void testDecrementAndGet() {
300 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     public void testIncrementAndGet() {
313 : dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> 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 :     }

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8