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