ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java
Revision: 1.24
Committed: Mon Apr 1 20:58:58 2013 UTC (11 years, 1 month ago) by jsr166
Branch: MAIN
Changes since 1.23: +21 -70 lines
Log Message:
RuntimeException is *not* ok for valid fields; refactor a little

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