ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java
Revision: 1.13
Committed: Tue Nov 17 03:12:51 2009 UTC (14 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.12: +7 -11 lines
Log Message:
nicer exception handling

File Contents

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