--- jsr166/src/test/tck/AtomicIntegerArrayTest.java 2013/05/30 03:28:55 1.27 +++ jsr166/src/test/tck/AtomicIntegerArrayTest.java 2016/06/16 23:35:25 1.34 @@ -6,14 +6,16 @@ * Pat Fisher, Mike Judd. */ -import junit.framework.*; import java.util.Arrays; import java.util.concurrent.atomic.AtomicIntegerArray; +import junit.framework.Test; +import junit.framework.TestSuite; + public class AtomicIntegerArrayTest extends JSR166TestCase { public static void main(String[] args) { - junit.textui.TestRunner.run(suite()); + main(suite(), args); } public static Test suite() { return new TestSuite(AtomicIntegerArrayTest.class); @@ -34,7 +36,7 @@ public class AtomicIntegerArrayTest exte public void testConstructor2NPE() { try { int[] a = null; - AtomicIntegerArray aa = new AtomicIntegerArray(a); + new AtomicIntegerArray(a); shouldThrow(); } catch (NullPointerException success) {} } @@ -84,6 +86,54 @@ public class AtomicIntegerArrayTest exte aa.addAndGet(index, 1); shouldThrow(); } catch (IndexOutOfBoundsException success) {} + try { + aa.getPlain(index); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.getOpaque(index); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.getAcquire(index); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.setPlain(index, 1); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.setOpaque(index, 1); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.setRelease(index, 1); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.compareAndExchange(index, 1, 2); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.compareAndExchangeAcquire(index, 1, 2); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.compareAndExchangeRelease(index, 1, 2); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.weakCompareAndSetVolatile(index, 1, 2); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.weakCompareAndSetAcquire(index, 1, 2); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} + try { + aa.weakCompareAndSetRelease(index, 1, 2); + shouldThrow(); + } catch (IndexOutOfBoundsException success) {} } } @@ -162,10 +212,10 @@ public class AtomicIntegerArrayTest exte AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); for (int i = 0; i < SIZE; i++) { aa.set(i, 1); - while (!aa.weakCompareAndSet(i, 1, 2)); - while (!aa.weakCompareAndSet(i, 2, -4)); + do {} while (!aa.weakCompareAndSet(i, 1, 2)); + do {} while (!aa.weakCompareAndSet(i, 2, -4)); assertEquals(-4, aa.get(i)); - while (!aa.weakCompareAndSet(i, -4, 7)); + do {} while (!aa.weakCompareAndSet(i, -4, 7)); assertEquals(7, aa.get(i)); } } @@ -272,8 +322,6 @@ public class AtomicIntegerArrayTest exte } } - static final int COUNTDOWN = 100000; - class Counter extends CheckedRunnable { final AtomicIntegerArray aa; volatile int counts; @@ -286,7 +334,7 @@ public class AtomicIntegerArrayTest exte assertTrue(v >= 0); if (v != 0) { done = false; - if (aa.compareAndSet(i, v, v-1)) + if (aa.compareAndSet(i, v, v - 1)) ++counts; } } @@ -302,8 +350,9 @@ public class AtomicIntegerArrayTest exte */ public void testCountingInMultipleThreads() throws InterruptedException { final AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + int countdown = 10000; for (int i = 0; i < SIZE; i++) - aa.set(i, COUNTDOWN); + aa.set(i, countdown); Counter c1 = new Counter(aa); Counter c2 = new Counter(aa); Thread t1 = new Thread(c1); @@ -312,7 +361,7 @@ public class AtomicIntegerArrayTest exte t2.start(); t1.join(); t2.join(); - assertEquals(c1.counts+c2.counts, SIZE * COUNTDOWN); + assertEquals(c1.counts+c2.counts, SIZE * countdown); } /** @@ -339,4 +388,198 @@ public class AtomicIntegerArrayTest exte assertEquals(Arrays.toString(a), aa.toString()); } + // jdk9 + + /** + * getPlain returns the last value set + */ + public void testGetPlainSet() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + assertEquals(1, aa.getPlain(i)); + aa.set(i, 2); + assertEquals(2, aa.getPlain(i)); + aa.set(i, -3); + assertEquals(-3, aa.getPlain(i)); + } + } + + /** + * getOpaque returns the last value set + */ + public void testGetOpaqueSet() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + assertEquals(1, aa.getOpaque(i)); + aa.set(i, 2); + assertEquals(2, aa.getOpaque(i)); + aa.set(i, -3); + assertEquals(-3, aa.getOpaque(i)); + } + } + + /** + * getAcquire returns the last value set + */ + public void testGetAcquireSet() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + assertEquals(1, aa.getAcquire(i)); + aa.set(i, 2); + assertEquals(2, aa.getAcquire(i)); + aa.set(i, -3); + assertEquals(-3, aa.getAcquire(i)); + } + } + + /** + * get returns the last value setPlain + */ + public void testGetSetPlain() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.setPlain(i, 1); + assertEquals(1, aa.get(i)); + aa.setPlain(i, 2); + assertEquals(2, aa.get(i)); + aa.setPlain(i, -3); + assertEquals(-3, aa.get(i)); + } + } + + /** + * get returns the last value setOpaque + */ + public void testGetSetOpaque() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.setOpaque(i, 1); + assertEquals(1, aa.get(i)); + aa.setOpaque(i, 2); + assertEquals(2, aa.get(i)); + aa.setOpaque(i, -3); + assertEquals(-3, aa.get(i)); + } + } + + /** + * get returns the last value setRelease + */ + public void testGetSetRelease() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.setRelease(i, 1); + assertEquals(1, aa.get(i)); + aa.setRelease(i, 2); + assertEquals(2, aa.get(i)); + aa.setRelease(i, -3); + assertEquals(-3, aa.get(i)); + } + } + + /** + * compareAndExchange succeeds in changing value if equal to + * expected else fails + */ + public void testCompareAndExchange() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + assertEquals(1, aa.compareAndExchange(i, 1, 2)); + assertEquals(2, aa.compareAndExchange(i, 2, -4)); + assertEquals(-4, aa.get(i)); + assertEquals(-4, aa.compareAndExchange(i,-5, 7)); + assertEquals(-4, aa.get(i)); + assertEquals(-4, aa.compareAndExchange(i, -4, 7)); + assertEquals(7, aa.get(i)); + } + } + + /** + * compareAndExchangeAcquire succeeds in changing value if equal to + * expected else fails + */ + public void testCompareAndExchangeAcquire() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + assertEquals(1, aa.compareAndExchangeAcquire(i, 1, 2)); + assertEquals(2, aa.compareAndExchangeAcquire(i, 2, -4)); + assertEquals(-4, aa.get(i)); + assertEquals(-4, aa.compareAndExchangeAcquire(i,-5, 7)); + assertEquals(-4, aa.get(i)); + assertEquals(-4, aa.compareAndExchangeAcquire(i, -4, 7)); + assertEquals(7, aa.get(i)); + } + } + + /** + * compareAndExchangeRelease succeeds in changing value if equal to + * expected else fails + */ + public void testCompareAndExchangeRelease() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + assertEquals(1, aa.compareAndExchangeRelease(i, 1, 2)); + assertEquals(2, aa.compareAndExchangeRelease(i, 2, -4)); + assertEquals(-4, aa.get(i)); + assertEquals(-4, aa.compareAndExchangeRelease(i,-5, 7)); + assertEquals(-4, aa.get(i)); + assertEquals(-4, aa.compareAndExchangeRelease(i, -4, 7)); + assertEquals(7, aa.get(i)); + } + } + + /** + * repeated weakCompareAndSetVolatile succeeds in changing value when equal + * to expected + */ + public void testWeakCompareAndSetVolatile() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + do {} while (!aa.weakCompareAndSetVolatile(i, 1, 2)); + do {} while (!aa.weakCompareAndSetVolatile(i, 2, -4)); + assertEquals(-4, aa.get(i)); + do {} while (!aa.weakCompareAndSetVolatile(i, -4, 7)); + assertEquals(7, aa.get(i)); + } + } + + /** + * repeated weakCompareAndSetAcquire succeeds in changing value when equal + * to expected + */ + public void testWeakCompareAndSetAcquire() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + do {} while (!aa.weakCompareAndSetAcquire(i, 1, 2)); + do {} while (!aa.weakCompareAndSetAcquire(i, 2, -4)); + assertEquals(-4, aa.get(i)); + do {} while (!aa.weakCompareAndSetAcquire(i, -4, 7)); + assertEquals(7, aa.get(i)); + } + } + + /** + * repeated weakCompareAndSetRelease succeeds in changing value when equal + * to expected + */ + public void testWeakCompareAndSetRelease() { + AtomicIntegerArray aa = new AtomicIntegerArray(SIZE); + for (int i = 0; i < SIZE; i++) { + aa.set(i, 1); + do {} while (!aa.weakCompareAndSetRelease(i, 1, 2)); + do {} while (!aa.weakCompareAndSetRelease(i, 2, -4)); + assertEquals(-4, aa.get(i)); + do {} while (!aa.weakCompareAndSetRelease(i, -4, 7)); + assertEquals(7, aa.get(i)); + } + } + }