ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongTest.java
Revision: 1.29
Committed: Sat Apr 25 04:55:30 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.28: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import java.util.concurrent.atomic.AtomicLong;
10
11 import junit.framework.Test;
12 import junit.framework.TestSuite;
13
14 public class AtomicLongTest extends JSR166TestCase {
15 public static void main(String[] args) {
16 main(suite(), args);
17 }
18 public static Test suite() {
19 return new TestSuite(AtomicLongTest.class);
20 }
21
22 final long[] VALUES = {
23 Long.MIN_VALUE,
24 Integer.MIN_VALUE, -1, 0, 1, 42, Integer.MAX_VALUE,
25 Long.MAX_VALUE,
26 };
27
28 /**
29 * constructor initializes to given value
30 */
31 public void testConstructor() {
32 AtomicLong ai = new AtomicLong(1);
33 assertEquals(1, ai.get());
34 }
35
36 /**
37 * default constructed initializes to zero
38 */
39 public void testConstructor2() {
40 AtomicLong ai = new AtomicLong();
41 assertEquals(0, ai.get());
42 }
43
44 /**
45 * get returns the last value set
46 */
47 public void testGetSet() {
48 AtomicLong ai = new AtomicLong(1);
49 assertEquals(1, ai.get());
50 ai.set(2);
51 assertEquals(2, ai.get());
52 ai.set(-3);
53 assertEquals(-3, ai.get());
54 }
55
56 /**
57 * get returns the last value lazySet in same thread
58 */
59 public void testGetLazySet() {
60 AtomicLong ai = new AtomicLong(1);
61 assertEquals(1, ai.get());
62 ai.lazySet(2);
63 assertEquals(2, ai.get());
64 ai.lazySet(-3);
65 assertEquals(-3, ai.get());
66 }
67
68 /**
69 * compareAndSet succeeds in changing value if equal to expected else fails
70 */
71 public void testCompareAndSet() {
72 AtomicLong ai = new AtomicLong(1);
73 assertTrue(ai.compareAndSet(1, 2));
74 assertTrue(ai.compareAndSet(2, -4));
75 assertEquals(-4, ai.get());
76 assertFalse(ai.compareAndSet(-5, 7));
77 assertEquals(-4, ai.get());
78 assertTrue(ai.compareAndSet(-4, 7));
79 assertEquals(7, ai.get());
80 }
81
82 /**
83 * compareAndSet in one thread enables another waiting for value
84 * to succeed
85 */
86 public void testCompareAndSetInMultipleThreads() throws Exception {
87 final AtomicLong ai = new AtomicLong(1);
88 Thread t = new Thread(new CheckedRunnable() {
89 public void realRun() {
90 while (!ai.compareAndSet(2, 3))
91 Thread.yield();
92 }});
93
94 t.start();
95 assertTrue(ai.compareAndSet(1, 2));
96 t.join(LONG_DELAY_MS);
97 assertFalse(t.isAlive());
98 assertEquals(3, ai.get());
99 }
100
101 /**
102 * repeated weakCompareAndSet succeeds in changing value when equal
103 * to expected
104 */
105 public void testWeakCompareAndSet() {
106 AtomicLong ai = new AtomicLong(1);
107 do {} while (!ai.weakCompareAndSet(1, 2));
108 do {} while (!ai.weakCompareAndSet(2, -4));
109 assertEquals(-4, ai.get());
110 do {} while (!ai.weakCompareAndSet(-4, 7));
111 assertEquals(7, ai.get());
112 }
113
114 /**
115 * getAndSet returns previous value and sets to given value
116 */
117 public void testGetAndSet() {
118 AtomicLong ai = new AtomicLong(1);
119 assertEquals(1, ai.getAndSet(0));
120 assertEquals(0, ai.getAndSet(-10));
121 assertEquals(-10, ai.getAndSet(1));
122 }
123
124 /**
125 * getAndAdd returns previous value and adds given value
126 */
127 public void testGetAndAdd() {
128 AtomicLong ai = new AtomicLong(1);
129 assertEquals(1, ai.getAndAdd(2));
130 assertEquals(3, ai.get());
131 assertEquals(3, ai.getAndAdd(-4));
132 assertEquals(-1, ai.get());
133 }
134
135 /**
136 * getAndDecrement returns previous value and decrements
137 */
138 public void testGetAndDecrement() {
139 AtomicLong ai = new AtomicLong(1);
140 assertEquals(1, ai.getAndDecrement());
141 assertEquals(0, ai.getAndDecrement());
142 assertEquals(-1, ai.getAndDecrement());
143 }
144
145 /**
146 * getAndIncrement returns previous value and increments
147 */
148 public void testGetAndIncrement() {
149 AtomicLong ai = new AtomicLong(1);
150 assertEquals(1, ai.getAndIncrement());
151 assertEquals(2, ai.get());
152 ai.set(-2);
153 assertEquals(-2, ai.getAndIncrement());
154 assertEquals(-1, ai.getAndIncrement());
155 assertEquals(0, ai.getAndIncrement());
156 assertEquals(1, ai.get());
157 }
158
159 /**
160 * addAndGet adds given value to current, and returns current value
161 */
162 public void testAddAndGet() {
163 AtomicLong ai = new AtomicLong(1);
164 assertEquals(3, ai.addAndGet(2));
165 assertEquals(3, ai.get());
166 assertEquals(-1, ai.addAndGet(-4));
167 assertEquals(-1, ai.get());
168 }
169
170 /**
171 * decrementAndGet decrements and returns current value
172 */
173 public void testDecrementAndGet() {
174 AtomicLong ai = new AtomicLong(1);
175 assertEquals(0, ai.decrementAndGet());
176 assertEquals(-1, ai.decrementAndGet());
177 assertEquals(-2, ai.decrementAndGet());
178 assertEquals(-2, ai.get());
179 }
180
181 /**
182 * incrementAndGet increments and returns current value
183 */
184 public void testIncrementAndGet() {
185 AtomicLong ai = new AtomicLong(1);
186 assertEquals(2, ai.incrementAndGet());
187 assertEquals(2, ai.get());
188 ai.set(-2);
189 assertEquals(-1, ai.incrementAndGet());
190 assertEquals(0, ai.incrementAndGet());
191 assertEquals(1, ai.incrementAndGet());
192 assertEquals(1, ai.get());
193 }
194
195 /**
196 * a deserialized serialized atomic holds same value
197 */
198 public void testSerialization() throws Exception {
199 AtomicLong x = new AtomicLong();
200 AtomicLong y = serialClone(x);
201 assertNotSame(x, y);
202 x.set(-22);
203 AtomicLong z = serialClone(x);
204 assertNotSame(y, z);
205 assertEquals(-22, x.get());
206 assertEquals(0, y.get());
207 assertEquals(-22, z.get());
208 }
209
210 /**
211 * toString returns current value.
212 */
213 public void testToString() {
214 AtomicLong ai = new AtomicLong();
215 assertEquals("0", ai.toString());
216 for (long x : VALUES) {
217 ai.set(x);
218 assertEquals(Long.toString(x), ai.toString());
219 }
220 }
221
222 /**
223 * intValue returns current value.
224 */
225 public void testIntValue() {
226 AtomicLong ai = new AtomicLong();
227 assertEquals(0, ai.intValue());
228 for (long x : VALUES) {
229 ai.set(x);
230 assertEquals((int)x, ai.intValue());
231 }
232 }
233
234 /**
235 * longValue returns current value.
236 */
237 public void testLongValue() {
238 AtomicLong ai = new AtomicLong();
239 assertEquals(0L, ai.longValue());
240 for (long x : VALUES) {
241 ai.set(x);
242 assertEquals(x, ai.longValue());
243 }
244 }
245
246 /**
247 * floatValue returns current value.
248 */
249 public void testFloatValue() {
250 AtomicLong ai = new AtomicLong();
251 assertEquals(0.0f, ai.floatValue());
252 for (long x : VALUES) {
253 ai.set(x);
254 assertEquals((float)x, ai.floatValue());
255 }
256 }
257
258 /**
259 * doubleValue returns current value.
260 */
261 public void testDoubleValue() {
262 AtomicLong ai = new AtomicLong();
263 assertEquals(0.0d, ai.doubleValue());
264 for (long x : VALUES) {
265 ai.set(x);
266 assertEquals((double)x, ai.doubleValue());
267 }
268 }
269
270 }