Home | History | Annotate | Download | only in jsr166
      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.concurrent.atomic.AtomicBoolean;
     12 
     13 import junit.framework.Test;
     14 import junit.framework.TestSuite;
     15 
     16 public class AtomicBooleanTest extends JSR166TestCase {
     17     // android-note: Removed because the CTS runner does a bad job of
     18     // retrying tests that have suite() declarations.
     19     //
     20     // public static void main(String[] args) {
     21     //     main(suite(), args);
     22     // }
     23     // public static Test suite() {
     24     //     return new TestSuite(AtomicBooleanTest.class);
     25     // }
     26 
     27     /**
     28      * constructor initializes to given value
     29      */
     30     public void testConstructor() {
     31         assertTrue(new AtomicBoolean(true).get());
     32         assertFalse(new AtomicBoolean(false).get());
     33     }
     34 
     35     /**
     36      * default constructed initializes to false
     37      */
     38     public void testConstructor2() {
     39         AtomicBoolean ai = new AtomicBoolean();
     40         assertFalse(ai.get());
     41     }
     42 
     43     /**
     44      * get returns the last value set
     45      */
     46     public void testGetSet() {
     47         AtomicBoolean ai = new AtomicBoolean(true);
     48         assertTrue(ai.get());
     49         ai.set(false);
     50         assertFalse(ai.get());
     51         ai.set(true);
     52         assertTrue(ai.get());
     53     }
     54 
     55     /**
     56      * get returns the last value lazySet in same thread
     57      */
     58     public void testGetLazySet() {
     59         AtomicBoolean ai = new AtomicBoolean(true);
     60         assertTrue(ai.get());
     61         ai.lazySet(false);
     62         assertFalse(ai.get());
     63         ai.lazySet(true);
     64         assertTrue(ai.get());
     65     }
     66 
     67     /**
     68      * compareAndSet succeeds in changing value if equal to expected else fails
     69      */
     70     public void testCompareAndSet() {
     71         AtomicBoolean ai = new AtomicBoolean(true);
     72         assertTrue(ai.compareAndSet(true, false));
     73         assertFalse(ai.get());
     74         assertTrue(ai.compareAndSet(false, false));
     75         assertFalse(ai.get());
     76         assertFalse(ai.compareAndSet(true, false));
     77         assertFalse(ai.get());
     78         assertTrue(ai.compareAndSet(false, true));
     79         assertTrue(ai.get());
     80     }
     81 
     82     /**
     83      * compareAndSet in one thread enables another waiting for value
     84      * to succeed
     85      */
     86     public void testCompareAndSetInMultipleThreads() throws Exception {
     87         final AtomicBoolean ai = new AtomicBoolean(true);
     88         Thread t = new Thread(new CheckedRunnable() {
     89             public void realRun() {
     90                 while (!ai.compareAndSet(false, true)) Thread.yield();
     91             }});
     92 
     93         t.start();
     94         assertTrue(ai.compareAndSet(true, false));
     95         t.join(LONG_DELAY_MS);
     96         assertFalse(t.isAlive());
     97     }
     98 
     99     /**
    100      * repeated weakCompareAndSet succeeds in changing value when equal
    101      * to expected
    102      */
    103     public void testWeakCompareAndSet() {
    104         AtomicBoolean ai = new AtomicBoolean(true);
    105         do {} while (!ai.weakCompareAndSet(true, false));
    106         assertFalse(ai.get());
    107         do {} while (!ai.weakCompareAndSet(false, false));
    108         assertFalse(ai.get());
    109         do {} while (!ai.weakCompareAndSet(false, true));
    110         assertTrue(ai.get());
    111     }
    112 
    113     /**
    114      * getAndSet returns previous value and sets to given value
    115      */
    116     public void testGetAndSet() {
    117         AtomicBoolean ai = new AtomicBoolean(true);
    118         assertEquals(true, ai.getAndSet(false));
    119         assertEquals(false, ai.getAndSet(false));
    120         assertEquals(false, ai.getAndSet(true));
    121         assertTrue(ai.get());
    122     }
    123 
    124     /**
    125      * a deserialized serialized atomic holds same value
    126      */
    127     public void testSerialization() throws Exception {
    128         AtomicBoolean x = new AtomicBoolean();
    129         AtomicBoolean y = serialClone(x);
    130         x.set(true);
    131         AtomicBoolean z = serialClone(x);
    132         assertTrue(x.get());
    133         assertFalse(y.get());
    134         assertTrue(z.get());
    135     }
    136 
    137     /**
    138      * toString returns current value.
    139      */
    140     public void testToString() {
    141         AtomicBoolean ai = new AtomicBoolean();
    142         assertEquals(Boolean.toString(false), ai.toString());
    143         ai.set(true);
    144         assertEquals(Boolean.toString(true), ai.toString());
    145     }
    146 
    147 }
    148