--- jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java 2013/05/30 03:28:55 1.26 +++ jsr166/src/test/tck/AtomicIntegerFieldUpdaterTest.java 2015/11/08 15:34:00 1.30 @@ -6,20 +6,65 @@ * Pat Fisher, Mike Judd. */ -import junit.framework.*; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import junit.framework.Test; +import junit.framework.TestSuite; + public class AtomicIntegerFieldUpdaterTest extends JSR166TestCase { volatile int x = 0; + protected volatile int protectedField; + private volatile int privateField; int w; - long z; + float z; public static void main(String[] args) { - junit.textui.TestRunner.run(suite()); + main(suite(), args); } public static Test suite() { return new TestSuite(AtomicIntegerFieldUpdaterTest.class); } + // for testing subclass access + static class AtomicIntegerFieldUpdaterTestSubclass extends AtomicIntegerFieldUpdaterTest { + public void checkPrivateAccess() { + try { + AtomicIntegerFieldUpdater a = + AtomicIntegerFieldUpdater.newUpdater + (AtomicIntegerFieldUpdaterTest.class, "privateField"); + shouldThrow(); + } catch (RuntimeException success) { + assertNotNull(success.getCause()); + } + } + + public void checkCompareAndSetProtectedSub() { + AtomicIntegerFieldUpdater a; + a = updaterFor("protectedField"); + protectedField = 1; + assertTrue(a.compareAndSet(this, 1, 2)); + assertTrue(a.compareAndSet(this, 2, -4)); + assertEquals(-4, a.get(this)); + assertFalse(a.compareAndSet(this, -5, 7)); + assertEquals(-4, a.get(this)); + assertTrue(a.compareAndSet(this, -4, 7)); + assertEquals(7, a.get(this)); + } + } + + static class UnrelatedClass { + public void checkPrivateAccess() { + Exception ex = null; + try { + AtomicIntegerFieldUpdater a = + AtomicIntegerFieldUpdater.newUpdater + (AtomicIntegerFieldUpdaterTest.class, "x"); + } catch (RuntimeException rex) { + ex = rex; + } + if (ex != null) throw new Error(); + } + } + AtomicIntegerFieldUpdater updaterFor(String fieldName) { return AtomicIntegerFieldUpdater.newUpdater (AtomicIntegerFieldUpdaterTest.class, fieldName); @@ -58,6 +103,23 @@ public class AtomicIntegerFieldUpdaterTe } /** + * construction using private field from subclass throws RuntimeException + */ + public void testPrivateFieldInSubclass() { + AtomicIntegerFieldUpdaterTestSubclass s = + new AtomicIntegerFieldUpdaterTestSubclass(); + s.checkPrivateAccess(); + } + + /** + * construction from unrelated class throws RuntimeException + */ + public void testUnrelatedClassAccess() { + UnrelatedClass s = new UnrelatedClass(); + s.checkPrivateAccess(); + } + + /** * get returns the last value set or assigned */ public void testGetSet() { @@ -102,6 +164,33 @@ public class AtomicIntegerFieldUpdaterTe } /** + * compareAndSet succeeds in changing protected field value if + * equal to expected else fails + */ + public void testCompareAndSetProtected() { + AtomicIntegerFieldUpdater a; + a = updaterFor("protectedField"); + protectedField = 1; + assertTrue(a.compareAndSet(this, 1, 2)); + assertTrue(a.compareAndSet(this, 2, -4)); + assertEquals(-4, a.get(this)); + assertFalse(a.compareAndSet(this, -5, 7)); + assertEquals(-4, a.get(this)); + assertTrue(a.compareAndSet(this, -4, 7)); + assertEquals(7, a.get(this)); + } + + /** + * compareAndSet succeeds in changing protected field value if + * equal to expected else fails + */ + public void testCompareAndSetProtectedInSubclass() { + AtomicIntegerFieldUpdaterTestSubclass s = + new AtomicIntegerFieldUpdaterTestSubclass(); + s.checkCompareAndSetProtectedSub(); + } + + /** * compareAndSet in one thread enables another waiting for value * to succeed */ @@ -131,10 +220,10 @@ public class AtomicIntegerFieldUpdaterTe AtomicIntegerFieldUpdater a; a = updaterFor("x"); x = 1; - while (!a.weakCompareAndSet(this, 1, 2)); - while (!a.weakCompareAndSet(this, 2, -4)); + do {} while (!a.weakCompareAndSet(this, 1, 2)); + do {} while (!a.weakCompareAndSet(this, 2, -4)); assertEquals(-4, a.get(this)); - while (!a.weakCompareAndSet(this, -4, 7)); + do {} while (!a.weakCompareAndSet(this, -4, 7)); assertEquals(7, a.get(this)); }