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 package jsr166;
10 
11 import java.util.concurrent.atomic.AtomicReference;
12 
13 import junit.framework.Test;
14 import junit.framework.TestSuite;
15 
16 public class AtomicReferenceTest extends JSR166TestCase {
17     // android-note: Removed because the CTS runner does a bad job of
18     // retrying tests that have suite() declarations.
19     //
20     // public static void main(String[] args) {
21     //     main(suite(), args);
22     // }
23     // public static Test suite() {
24     //     return new TestSuite(AtomicReferenceTest.class);
25     // }
26 
27     /**
28      * constructor initializes to given value
29      */
testConstructor()30     public void testConstructor() {
31         AtomicReference ai = new AtomicReference(one);
32         assertSame(one, ai.get());
33     }
34 
35     /**
36      * default constructed initializes to null
37      */
testConstructor2()38     public void testConstructor2() {
39         AtomicReference ai = new AtomicReference();
40         assertNull(ai.get());
41     }
42 
43     /**
44      * get returns the last value set
45      */
testGetSet()46     public void testGetSet() {
47         AtomicReference ai = new AtomicReference(one);
48         assertSame(one, ai.get());
49         ai.set(two);
50         assertSame(two, ai.get());
51         ai.set(m3);
52         assertSame(m3, ai.get());
53     }
54 
55     /**
56      * get returns the last value lazySet in same thread
57      */
testGetLazySet()58     public void testGetLazySet() {
59         AtomicReference ai = new AtomicReference(one);
60         assertSame(one, ai.get());
61         ai.lazySet(two);
62         assertSame(two, ai.get());
63         ai.lazySet(m3);
64         assertSame(m3, ai.get());
65     }
66 
67     /**
68      * compareAndSet succeeds in changing value if equal to expected else fails
69      */
testCompareAndSet()70     public void testCompareAndSet() {
71         AtomicReference ai = new AtomicReference(one);
72         assertTrue(ai.compareAndSet(one, two));
73         assertTrue(ai.compareAndSet(two, m4));
74         assertSame(m4, ai.get());
75         assertFalse(ai.compareAndSet(m5, seven));
76         assertSame(m4, ai.get());
77         assertTrue(ai.compareAndSet(m4, seven));
78         assertSame(seven, ai.get());
79     }
80 
81     /**
82      * compareAndSet in one thread enables another waiting for value
83      * to succeed
84      */
testCompareAndSetInMultipleThreads()85     public void testCompareAndSetInMultipleThreads() throws Exception {
86         final AtomicReference ai = new AtomicReference(one);
87         Thread t = new Thread(new CheckedRunnable() {
88             public void realRun() {
89                 while (!ai.compareAndSet(two, three))
90                     Thread.yield();
91             }});
92 
93         t.start();
94         assertTrue(ai.compareAndSet(one, two));
95         t.join(LONG_DELAY_MS);
96         assertFalse(t.isAlive());
97         assertSame(three, ai.get());
98     }
99 
100     /**
101      * repeated weakCompareAndSet succeeds in changing value when equal
102      * to expected
103      */
testWeakCompareAndSet()104     public void testWeakCompareAndSet() {
105         AtomicReference ai = new AtomicReference(one);
106         do {} while (!ai.weakCompareAndSet(one, two));
107         do {} while (!ai.weakCompareAndSet(two, m4));
108         assertSame(m4, ai.get());
109         do {} while (!ai.weakCompareAndSet(m4, seven));
110         assertSame(seven, ai.get());
111     }
112 
113     /**
114      * getAndSet returns previous value and sets to given value
115      */
testGetAndSet()116     public void testGetAndSet() {
117         AtomicReference ai = new AtomicReference(one);
118         assertSame(one, ai.getAndSet(zero));
119         assertSame(zero, ai.getAndSet(m10));
120         assertSame(m10, ai.getAndSet(one));
121     }
122 
123     /**
124      * a deserialized serialized atomic holds same value
125      */
testSerialization()126     public void testSerialization() throws Exception {
127         AtomicReference x = new AtomicReference();
128         AtomicReference y = serialClone(x);
129         assertNotSame(x, y);
130         x.set(one);
131         AtomicReference z = serialClone(x);
132         assertNotSame(y, z);
133         assertEquals(one, x.get());
134         assertEquals(null, y.get());
135         assertEquals(one, z.get());
136     }
137 
138     /**
139      * toString returns current value.
140      */
testToString()141     public void testToString() {
142         AtomicReference<Integer> ai = new AtomicReference<Integer>(one);
143         assertEquals(one.toString(), ai.toString());
144         ai.set(two);
145         assertEquals(two.toString(), ai.toString());
146     }
147 
148 }
149