--- jsr166/src/test/tck/Atomic8Test.java 2015/04/25 04:55:30 1.5 +++ jsr166/src/test/tck/Atomic8Test.java 2017/01/04 06:09:58 1.9 @@ -18,6 +18,9 @@ import java.util.concurrent.atomic.Atomi import junit.framework.Test; import junit.framework.TestSuite; +/** + * Tests of atomic class methods accepting lambdas introduced in JDK8. + */ public class Atomic8Test extends JSR166TestCase { public static void main(String[] args) { @@ -27,30 +30,25 @@ public class Atomic8Test extends JSR166T return new TestSuite(Atomic8Test.class); } - /* - * Tests of atomic class methods accepting lambdas - * introduced in JDK8. - */ - static long addLong17(long x) { return x + 17; } static int addInt17(int x) { return x + 17; } static Integer addInteger17(Integer x) { - return new Integer(x.intValue() + 17); + return x.intValue() + 17; } static Integer sumInteger(Integer x, Integer y) { - return new Integer(x.intValue() + y.intValue()); + return x.intValue() + y.intValue(); } volatile long aLongField; volatile int anIntField; volatile Integer anIntegerField; - AtomicLongFieldUpdater aLongFieldUpdater() { + AtomicLongFieldUpdater aLongFieldUpdater() { return AtomicLongFieldUpdater.newUpdater (Atomic8Test.class, "aLongField"); } - AtomicIntegerFieldUpdater anIntFieldUpdater() { + AtomicIntegerFieldUpdater anIntFieldUpdater() { return AtomicIntegerFieldUpdater.newUpdater (Atomic8Test.class, "anIntField"); } @@ -152,10 +150,10 @@ public class Atomic8Test extends JSR166T * result of supplied function */ public void testReferenceGetAndUpdate() { - AtomicReference a = new AtomicReference(one); - assertEquals(new Integer(1), a.getAndUpdate(Atomic8Test::addInteger17)); - assertEquals(new Integer(18), a.getAndUpdate(Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.get()); + AtomicReference a = new AtomicReference<>(one); + assertEquals((Integer) 1, a.getAndUpdate(Atomic8Test::addInteger17)); + assertEquals((Integer) 18, a.getAndUpdate(Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.get()); } /** @@ -163,10 +161,10 @@ public class Atomic8Test extends JSR166T * returns result. */ public void testReferenceUpdateAndGet() { - AtomicReference a = new AtomicReference(one); - assertEquals(new Integer(18), a.updateAndGet(Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.updateAndGet(Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.get()); + AtomicReference a = new AtomicReference<>(one); + assertEquals((Integer) 18, a.updateAndGet(Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.updateAndGet(Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.get()); } /** @@ -174,10 +172,10 @@ public class Atomic8Test extends JSR166T * with supplied function. */ public void testReferenceGetAndAccumulate() { - AtomicReference a = new AtomicReference(one); - assertEquals(new Integer(1), a.getAndAccumulate(2, Atomic8Test::sumInteger)); - assertEquals(new Integer(3), a.getAndAccumulate(3, Atomic8Test::sumInteger)); - assertEquals(new Integer(6), a.get()); + AtomicReference a = new AtomicReference<>(one); + assertEquals((Integer) 1, a.getAndAccumulate(2, Atomic8Test::sumInteger)); + assertEquals((Integer) 3, a.getAndAccumulate(3, Atomic8Test::sumInteger)); + assertEquals((Integer) 6, a.get()); } /** @@ -185,10 +183,10 @@ public class Atomic8Test extends JSR166T * returns result. */ public void testReferenceAccumulateAndGet() { - AtomicReference a = new AtomicReference(one); - assertEquals(new Integer(7), a.accumulateAndGet(6, Atomic8Test::sumInteger)); - assertEquals(new Integer(10), a.accumulateAndGet(3, Atomic8Test::sumInteger)); - assertEquals(new Integer(10), a.get()); + AtomicReference a = new AtomicReference<>(one); + assertEquals((Integer) 7, a.accumulateAndGet(6, Atomic8Test::sumInteger)); + assertEquals((Integer) 10, a.accumulateAndGet(3, Atomic8Test::sumInteger)); + assertEquals((Integer) 10, a.get()); } /** @@ -291,11 +289,11 @@ public class Atomic8Test extends JSR166T * result of supplied function */ public void testReferenceArrayGetAndUpdate() { - AtomicReferenceArray a = new AtomicReferenceArray(1); + AtomicReferenceArray a = new AtomicReferenceArray<>(1); a.set(0, one); - assertEquals(new Integer(1), a.getAndUpdate(0, Atomic8Test::addInteger17)); - assertEquals(new Integer(18), a.getAndUpdate(0, Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.get(0)); + assertEquals((Integer) 1, a.getAndUpdate(0, Atomic8Test::addInteger17)); + assertEquals((Integer) 18, a.getAndUpdate(0, Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.get(0)); } /** @@ -303,10 +301,10 @@ public class Atomic8Test extends JSR166T * returns result. */ public void testReferenceArrayUpdateAndGet() { - AtomicReferenceArray a = new AtomicReferenceArray(1); + AtomicReferenceArray a = new AtomicReferenceArray<>(1); a.set(0, one); - assertEquals(new Integer(18), a.updateAndGet(0, Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.updateAndGet(0, Atomic8Test::addInteger17)); + assertEquals((Integer) 18, a.updateAndGet(0, Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.updateAndGet(0, Atomic8Test::addInteger17)); } /** @@ -314,11 +312,11 @@ public class Atomic8Test extends JSR166T * with supplied function. */ public void testReferenceArrayGetAndAccumulate() { - AtomicReferenceArray a = new AtomicReferenceArray(1); + AtomicReferenceArray a = new AtomicReferenceArray<>(1); a.set(0, one); - assertEquals(new Integer(1), a.getAndAccumulate(0, 2, Atomic8Test::sumInteger)); - assertEquals(new Integer(3), a.getAndAccumulate(0, 3, Atomic8Test::sumInteger)); - assertEquals(new Integer(6), a.get(0)); + assertEquals((Integer) 1, a.getAndAccumulate(0, 2, Atomic8Test::sumInteger)); + assertEquals((Integer) 3, a.getAndAccumulate(0, 3, Atomic8Test::sumInteger)); + assertEquals((Integer) 6, a.get(0)); } /** @@ -326,10 +324,10 @@ public class Atomic8Test extends JSR166T * returns result. */ public void testReferenceArrayAccumulateAndGet() { - AtomicReferenceArray a = new AtomicReferenceArray(1); + AtomicReferenceArray a = new AtomicReferenceArray<>(1); a.set(0, one); - assertEquals(new Integer(7), a.accumulateAndGet(0, 6, Atomic8Test::sumInteger)); - assertEquals(new Integer(10), a.accumulateAndGet(0, 3, Atomic8Test::sumInteger)); + assertEquals((Integer) 7, a.accumulateAndGet(0, 6, Atomic8Test::sumInteger)); + assertEquals((Integer) 10, a.accumulateAndGet(0, 3, Atomic8Test::sumInteger)); } /** @@ -443,10 +441,10 @@ public class Atomic8Test extends JSR166T public void testReferenceFieldUpdaterGetAndUpdate() { AtomicReferenceFieldUpdater a = anIntegerFieldUpdater(); a.set(this, one); - assertEquals(new Integer(1), a.getAndUpdate(this, Atomic8Test::addInteger17)); - assertEquals(new Integer(18), a.getAndUpdate(this, Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.get(this)); - assertEquals(new Integer(35), anIntegerField); + assertEquals((Integer) 1, a.getAndUpdate(this, Atomic8Test::addInteger17)); + assertEquals((Integer) 18, a.getAndUpdate(this, Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.get(this)); + assertEquals((Integer) 35, anIntegerField); } /** @@ -456,10 +454,10 @@ public class Atomic8Test extends JSR166T public void testReferenceFieldUpdaterUpdateAndGet() { AtomicReferenceFieldUpdater a = anIntegerFieldUpdater(); a.set(this, one); - assertEquals(new Integer(18), a.updateAndGet(this, Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.updateAndGet(this, Atomic8Test::addInteger17)); - assertEquals(new Integer(35), a.get(this)); - assertEquals(new Integer(35), anIntegerField); + assertEquals((Integer) 18, a.updateAndGet(this, Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.updateAndGet(this, Atomic8Test::addInteger17)); + assertEquals((Integer) 35, a.get(this)); + assertEquals((Integer) 35, anIntegerField); } /** @@ -469,10 +467,10 @@ public class Atomic8Test extends JSR166T public void testReferenceFieldUpdaterGetAndAccumulate() { AtomicReferenceFieldUpdater a = anIntegerFieldUpdater(); a.set(this, one); - assertEquals(new Integer(1), a.getAndAccumulate(this, 2, Atomic8Test::sumInteger)); - assertEquals(new Integer(3), a.getAndAccumulate(this, 3, Atomic8Test::sumInteger)); - assertEquals(new Integer(6), a.get(this)); - assertEquals(new Integer(6), anIntegerField); + assertEquals((Integer) 1, a.getAndAccumulate(this, 2, Atomic8Test::sumInteger)); + assertEquals((Integer) 3, a.getAndAccumulate(this, 3, Atomic8Test::sumInteger)); + assertEquals((Integer) 6, a.get(this)); + assertEquals((Integer) 6, anIntegerField); } /** @@ -482,10 +480,10 @@ public class Atomic8Test extends JSR166T public void testReferenceFieldUpdaterAccumulateAndGet() { AtomicReferenceFieldUpdater a = anIntegerFieldUpdater(); a.set(this, one); - assertEquals(new Integer(7), a.accumulateAndGet(this, 6, Atomic8Test::sumInteger)); - assertEquals(new Integer(10), a.accumulateAndGet(this, 3, Atomic8Test::sumInteger)); - assertEquals(new Integer(10), a.get(this)); - assertEquals(new Integer(10), anIntegerField); + assertEquals((Integer) 7, a.accumulateAndGet(this, 6, Atomic8Test::sumInteger)); + assertEquals((Integer) 10, a.accumulateAndGet(this, 3, Atomic8Test::sumInteger)); + assertEquals((Integer) 10, a.get(this)); + assertEquals((Integer) 10, anIntegerField); } /** @@ -503,9 +501,6 @@ public class Atomic8Test extends JSR166T () -> aLongFieldUpdater().getAndUpdate(this, null), () -> anIntFieldUpdater().getAndUpdate(this, null), () -> anIntegerFieldUpdater().getAndUpdate(this, null), - ////() -> aLongFieldUpdater().getAndUpdate(null, Atomic8Test::addLong17), - ////() -> anIntFieldUpdater().getAndUpdate(null, Atomic8Test::addInt17), - ////() -> anIntegerFieldUpdater().getAndUpdate(null, Atomic8Test::addInteger17), }; assertThrows(NullPointerException.class, throwingActions); } @@ -566,4 +561,40 @@ public class Atomic8Test extends JSR166T assertThrows(NullPointerException.class, throwingActions); } + /** + * Object arguments for parameters of type T that are not + * instances of the class passed to the newUpdater call will + * result in a ClassCastException being thrown. + */ + public void testFieldUpdaters_ClassCastException() { + // Use raw types to allow passing wrong object type, provoking CCE + final AtomicLongFieldUpdater longUpdater = aLongFieldUpdater(); + final AtomicIntegerFieldUpdater intUpdater = anIntFieldUpdater(); + final AtomicReferenceFieldUpdater refUpdater = anIntegerFieldUpdater(); + final Object obj = new Object(); + for (Object x : new Object[]{ new Object(), null }) { + Runnable[] throwingActions = { + () -> longUpdater.get(x), + () -> intUpdater.get(x), + () -> refUpdater.get(x), + + () -> longUpdater.set(x, 17L), + () -> intUpdater.set(x, 17), + () -> refUpdater.set(x, (Integer) 17), + + () -> longUpdater.addAndGet(x, 17L), + () -> intUpdater.addAndGet(x, 17), + + () -> longUpdater.getAndUpdate(x, y -> y), + () -> intUpdater.getAndUpdate(x, y -> y), + () -> refUpdater.getAndUpdate(x, y -> y), + + () -> longUpdater.compareAndSet(x, 17L, 42L), + () -> intUpdater.compareAndSet(x, 17, 42), + () -> refUpdater.compareAndSet(x, (Integer) 17, (Integer) 42), + }; + assertThrows(ClassCastException.class, throwingActions); + } + } + }