ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java
Revision: 1.17
Committed: Tue Dec 1 09:56:28 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +1 -3 lines
Log Message:
use stricter assertions, e.g. assertSame

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