ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerArrayTest.java
(Generate patch)

Comparing jsr166/src/test/tck/AtomicIntegerArrayTest.java (file contents):
Revision 1.1 by dl, Sun Aug 31 19:24:52 2003 UTC vs.
Revision 1.5 by dl, Thu Sep 25 11:02:41 2003 UTC

# Line 7 | Line 7
7  
8   import junit.framework.*;
9   import java.util.concurrent.atomic.*;
10 + import java.io.*;
11  
12 < public class AtomicIntegerArrayTest extends TestCase
12 < {
13 <    static final int N = 10;
12 > public class AtomicIntegerArrayTest extends JSR166TestCase {
13  
14      public static void main (String[] args) {
15          junit.textui.TestRunner.run (suite());
# Line 19 | Line 18 | public class AtomicIntegerArrayTest exte
18          return new TestSuite(AtomicIntegerArrayTest.class);
19      }
20  
21 <    public void testConstructor(){
22 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
23 <        for (int i = 0; i < N; ++i)
21 >
22 >    /**
23 >     * constructor creates array of given size with all elements zero
24 >     */
25 >    public void testConstructor() {
26 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
27 >        for (int i = 0; i < SIZE; ++i)
28              assertEquals(0,ai.get(i));
29      }
30  
31 <    public void testGetSet(){
32 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
33 <        for (int i = 0; i < N; ++i) {
31 >    /**
32 >     * get and set for out of bound indices throw IndexOutOfBoundsException
33 >     */
34 >    public void testIndexing(){
35 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
36 >        try {
37 >            ai.get(SIZE);
38 >        } catch(IndexOutOfBoundsException success){
39 >        }
40 >        try {
41 >            ai.get(-1);
42 >        } catch(IndexOutOfBoundsException success){
43 >        }
44 >        try {
45 >            ai.set(SIZE, 0);
46 >        } catch(IndexOutOfBoundsException success){
47 >        }
48 >        try {
49 >            ai.set(-1, 0);
50 >        } catch(IndexOutOfBoundsException success){
51 >        }
52 >    }
53 >
54 >    /**
55 >     * get returns the last value set at index
56 >     */
57 >    public void testGetSet() {
58 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
59 >        for (int i = 0; i < SIZE; ++i) {
60              ai.set(i, 1);
61              assertEquals(1,ai.get(i));
62              ai.set(i, 2);
# Line 37 | Line 66 | public class AtomicIntegerArrayTest exte
66          }
67      }
68  
69 <    public void testCompareAndSet(){
70 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
71 <        for (int i = 0; i < N; ++i) {
69 >    /**
70 >     * compareAndSet succeeds in changing value if equal to expected else fails
71 >     */
72 >    public void testCompareAndSet() {
73 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
74 >        for (int i = 0; i < SIZE; ++i) {
75              ai.set(i, 1);
76              assertTrue(ai.compareAndSet(i, 1,2));
77              assertTrue(ai.compareAndSet(i, 2,-4));
# Line 51 | Line 83 | public class AtomicIntegerArrayTest exte
83          }
84      }
85  
86 <    public void testWeakCompareAndSet(){
87 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
88 <        for (int i = 0; i < N; ++i) {
86 >    /**
87 >     * compareAndSet in one thread enables another waiting for value
88 >     * to succeed
89 >     */
90 >    public void testCompareAndSetInMultipleThreads() {
91 >        final AtomicIntegerArray a = new AtomicIntegerArray(1);
92 >        a.set(0, 1);
93 >        Thread t = new Thread(new Runnable() {
94 >                public void run() {
95 >                    while(!a.compareAndSet(0, 2, 3)) Thread.yield();
96 >                }});
97 >        try {
98 >            t.start();
99 >            assertTrue(a.compareAndSet(0, 1, 2));
100 >            t.join(LONG_DELAY_MS);
101 >            assertFalse(t.isAlive());
102 >            assertEquals(a.get(0), 3);
103 >        }
104 >        catch(Exception e) {
105 >            unexpectedException();
106 >        }
107 >    }
108 >
109 >    /**
110 >     * repeated weakCompareAndSet succeeds in changing value when equal
111 >     * to expected
112 >     */
113 >    public void testWeakCompareAndSet() {
114 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
115 >        for (int i = 0; i < SIZE; ++i) {
116              ai.set(i, 1);
117              while(!ai.weakCompareAndSet(i, 1,2));
118              while(!ai.weakCompareAndSet(i, 2,-4));
# Line 63 | Line 122 | public class AtomicIntegerArrayTest exte
122          }
123      }
124  
125 <    public void testGetAndSet(){
126 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
127 <        for (int i = 0; i < N; ++i) {
125 >    /**
126 >     *  getAndSet returns previous value and sets to given value at given index
127 >     */
128 >    public void testGetAndSet() {
129 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
130 >        for (int i = 0; i < SIZE; ++i) {
131              ai.set(i, 1);
132              assertEquals(1,ai.getAndSet(i,0));
133              assertEquals(0,ai.getAndSet(i,-10));
# Line 73 | Line 135 | public class AtomicIntegerArrayTest exte
135          }
136      }
137  
138 <    public void testGetAndAdd(){
139 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
140 <        for (int i = 0; i < N; ++i) {
138 >    /**
139 >     *  getAndAdd returns previous value and adds given value
140 >     */
141 >    public void testGetAndAdd() {
142 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
143 >        for (int i = 0; i < SIZE; ++i) {
144              ai.set(i, 1);
145              assertEquals(1,ai.getAndAdd(i,2));
146              assertEquals(3,ai.get(i));
# Line 84 | Line 149 | public class AtomicIntegerArrayTest exte
149          }
150      }
151  
152 <    public void testGetAndDecrement(){
153 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
154 <        for (int i = 0; i < N; ++i) {
152 >    /**
153 >     * getAndDecrement returns previous value and decrements
154 >     */
155 >    public void testGetAndDecrement() {
156 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
157 >        for (int i = 0; i < SIZE; ++i) {
158              ai.set(i, 1);
159              assertEquals(1,ai.getAndDecrement(i));
160              assertEquals(0,ai.getAndDecrement(i));
# Line 94 | Line 162 | public class AtomicIntegerArrayTest exte
162          }
163      }
164  
165 <    public void testGetAndIncrement(){
166 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
167 <        for (int i = 0; i < N; ++i) {
165 >    /**
166 >     * getAndIncrement returns previous value and increments
167 >     */
168 >    public void testGetAndIncrement() {
169 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
170 >        for (int i = 0; i < SIZE; ++i) {
171              ai.set(i, 1);
172              assertEquals(1,ai.getAndIncrement(i));
173              assertEquals(2,ai.get(i));
# Line 108 | Line 179 | public class AtomicIntegerArrayTest exte
179          }
180      }
181  
182 +    /**
183 +     *  addAndGet adds given value to current, and returns current value
184 +     */
185      public void testAddAndGet() {
186 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
187 <        for (int i = 0; i < N; ++i) {
186 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
187 >        for (int i = 0; i < SIZE; ++i) {
188              ai.set(i, 1);
189              assertEquals(3,ai.addAndGet(i,2));
190              assertEquals(3,ai.get(i));
# Line 119 | Line 193 | public class AtomicIntegerArrayTest exte
193          }
194      }
195  
196 <    public void testDecrementAndGet(){
197 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
198 <        for (int i = 0; i < N; ++i) {
196 >    /**
197 >     * decrementAndGet decrements and returns current value
198 >     */
199 >    public void testDecrementAndGet() {
200 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
201 >        for (int i = 0; i < SIZE; ++i) {
202              ai.set(i, 1);
203              assertEquals(0,ai.decrementAndGet(i));
204              assertEquals(-1,ai.decrementAndGet(i));
# Line 130 | Line 207 | public class AtomicIntegerArrayTest exte
207          }
208      }
209  
210 +    /**
211 +     *  incrementAndGet increments and returns current value
212 +     */
213      public void testIncrementAndGet() {
214 <        AtomicIntegerArray ai = new AtomicIntegerArray(N);
215 <        for (int i = 0; i < N; ++i) {
214 >        AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
215 >        for (int i = 0; i < SIZE; ++i) {
216              ai.set(i, 1);
217              assertEquals(2,ai.incrementAndGet(i));
218              assertEquals(2,ai.get(i));
# Line 144 | Line 224 | public class AtomicIntegerArrayTest exte
224          }
225      }
226  
227 +    static final int COUNTDOWN = 100000;
228 +    
229 +    class Counter implements Runnable {
230 +        final AtomicIntegerArray ai;
231 +        volatile int counts;
232 +        Counter(AtomicIntegerArray a) { ai = a; }
233 +        public void run() {
234 +            for (;;) {
235 +                boolean done = true;
236 +                for (int i = 0; i < ai.length(); ++i) {
237 +                    int v = ai.get(i);
238 +                    threadAssertTrue(v >= 0);
239 +                    if (v != 0) {
240 +                        done = false;
241 +                        if (ai.compareAndSet(i, v, v-1))
242 +                            ++counts;
243 +                    }
244 +                }
245 +                if (done)
246 +                    break;
247 +            }
248 +        }
249 +    }
250 +
251 +    /**
252 +     * Multiple threads using same array of counters successfully
253 +     * update a number of times equal to total count
254 +     */
255 +    public void testCountingInMultipleThreads() {
256 +        try {
257 +            final AtomicIntegerArray ai = new AtomicIntegerArray(SIZE);
258 +            for (int i = 0; i < SIZE; ++i)
259 +                ai.set(i, COUNTDOWN);
260 +            Counter c1 = new Counter(ai);
261 +            Counter c2 = new Counter(ai);
262 +            Thread t1 = new Thread(c1);
263 +            Thread t2 = new Thread(c2);
264 +            t1.start();
265 +            t2.start();
266 +            t1.join();
267 +            t2.join();
268 +            assertEquals(c1.counts+c2.counts, SIZE * COUNTDOWN);
269 +        }
270 +        catch(InterruptedException ie) {
271 +            unexpectedException();
272 +        }
273 +    }
274 +
275 +
276 +    /**
277 +     * a deserialized serialized array holds same values
278 +     */
279 +    public void testSerialization() {
280 +        AtomicIntegerArray l = new AtomicIntegerArray(SIZE);
281 +        for (int i = 0; i < SIZE; ++i)
282 +            l.set(i, -i);
283 +
284 +        try {
285 +            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
286 +            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
287 +            out.writeObject(l);
288 +            out.close();
289 +
290 +            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
291 +            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
292 +            AtomicIntegerArray r = (AtomicIntegerArray) in.readObject();
293 +            for (int i = 0; i < SIZE; ++i) {
294 +                assertEquals(l.get(i), r.get(i));
295 +            }
296 +        } catch(Exception e){
297 +            e.printStackTrace();
298 +            unexpectedException();
299 +        }
300 +    }
301 +
302   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines