ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java
Revision: 1.33
Committed: Wed Sep 20 00:59:17 2017 UTC (6 years, 7 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.32: +2 -3 lines
Log Message:
8187607: [Testbug] Atomic*FieldUpdaterTest.checkPrivateAccess uses nested classes

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 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     }