ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.33
Committed: Wed Sep 20 00:41:13 2017 UTC (6 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.32: +6 -58 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.AtomicLongFieldUpdater;
10 dl 1.1
11 jsr166 1.27 import junit.framework.Test;
12     import junit.framework.TestSuite;
13    
14 dl 1.2 public class AtomicLongFieldUpdaterTest extends JSR166TestCase {
15 dl 1.1 volatile long x = 0;
16 dl 1.30 protected volatile long protectedField;
17     private volatile long privateField;
18 dl 1.4 long 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(AtomicLongFieldUpdaterTest.class);
25     }
26    
27 jsr166 1.24 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> updaterFor(String fieldName) {
28     return AtomicLongFieldUpdater.newUpdater
29     (AtomicLongFieldUpdaterTest.class, fieldName);
30     }
31    
32 dl 1.3 /**
33 dl 1.7 * Construction with non-existent field throws RuntimeException
34 dl 1.3 */
35 jsr166 1.12 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.1 }
43    
44 dl 1.3 /**
45 jsr166 1.25 * construction with field not of given type throws IllegalArgumentException
46 dl 1.3 */
47 jsr166 1.12 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.3 */
57 jsr166 1.12 public void testConstructor3() {
58 jsr166 1.11 try {
59 jsr166 1.24 updaterFor("w");
60 dl 1.3 shouldThrow();
61 jsr166 1.25 } catch (IllegalArgumentException success) {}
62 dl 1.1 }
63    
64 dl 1.3 /**
65 dl 1.30 * construction using private field from subclass throws RuntimeException
66     */
67     public void testPrivateFieldInSubclass() {
68 jsr166 1.33 new NonNestmates.AtomicLongFieldUpdaterTestSubclass()
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.33 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 jsr166 1.12 public void testGetSet() {
85 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> 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 jsr166 1.12 public void testGetLazySet() {
99 dl 1.9 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> 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 jsr166 1.12 public void testCompareAndSet() {
113 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> 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     AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> 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 NonNestmates.AtomicLongFieldUpdaterTestSubclass s =
148     new NonNestmates.AtomicLongFieldUpdaterTestSubclass();
149 dl 1.30 s.checkCompareAndSetProtectedSub();
150     }
151    
152     /**
153 dl 1.4 * compareAndSet in one thread enables another waiting for value
154     * to succeed
155     */
156 jsr166 1.13 public void testCompareAndSetInMultipleThreads() throws Exception {
157 dl 1.4 x = 1;
158 jsr166 1.24 final AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
159     a = updaterFor("x");
160 dl 1.4
161 jsr166 1.14 Thread t = new Thread(new CheckedRunnable() {
162     public void realRun() {
163     while (!a.compareAndSet(AtomicLongFieldUpdaterTest.this, 2, 3))
164     Thread.yield();
165     }});
166 jsr166 1.13
167     t.start();
168     assertTrue(a.compareAndSet(this, 1, 2));
169     t.join(LONG_DELAY_MS);
170     assertFalse(t.isAlive());
171 jsr166 1.23 assertEquals(3, a.get(this));
172 dl 1.4 }
173    
174 dl 1.3 /**
175 dl 1.4 * repeated weakCompareAndSet succeeds in changing value when equal
176 jsr166 1.10 * to expected
177 dl 1.3 */
178 jsr166 1.12 public void testWeakCompareAndSet() {
179 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
180 jsr166 1.24 a = updaterFor("x");
181 dl 1.1 x = 1;
182 jsr166 1.28 do {} while (!a.weakCompareAndSet(this, 1, 2));
183     do {} while (!a.weakCompareAndSet(this, 2, -4));
184 jsr166 1.22 assertEquals(-4, a.get(this));
185 jsr166 1.28 do {} while (!a.weakCompareAndSet(this, -4, 7));
186 jsr166 1.22 assertEquals(7, a.get(this));
187 dl 1.1 }
188    
189 dl 1.3 /**
190 jsr166 1.18 * getAndSet returns previous value and sets to given value
191 dl 1.3 */
192 jsr166 1.12 public void testGetAndSet() {
193 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
194 jsr166 1.24 a = updaterFor("x");
195 dl 1.1 x = 1;
196 jsr166 1.22 assertEquals(1, a.getAndSet(this, 0));
197     assertEquals(0, a.getAndSet(this, -10));
198     assertEquals(-10, a.getAndSet(this, 1));
199 dl 1.1 }
200    
201 dl 1.3 /**
202 dl 1.4 * getAndAdd returns previous value and adds given value
203 dl 1.3 */
204 jsr166 1.12 public void testGetAndAdd() {
205 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
206 jsr166 1.24 a = updaterFor("x");
207 dl 1.1 x = 1;
208 jsr166 1.22 assertEquals(1, a.getAndAdd(this, 2));
209     assertEquals(3, a.get(this));
210     assertEquals(3, a.getAndAdd(this, -4));
211     assertEquals(-1, a.get(this));
212 dl 1.1 }
213    
214 dl 1.3 /**
215 dl 1.4 * getAndDecrement returns previous value and decrements
216 dl 1.3 */
217 jsr166 1.12 public void testGetAndDecrement() {
218 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
219 jsr166 1.24 a = updaterFor("x");
220 dl 1.1 x = 1;
221 jsr166 1.22 assertEquals(1, a.getAndDecrement(this));
222     assertEquals(0, a.getAndDecrement(this));
223     assertEquals(-1, a.getAndDecrement(this));
224 dl 1.1 }
225    
226 dl 1.3 /**
227 dl 1.4 * getAndIncrement returns previous value and increments
228 dl 1.3 */
229 jsr166 1.12 public void testGetAndIncrement() {
230 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
231 jsr166 1.24 a = updaterFor("x");
232 dl 1.1 x = 1;
233 jsr166 1.22 assertEquals(1, a.getAndIncrement(this));
234     assertEquals(2, a.get(this));
235     a.set(this, -2);
236     assertEquals(-2, a.getAndIncrement(this));
237     assertEquals(-1, a.getAndIncrement(this));
238     assertEquals(0, a.getAndIncrement(this));
239     assertEquals(1, a.get(this));
240 dl 1.1 }
241    
242 dl 1.3 /**
243 dl 1.4 * addAndGet adds given value to current, and returns current value
244 dl 1.3 */
245 jsr166 1.12 public void testAddAndGet() {
246 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
247 jsr166 1.24 a = updaterFor("x");
248 dl 1.1 x = 1;
249 jsr166 1.22 assertEquals(3, a.addAndGet(this, 2));
250     assertEquals(3, a.get(this));
251     assertEquals(-1, a.addAndGet(this, -4));
252     assertEquals(-1, a.get(this));
253 dl 1.1 }
254    
255 dl 1.3 /**
256 jsr166 1.18 * decrementAndGet decrements and returns current value
257 dl 1.3 */
258 jsr166 1.12 public void testDecrementAndGet() {
259 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
260 jsr166 1.24 a = updaterFor("x");
261 dl 1.1 x = 1;
262 jsr166 1.22 assertEquals(0, a.decrementAndGet(this));
263     assertEquals(-1, a.decrementAndGet(this));
264     assertEquals(-2, a.decrementAndGet(this));
265     assertEquals(-2, a.get(this));
266 dl 1.1 }
267    
268 dl 1.3 /**
269 dl 1.4 * incrementAndGet increments and returns current value
270 dl 1.3 */
271 jsr166 1.12 public void testIncrementAndGet() {
272 dl 1.8 AtomicLongFieldUpdater<AtomicLongFieldUpdaterTest> a;
273 jsr166 1.24 a = updaterFor("x");
274 dl 1.1 x = 1;
275 jsr166 1.22 assertEquals(2, a.incrementAndGet(this));
276     assertEquals(2, a.get(this));
277     a.set(this, -2);
278     assertEquals(-1, a.incrementAndGet(this));
279     assertEquals(0, a.incrementAndGet(this));
280     assertEquals(1, a.incrementAndGet(this));
281     assertEquals(1, a.get(this));
282 dl 1.1 }
283    
284     }