ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongFieldUpdaterTest.java
Revision: 1.8
Committed: Tue Jan 20 20:20:56 2004 UTC (20 years, 3 months ago) by dl
Branch: MAIN
CVS Tags: JSR166_PFD
Changes since 1.7: +66 -11 lines
Log Message:
Don't fail if test harness doesn't have sufficient permissions

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