ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicLongTest.java
Revision: 1.6
Committed: Sat Dec 27 19:26:43 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.5: +5 -4 lines
Log Message:
Headers reference Creative Commons

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 junit.framework.*;
10 import java.util.concurrent.atomic.*;
11 import java.io.*;
12
13 public class AtomicLongTest extends JSR166TestCase {
14 public static void main (String[] args) {
15 junit.textui.TestRunner.run (suite());
16 }
17 public static Test suite() {
18 return new TestSuite(AtomicLongTest.class);
19 }
20
21 /**
22 * constructor initializes to given value
23 */
24 public void testConstructor(){
25 AtomicLong ai = new AtomicLong(1);
26 assertEquals(1,ai.get());
27 }
28
29 /**
30 * default constructed intializes to zero
31 */
32 public void testConstructor2(){
33 AtomicLong ai = new AtomicLong();
34 assertEquals(0,ai.get());
35 }
36
37 /**
38 * get returns the last value set
39 */
40 public void testGetSet(){
41 AtomicLong ai = new AtomicLong(1);
42 assertEquals(1,ai.get());
43 ai.set(2);
44 assertEquals(2,ai.get());
45 ai.set(-3);
46 assertEquals(-3,ai.get());
47
48 }
49 /**
50 * compareAndSet succeeds in changing value if equal to expected else fails
51 */
52 public void testCompareAndSet(){
53 AtomicLong ai = new AtomicLong(1);
54 assertTrue(ai.compareAndSet(1,2));
55 assertTrue(ai.compareAndSet(2,-4));
56 assertEquals(-4,ai.get());
57 assertFalse(ai.compareAndSet(-5,7));
58 assertFalse((7 == ai.get()));
59 assertTrue(ai.compareAndSet(-4,7));
60 assertEquals(7,ai.get());
61 }
62
63 /**
64 * compareAndSet in one thread enables another waiting for value
65 * to succeed
66 */
67 public void testCompareAndSetInMultipleThreads() {
68 final AtomicLong ai = new AtomicLong(1);
69 Thread t = new Thread(new Runnable() {
70 public void run() {
71 while(!ai.compareAndSet(2, 3)) Thread.yield();
72 }});
73 try {
74 t.start();
75 assertTrue(ai.compareAndSet(1, 2));
76 t.join(LONG_DELAY_MS);
77 assertFalse(t.isAlive());
78 assertEquals(ai.get(), 3);
79 }
80 catch(Exception e) {
81 unexpectedException();
82 }
83 }
84
85 /**
86 * repeated weakCompareAndSet succeeds in changing value when equal
87 * to expected
88 */
89 public void testWeakCompareAndSet(){
90 AtomicLong ai = new AtomicLong(1);
91 while(!ai.weakCompareAndSet(1,2));
92 while(!ai.weakCompareAndSet(2,-4));
93 assertEquals(-4,ai.get());
94 while(!ai.weakCompareAndSet(-4,7));
95 assertEquals(7,ai.get());
96 }
97
98 /**
99 * getAndSet returns previous value and sets to given value
100 */
101 public void testGetAndSet(){
102 AtomicLong ai = new AtomicLong(1);
103 assertEquals(1,ai.getAndSet(0));
104 assertEquals(0,ai.getAndSet(-10));
105 assertEquals(-10,ai.getAndSet(1));
106 }
107
108 /**
109 * getAndAdd returns previous value and adds given value
110 */
111 public void testGetAndAdd(){
112 AtomicLong ai = new AtomicLong(1);
113 assertEquals(1,ai.getAndAdd(2));
114 assertEquals(3,ai.get());
115 assertEquals(3,ai.getAndAdd(-4));
116 assertEquals(-1,ai.get());
117 }
118
119 /**
120 * getAndDecrement returns previous value and decrements
121 */
122 public void testGetAndDecrement(){
123 AtomicLong ai = new AtomicLong(1);
124 assertEquals(1,ai.getAndDecrement());
125 assertEquals(0,ai.getAndDecrement());
126 assertEquals(-1,ai.getAndDecrement());
127 }
128
129 /**
130 * getAndIncrement returns previous value and increments
131 */
132 public void testGetAndIncrement(){
133 AtomicLong ai = new AtomicLong(1);
134 assertEquals(1,ai.getAndIncrement());
135 assertEquals(2,ai.get());
136 ai.set(-2);
137 assertEquals(-2,ai.getAndIncrement());
138 assertEquals(-1,ai.getAndIncrement());
139 assertEquals(0,ai.getAndIncrement());
140 assertEquals(1,ai.get());
141 }
142
143 /**
144 * addAndGet adds given value to current, and returns current value
145 */
146 public void testAddAndGet(){
147 AtomicLong ai = new AtomicLong(1);
148 assertEquals(3,ai.addAndGet(2));
149 assertEquals(3,ai.get());
150 assertEquals(-1,ai.addAndGet(-4));
151 assertEquals(-1,ai.get());
152 }
153
154 /**
155 * decrementAndGet decrements and returns current value
156 */
157 public void testDecrementAndGet(){
158 AtomicLong ai = new AtomicLong(1);
159 assertEquals(0,ai.decrementAndGet());
160 assertEquals(-1,ai.decrementAndGet());
161 assertEquals(-2,ai.decrementAndGet());
162 assertEquals(-2,ai.get());
163 }
164
165 /**
166 * incrementAndGet increments and returns current value
167 */
168 public void testIncrementAndGet(){
169 AtomicLong ai = new AtomicLong(1);
170 assertEquals(2,ai.incrementAndGet());
171 assertEquals(2,ai.get());
172 ai.set(-2);
173 assertEquals(-1,ai.incrementAndGet());
174 assertEquals(0,ai.incrementAndGet());
175 assertEquals(1,ai.incrementAndGet());
176 assertEquals(1,ai.get());
177 }
178
179 /**
180 * a deserialized serialized atomic holds same value
181 */
182 public void testSerialization() {
183 AtomicLong l = new AtomicLong();
184
185 try {
186 l.set(-22);
187 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
188 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
189 out.writeObject(l);
190 out.close();
191
192 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
193 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
194 AtomicLong r = (AtomicLong) in.readObject();
195 assertEquals(l.get(), r.get());
196 } catch(Exception e){
197 unexpectedException();
198 }
199 }
200
201 }