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.Arrays; 12 import java.util.concurrent.atomic.AtomicReferenceArray; 13 14 import junit.framework.Test; 15 import junit.framework.TestSuite; 16 17 public class AtomicReferenceArrayTest extends JSR166TestCase { 18 // 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() { 25 // return new TestSuite(AtomicReferenceArrayTest.class); 26 // } 27 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; 44 new AtomicReferenceArray<Integer>(a); 45 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); 179 do {} while (!aa.weakCompareAndSet(i, one, two)); 180 do {} while (!aa.weakCompareAndSet(i, two, m4)); 181 assertSame(m4, aa.get(i)); 182 do {} while (!aa.weakCompareAndSet(i, m4, seven)); 183 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 } 225