18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicBoolean;
128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class AtomicBooleanTest extends JSR166TestCase {
178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
24b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     return new TestSuite(AtomicBooleanTest.class);
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * constructor initializes to given value
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor() {
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(new AtomicBoolean(true).get());
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(new AtomicBoolean(false).get());
338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * default constructed initializes to false
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean();
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get returns the last value set
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetSet() {
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.set(false);
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.set(true);
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get returns the last value lazySet in same thread
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetLazySet() {
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.lazySet(false);
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.lazySet(true);
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * compareAndSet succeeds in changing value if equal to expected else fails
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompareAndSet() {
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(true, false));
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(false, false));
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.compareAndSet(true, false));
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(false, true));
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * compareAndSet in one thread enables another waiting for value
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * to succeed
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompareAndSetInMultipleThreads() throws Exception {
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicBoolean ai = new AtomicBoolean(true);
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = new Thread(new CheckedRunnable() {
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                while (!ai.compareAndSet(false, true)) Thread.yield();
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.start();
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.compareAndSet(true, false));
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.join(LONG_DELAY_MS);
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(t.isAlive());
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * repeated weakCompareAndSet succeeds in changing value when equal
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * to expected
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testWeakCompareAndSet() {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
1058e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        do {} while (!ai.weakCompareAndSet(true, false));
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
1078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        do {} while (!ai.weakCompareAndSet(false, false));
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(ai.get());
1098e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        do {} while (!ai.weakCompareAndSet(false, true));
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getAndSet returns previous value and sets to given value
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetAndSet() {
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean(true);
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(true, ai.getAndSet(false));
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(false, ai.getAndSet(false));
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(false, ai.getAndSet(true));
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(ai.get());
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a deserialized serialized atomic holds same value
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() throws Exception {
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean x = new AtomicBoolean();
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean y = serialClone(x);
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        x.set(true);
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean z = serialClone(x);
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(x.get());
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(y.get());
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(z.get());
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString returns current value.
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString() {
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        AtomicBoolean ai = new AtomicBoolean();
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(Boolean.toString(false), ai.toString());
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ai.set(true);
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(Boolean.toString(true), ai.toString());
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
148