ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.8
Committed: Tue Jan 20 20:20:56 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
CVS Tags: JSR166_PFD
Changes since 1.7: +66 -11 lines
Log Message:
Don't fail if test harness doesn't have sufficient permissions

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     * 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     public static void main(String[] args){
19     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 dl 1.1 public void testConstructor(){
29     try{
30     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>
31     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 dl 1.1 public void testConstructor2(){
42     try{
43     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>
44     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 dl 1.1 public void testConstructor3(){
55     try{
56     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>
57     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 dl 1.1 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     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    
82     }
83 dl 1.3 /**
84 dl 1.4 * compareAndSet succeeds in changing value if equal to expected else fails
85 dl 1.3 */
86 dl 1.1 public void testCompareAndSet(){
87 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
88     try {
89     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
90     } catch (RuntimeException ok) {
91     return;
92     }
93 dl 1.1 x = 1;
94     assertTrue(a.compareAndSet(this,1,2));
95     assertTrue(a.compareAndSet(this,2,-4));
96     assertEquals(-4,a.get(this));
97     assertFalse(a.compareAndSet(this,-5,7));
98     assertFalse((7 == a.get(this)));
99     assertTrue(a.compareAndSet(this,-4,7));
100     assertEquals(7,a.get(this));
101     }
102    
103 dl 1.4
104     /**
105     * compareAndSet in one thread enables another waiting for value
106     * to succeed
107     */
108     public void testCompareAndSetInMultipleThreads() {
109     x = 1;
110 dl 1.8 final AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest>a;
111     try {
112     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
113     } catch (RuntimeException ok) {
114     return;
115     }
116 dl 1.4
117     Thread t = new Thread(new Runnable() {
118     public void run() {
119     while(!a.compareAndSet(AtomicLongFieldUpdaterTest.this, 2, 3)) Thread.yield();
120     }});
121     try {
122     t.start();
123     assertTrue(a.compareAndSet(this, 1, 2));
124     t.join(LONG_DELAY_MS);
125     assertFalse(t.isAlive());
126     assertEquals(a.get(this), 3);
127     }
128     catch(Exception e) {
129     unexpectedException();
130     }
131     }
132    
133 dl 1.3 /**
134 dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
135     * to expected
136 dl 1.3 */
137 dl 1.1 public void testWeakCompareAndSet(){
138 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
139     try {
140     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
141     } catch (RuntimeException ok) {
142     return;
143     }
144 dl 1.1 x = 1;
145     while(!a.weakCompareAndSet(this,1,2));
146     while(!a.weakCompareAndSet(this,2,-4));
147     assertEquals(-4,a.get(this));
148     while(!a.weakCompareAndSet(this,-4,7));
149     assertEquals(7,a.get(this));
150     }
151    
152 dl 1.3 /**
153 dl 1.4 * getAndSet returns previous value and sets to given value
154 dl 1.3 */
155 dl 1.1 public void testGetAndSet(){
156 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
157     try {
158     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
159     } catch (RuntimeException ok) {
160     return;
161     }
162 dl 1.1 x = 1;
163     assertEquals(1,a.getAndSet(this, 0));
164     assertEquals(0,a.getAndSet(this,-10));
165     assertEquals(-10,a.getAndSet(this,1));
166     }
167    
168 dl 1.3 /**
169 dl 1.4 * getAndAdd returns previous value and adds given value
170 dl 1.3 */
171 dl 1.1 public void testGetAndAdd(){
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     assertEquals(1,a.getAndAdd(this,2));
180     assertEquals(3,a.get(this));
181     assertEquals(3,a.getAndAdd(this,-4));
182     assertEquals(-1,a.get(this));
183     }
184    
185 dl 1.3 /**
186 dl 1.4 * getAndDecrement returns previous value and decrements
187 dl 1.3 */
188 dl 1.1 public void testGetAndDecrement(){
189 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
190     try {
191     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
192     } catch (RuntimeException ok) {
193     return;
194     }
195 dl 1.1 x = 1;
196     assertEquals(1,a.getAndDecrement(this));
197     assertEquals(0,a.getAndDecrement(this));
198     assertEquals(-1,a.getAndDecrement(this));
199     }
200    
201 dl 1.3 /**
202 dl 1.4 * getAndIncrement returns previous value and increments
203 dl 1.3 */
204 dl 1.1 public void testGetAndIncrement(){
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     assertEquals(1,a.getAndIncrement(this));
213     assertEquals(2,a.get(this));
214     a.set(this,-2);
215     assertEquals(-2,a.getAndIncrement(this));
216     assertEquals(-1,a.getAndIncrement(this));
217     assertEquals(0,a.getAndIncrement(this));
218     assertEquals(1,a.get(this));
219     }
220    
221 dl 1.3 /**
222 dl 1.4 * addAndGet adds given value to current, and returns current value
223 dl 1.3 */
224 dl 1.1 public void testAddAndGet(){
225 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
226     try {
227     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
228     } catch (RuntimeException ok) {
229     return;
230     }
231 dl 1.1 x = 1;
232     assertEquals(3,a.addAndGet(this,2));
233     assertEquals(3,a.get(this));
234     assertEquals(-1,a.addAndGet(this,-4));
235     assertEquals(-1,a.get(this));
236     }
237    
238 dl 1.3 /**
239 dl 1.4 * decrementAndGet decrements and returns current value
240 dl 1.3 */
241 dl 1.1 public void testDecrementAndGet(){
242 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
243     try {
244     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
245     } catch (RuntimeException ok) {
246     return;
247     }
248 dl 1.1 x = 1;
249     assertEquals(0,a.decrementAndGet(this));
250     assertEquals(-1,a.decrementAndGet(this));
251     assertEquals(-2,a.decrementAndGet(this));
252     assertEquals(-2,a.get(this));
253     }
254    
255 dl 1.3 /**
256 dl 1.4 * incrementAndGet increments and returns current value
257 dl 1.3 */
258 dl 1.1 public void testIncrementAndGet(){
259 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
260     try {
261     a = AtomicLongFieldUpdater.newUpdater(AtomicLongFieldUpdaterTest.class, "x");
262     } catch (RuntimeException ok) {
263     return;
264     }
265 dl 1.1 x = 1;
266     assertEquals(2,a.incrementAndGet(this));
267     assertEquals(2,a.get(this));
268     a.set(this,-2);
269     assertEquals(-1,a.incrementAndGet(this));
270     assertEquals(0,a.incrementAndGet(this));
271     assertEquals(1,a.incrementAndGet(this));
272     assertEquals(1,a.get(this));
273     }
274    
275     }