ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java
Revision: 1.12
Committed: Mon Nov 16 05:30:07 2009 UTC (14 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.11: +1 -1 lines
Log Message:
whitespace

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     * http://creativecommons.org/licenses/publicdomain
5 jsr166 1.10 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import java.util.concurrent.atomic.*;
10     import junit.framework.*;
11     import java.util.*;
12    
13 dl 1.2 public class AtomicIntegerFieldUpdaterTest extends JSR166TestCase {
14 dl 1.1 volatile int x = 0;
15 dl 1.4 int w;
16 dl 1.2 long z;
17 jsr166 1.12 public static void main(String[] args) {
18 dl 1.1 junit.textui.TestRunner.run(suite());
19     }
20     public static Test suite() {
21     return new TestSuite(AtomicIntegerFieldUpdaterTest.class);
22     }
23    
24 dl 1.3 /**
25 dl 1.7 * Construction with non-existent field throws RuntimeException
26 dl 1.3 */
27     public void testConstructor() {
28 jsr166 1.11 try {
29 jsr166 1.10 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
30 dl 1.1 a = AtomicIntegerFieldUpdater.newUpdater
31 dl 1.5 (AtomicIntegerFieldUpdaterTest.class, "y");
32 dl 1.3 shouldThrow();
33 dl 1.2 }
34     catch (RuntimeException rt) {}
35     }
36    
37 dl 1.3 /**
38 dl 1.4 * construction with field not of given type throws RuntimeException
39 dl 1.3 */
40     public void testConstructor2() {
41 jsr166 1.11 try {
42 jsr166 1.10 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
43 dl 1.2 a = AtomicIntegerFieldUpdater.newUpdater
44 dl 1.5 (AtomicIntegerFieldUpdaterTest.class, "z");
45 dl 1.3 shouldThrow();
46 dl 1.1 }
47     catch (RuntimeException rt) {}
48     }
49    
50 dl 1.3 /**
51 dl 1.4 * construction with non-volatile field throws RuntimeException
52     */
53     public void testConstructor3() {
54 jsr166 1.11 try {
55 jsr166 1.10 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>
56 dl 1.4 a = AtomicIntegerFieldUpdater.newUpdater
57 dl 1.5 (AtomicIntegerFieldUpdaterTest.class, "w");
58 dl 1.4 shouldThrow();
59     }
60     catch (RuntimeException rt) {}
61     }
62    
63     /**
64     * get returns the last value set or assigned
65 dl 1.3 */
66     public void testGetSet() {
67 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
68     try {
69     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
70     } catch (RuntimeException ok) {
71     return;
72     }
73 dl 1.1 x = 1;
74     assertEquals(1,a.get(this));
75     a.set(this,2);
76     assertEquals(2,a.get(this));
77     a.set(this,-3);
78     assertEquals(-3,a.get(this));
79 jsr166 1.10
80 dl 1.1 }
81 dl 1.9
82     /**
83     * get returns the last value lazySet by same thread
84     */
85     public void testGetLazySet() {
86     AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
87     try {
88     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
89     } catch (RuntimeException ok) {
90     return;
91     }
92     x = 1;
93     assertEquals(1,a.get(this));
94     a.lazySet(this,2);
95     assertEquals(2,a.get(this));
96     a.lazySet(this,-3);
97     assertEquals(-3,a.get(this));
98 jsr166 1.10
99 dl 1.9 }
100    
101 dl 1.3 /**
102 dl 1.4 * compareAndSet succeeds in changing value if equal to expected else fails
103 dl 1.3 */
104     public void testCompareAndSet() {
105 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
106     try {
107     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
108     } catch (RuntimeException ok) {
109     return;
110     }
111 dl 1.1 x = 1;
112     assertTrue(a.compareAndSet(this,1,2));
113     assertTrue(a.compareAndSet(this,2,-4));
114     assertEquals(-4,a.get(this));
115     assertFalse(a.compareAndSet(this,-5,7));
116     assertFalse((7 == a.get(this)));
117     assertTrue(a.compareAndSet(this,-4,7));
118     assertEquals(7,a.get(this));
119     }
120    
121 dl 1.4
122     /**
123     * compareAndSet in one thread enables another waiting for value
124     * to succeed
125     */
126     public void testCompareAndSetInMultipleThreads() {
127     x = 1;
128 dl 1.8 final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest>a;
129     try {
130     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
131     } catch (RuntimeException ok) {
132     return;
133     }
134 dl 1.4
135     Thread t = new Thread(new Runnable() {
136     public void run() {
137 jsr166 1.11 while (!a.compareAndSet(AtomicIntegerFieldUpdaterTest.this, 2, 3)) Thread.yield();
138 dl 1.4 }});
139     try {
140     t.start();
141     assertTrue(a.compareAndSet(this, 1, 2));
142     t.join(LONG_DELAY_MS);
143     assertFalse(t.isAlive());
144     assertEquals(a.get(this), 3);
145     }
146 jsr166 1.11 catch (Exception e) {
147 dl 1.4 unexpectedException();
148     }
149     }
150    
151 dl 1.3 /**
152 dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
153 jsr166 1.10 * to expected
154 dl 1.3 */
155     public void testWeakCompareAndSet() {
156 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
157     try {
158     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
159     } catch (RuntimeException ok) {
160     return;
161     }
162 dl 1.1 x = 1;
163 jsr166 1.11 while (!a.weakCompareAndSet(this,1,2));
164     while (!a.weakCompareAndSet(this,2,-4));
165 dl 1.1 assertEquals(-4,a.get(this));
166 jsr166 1.11 while (!a.weakCompareAndSet(this,-4,7));
167 dl 1.1 assertEquals(7,a.get(this));
168     }
169    
170 dl 1.3 /**
171 dl 1.4 * getAndSet returns previous value and sets to given value
172 dl 1.3 */
173     public void testGetAndSet() {
174 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
175     try {
176     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
177     } catch (RuntimeException ok) {
178     return;
179     }
180 dl 1.1 x = 1;
181     assertEquals(1,a.getAndSet(this, 0));
182     assertEquals(0,a.getAndSet(this,-10));
183     assertEquals(-10,a.getAndSet(this,1));
184     }
185    
186 dl 1.3 /**
187 dl 1.4 * getAndAdd returns previous value and adds given value
188 dl 1.3 */
189     public void testGetAndAdd() {
190 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
191     try {
192     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
193     } catch (RuntimeException ok) {
194     return;
195     }
196 dl 1.1 x = 1;
197     assertEquals(1,a.getAndAdd(this,2));
198     assertEquals(3,a.get(this));
199     assertEquals(3,a.getAndAdd(this,-4));
200     assertEquals(-1,a.get(this));
201     }
202    
203 dl 1.3 /**
204 dl 1.4 * getAndDecrement returns previous value and decrements
205 dl 1.3 */
206     public void testGetAndDecrement() {
207 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
208     try {
209     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
210     } catch (RuntimeException ok) {
211     return;
212     }
213 dl 1.1 x = 1;
214     assertEquals(1,a.getAndDecrement(this));
215     assertEquals(0,a.getAndDecrement(this));
216     assertEquals(-1,a.getAndDecrement(this));
217     }
218    
219 dl 1.3 /**
220 dl 1.4 * getAndIncrement returns previous value and increments
221 dl 1.3 */
222     public void testGetAndIncrement() {
223 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
224     try {
225     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
226     } catch (RuntimeException ok) {
227     return;
228     }
229 dl 1.1 x = 1;
230     assertEquals(1,a.getAndIncrement(this));
231     assertEquals(2,a.get(this));
232     a.set(this,-2);
233     assertEquals(-2,a.getAndIncrement(this));
234     assertEquals(-1,a.getAndIncrement(this));
235     assertEquals(0,a.getAndIncrement(this));
236     assertEquals(1,a.get(this));
237     }
238    
239 dl 1.3 /**
240 dl 1.4 * addAndGet adds given value to current, and returns current value
241 dl 1.3 */
242     public void testAddAndGet() {
243 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
244     try {
245     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
246     } catch (RuntimeException ok) {
247     return;
248     }
249 dl 1.1 x = 1;
250     assertEquals(3,a.addAndGet(this,2));
251     assertEquals(3,a.get(this));
252     assertEquals(-1,a.addAndGet(this,-4));
253     assertEquals(-1,a.get(this));
254     }
255    
256 dl 1.3 /**
257 dl 1.4 * decrementAndGet decrements and returns current value
258 dl 1.3 */
259     public void testDecrementAndGet() {
260 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
261     try {
262     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
263     } catch (RuntimeException ok) {
264     return;
265     }
266 dl 1.1 x = 1;
267     assertEquals(0,a.decrementAndGet(this));
268     assertEquals(-1,a.decrementAndGet(this));
269     assertEquals(-2,a.decrementAndGet(this));
270     assertEquals(-2,a.get(this));
271     }
272    
273 dl 1.3 /**
274 dl 1.4 * incrementAndGet increments and returns current value
275 dl 1.3 */
276     public void testIncrementAndGet() {
277 dl 1.8 AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> a;
278     try {
279     a = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class, "x");
280     } catch (RuntimeException ok) {
281     return;
282     }
283 dl 1.1 x = 1;
284     assertEquals(2,a.incrementAndGet(this));
285     assertEquals(2,a.get(this));
286     a.set(this,-2);
287     assertEquals(-1,a.incrementAndGet(this));
288     assertEquals(0,a.incrementAndGet(this));
289     assertEquals(1,a.incrementAndGet(this));
290     assertEquals(1,a.get(this));
291     }
292    
293     }