[cvs] / jsr166 / src / test / tck / AtomicIntegerFieldUpdaterTest.java Repository:
ViewVC logotype

Annotation of /jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.33 - (view) (download)

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

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8