ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.15
Committed: Sat Nov 21 02:07:26 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.14: +53 -53 lines
Log Message:
untabify

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