blob: f3aab44dbb0c1e13f96e2686f1e91b61fef9f9ee [file] [log] [blame]
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001/*
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
9package jsr166;
10
Calin Juravle8f0d92b2013-08-01 17:26:00 +010011import java.util.Arrays;
12import java.util.concurrent.atomic.AtomicReferenceArray;
13
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010014import junit.framework.Test;
15import junit.framework.TestSuite;
16
Calin Juravle8f0d92b2013-08-01 17:26:00 +010017public class AtomicReferenceArrayTest extends JSR166TestCase {
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010018 // android-note: Removed because the CTS runner does a bad job of
19 // retrying tests that have suite() declarations.
20 //
21 // public static void main(String[] args) {
22 // main(suite(), args);
23 // }
24 // public static Test suite() {
Przemyslaw Szczepaniakb8b75112016-03-11 15:59:10 +000025 // return new TestSuite(AtomicReferenceArrayTest.class);
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010026 // }
Calin Juravle8f0d92b2013-08-01 17:26:00 +010027
28 /**
29 * constructor creates array of given size with all elements null
30 */
31 public void testConstructor() {
32 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
33 for (int i = 0; i < SIZE; i++) {
34 assertNull(aa.get(i));
35 }
36 }
37
38 /**
39 * constructor with null array throws NPE
40 */
41 public void testConstructor2NPE() {
42 try {
43 Integer[] a = null;
Narayan Kamath8e9a0e92015-04-28 11:40:00 +010044 new AtomicReferenceArray<Integer>(a);
Calin Juravle8f0d92b2013-08-01 17:26:00 +010045 shouldThrow();
46 } catch (NullPointerException success) {}
47 }
48
49 /**
50 * constructor with array is of same size and has all elements
51 */
52 public void testConstructor2() {
53 Integer[] a = { two, one, three, four, seven };
54 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(a);
55 assertEquals(a.length, aa.length());
56 for (int i = 0; i < a.length; i++)
57 assertEquals(a[i], aa.get(i));
58 }
59
60 /**
61 * Initialize AtomicReferenceArray<Class> with SubClass[]
62 */
63 public void testConstructorSubClassArray() {
64 Integer[] a = { two, one, three, four, seven };
65 AtomicReferenceArray<Number> aa = new AtomicReferenceArray<Number>(a);
66 assertEquals(a.length, aa.length());
67 for (int i = 0; i < a.length; i++) {
68 assertSame(a[i], aa.get(i));
69 Long x = Long.valueOf(i);
70 aa.set(i, x);
71 assertSame(x, aa.get(i));
72 }
73 }
74
75 /**
76 * get and set for out of bound indices throw IndexOutOfBoundsException
77 */
78 public void testIndexing() {
79 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE);
80 for (int index : new int[] { -1, SIZE }) {
81 try {
82 aa.get(index);
83 shouldThrow();
84 } catch (IndexOutOfBoundsException success) {}
85 try {
86 aa.set(index, null);
87 shouldThrow();
88 } catch (IndexOutOfBoundsException success) {}
89 try {
90 aa.lazySet(index, null);
91 shouldThrow();
92 } catch (IndexOutOfBoundsException success) {}
93 try {
94 aa.compareAndSet(index, null, null);
95 shouldThrow();
96 } catch (IndexOutOfBoundsException success) {}
97 try {
98 aa.weakCompareAndSet(index, null, null);
99 shouldThrow();
100 } catch (IndexOutOfBoundsException success) {}
101 }
102 }
103
104 /**
105 * get returns the last value set at index
106 */
107 public void testGetSet() {
108 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
109 for (int i = 0; i < SIZE; i++) {
110 aa.set(i, one);
111 assertSame(one, aa.get(i));
112 aa.set(i, two);
113 assertSame(two, aa.get(i));
114 aa.set(i, m3);
115 assertSame(m3, aa.get(i));
116 }
117 }
118
119 /**
120 * get returns the last value lazySet at index by same thread
121 */
122 public void testGetLazySet() {
123 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
124 for (int i = 0; i < SIZE; i++) {
125 aa.lazySet(i, one);
126 assertSame(one, aa.get(i));
127 aa.lazySet(i, two);
128 assertSame(two, aa.get(i));
129 aa.lazySet(i, m3);
130 assertSame(m3, aa.get(i));
131 }
132 }
133
134 /**
135 * compareAndSet succeeds in changing value if equal to expected else fails
136 */
137 public void testCompareAndSet() {
138 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
139 for (int i = 0; i < SIZE; i++) {
140 aa.set(i, one);
141 assertTrue(aa.compareAndSet(i, one, two));
142 assertTrue(aa.compareAndSet(i, two, m4));
143 assertSame(m4, aa.get(i));
144 assertFalse(aa.compareAndSet(i, m5, seven));
145 assertSame(m4, aa.get(i));
146 assertTrue(aa.compareAndSet(i, m4, seven));
147 assertSame(seven, aa.get(i));
148 }
149 }
150
151 /**
152 * compareAndSet in one thread enables another waiting for value
153 * to succeed
154 */
155 public void testCompareAndSetInMultipleThreads() throws InterruptedException {
156 final AtomicReferenceArray a = new AtomicReferenceArray(1);
157 a.set(0, one);
158 Thread t = new Thread(new CheckedRunnable() {
159 public void realRun() {
160 while (!a.compareAndSet(0, two, three))
161 Thread.yield();
162 }});
163
164 t.start();
165 assertTrue(a.compareAndSet(0, one, two));
166 t.join(LONG_DELAY_MS);
167 assertFalse(t.isAlive());
168 assertSame(three, a.get(0));
169 }
170
171 /**
172 * repeated weakCompareAndSet succeeds in changing value when equal
173 * to expected
174 */
175 public void testWeakCompareAndSet() {
176 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
177 for (int i = 0; i < SIZE; i++) {
178 aa.set(i, one);
Narayan Kamath8e9a0e92015-04-28 11:40:00 +0100179 do {} while (!aa.weakCompareAndSet(i, one, two));
180 do {} while (!aa.weakCompareAndSet(i, two, m4));
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100181 assertSame(m4, aa.get(i));
Narayan Kamath8e9a0e92015-04-28 11:40:00 +0100182 do {} while (!aa.weakCompareAndSet(i, m4, seven));
Calin Juravle8f0d92b2013-08-01 17:26:00 +0100183 assertSame(seven, aa.get(i));
184 }
185 }
186
187 /**
188 * getAndSet returns previous value and sets to given value at given index
189 */
190 public void testGetAndSet() {
191 AtomicReferenceArray aa = new AtomicReferenceArray(SIZE);
192 for (int i = 0; i < SIZE; i++) {
193 aa.set(i, one);
194 assertSame(one, aa.getAndSet(i, zero));
195 assertSame(zero, aa.getAndSet(i, m10));
196 assertSame(m10, aa.getAndSet(i, one));
197 }
198 }
199
200 /**
201 * a deserialized serialized array holds same values
202 */
203 public void testSerialization() throws Exception {
204 AtomicReferenceArray x = new AtomicReferenceArray(SIZE);
205 for (int i = 0; i < SIZE; i++) {
206 x.set(i, new Integer(-i));
207 }
208 AtomicReferenceArray y = serialClone(x);
209 assertNotSame(x, y);
210 assertEquals(x.length(), y.length());
211 for (int i = 0; i < SIZE; i++) {
212 assertEquals(x.get(i), y.get(i));
213 }
214 }
215
216 /**
217 * toString returns current value.
218 */
219 public void testToString() {
220 Integer[] a = { two, one, three, four, seven };
221 AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(a);
222 assertEquals(Arrays.toString(a), aa.toString());
223 }
224}