1 /*
2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3  *
4  * This code is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License version 2 only, as
6  * published by the Free Software Foundation.
7  *
8  * This code is distributed in the hope that it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
11  * version 2 for more details (a copy is included in the LICENSE file that
12  * accompanied this code).
13  *
14  * You should have received a copy of the GNU General Public License version
15  * 2 along with this work; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19  * or visit www.oracle.com if you need additional information or have any
20  * questions.
21  */
22 
23 /*
24  * This file is available under and governed by the GNU General Public
25  * License version 2 only, as published by the Free Software Foundation.
26  * However, the following notice accompanied the original version of this
27  * file:
28  *
29  * Written by Doug Lea with assistance from members of JCP JSR-166
30  * Expert Group and released to the public domain, as explained at
31  * http://creativecommons.org/publicdomain/zero/1.0/
32  * Other contributors include Andrew Wright, Jeffrey Hayes,
33  * Pat Fisher, Mike Judd.
34  */
35 
36 import java.util.concurrent.atomic.AtomicBoolean;
37 
38 import junit.framework.Test;
39 import junit.framework.TestSuite;
40 
41 public class AtomicBooleanTest extends JSR166TestCase {
main(String[] args)42     public static void main(String[] args) {
43         main(suite(), args);
44     }
suite()45     public static Test suite() {
46         return new TestSuite(AtomicBooleanTest.class);
47     }
48 
49     /**
50      * constructor initializes to given value
51      */
testConstructor()52     public void testConstructor() {
53         assertTrue(new AtomicBoolean(true).get());
54         assertFalse(new AtomicBoolean(false).get());
55     }
56 
57     /**
58      * default constructed initializes to false
59      */
testConstructor2()60     public void testConstructor2() {
61         AtomicBoolean ai = new AtomicBoolean();
62         assertFalse(ai.get());
63     }
64 
65     /**
66      * get returns the last value set
67      */
testGetSet()68     public void testGetSet() {
69         AtomicBoolean ai = new AtomicBoolean(true);
70         assertTrue(ai.get());
71         ai.set(false);
72         assertFalse(ai.get());
73         ai.set(true);
74         assertTrue(ai.get());
75     }
76 
77     /**
78      * get returns the last value lazySet in same thread
79      */
testGetLazySet()80     public void testGetLazySet() {
81         AtomicBoolean ai = new AtomicBoolean(true);
82         assertTrue(ai.get());
83         ai.lazySet(false);
84         assertFalse(ai.get());
85         ai.lazySet(true);
86         assertTrue(ai.get());
87     }
88 
89     /**
90      * compareAndSet succeeds in changing value if equal to expected else fails
91      */
testCompareAndSet()92     public void testCompareAndSet() {
93         AtomicBoolean ai = new AtomicBoolean(true);
94         assertTrue(ai.compareAndSet(true, false));
95         assertFalse(ai.get());
96         assertTrue(ai.compareAndSet(false, false));
97         assertFalse(ai.get());
98         assertFalse(ai.compareAndSet(true, false));
99         assertFalse(ai.get());
100         assertTrue(ai.compareAndSet(false, true));
101         assertTrue(ai.get());
102     }
103 
104     /**
105      * compareAndSet in one thread enables another waiting for value
106      * to succeed
107      */
testCompareAndSetInMultipleThreads()108     public void testCompareAndSetInMultipleThreads() throws Exception {
109         final AtomicBoolean ai = new AtomicBoolean(true);
110         Thread t = new Thread(new CheckedRunnable() {
111             public void realRun() {
112                 while (!ai.compareAndSet(false, true)) Thread.yield();
113             }});
114 
115         t.start();
116         assertTrue(ai.compareAndSet(true, false));
117         t.join(LONG_DELAY_MS);
118         assertFalse(t.isAlive());
119     }
120 
121     /**
122      * repeated weakCompareAndSet succeeds in changing value when equal
123      * to expected
124      */
testWeakCompareAndSet()125     public void testWeakCompareAndSet() {
126         AtomicBoolean ai = new AtomicBoolean(true);
127         do {} while (!ai.weakCompareAndSet(true, false));
128         assertFalse(ai.get());
129         do {} while (!ai.weakCompareAndSet(false, false));
130         assertFalse(ai.get());
131         do {} while (!ai.weakCompareAndSet(false, true));
132         assertTrue(ai.get());
133     }
134 
135     /**
136      * getAndSet returns previous value and sets to given value
137      */
testGetAndSet()138     public void testGetAndSet() {
139         AtomicBoolean ai = new AtomicBoolean();
140         boolean[] booleans = { false, true };
141         for (boolean before : booleans)
142             for (boolean after : booleans) {
143                 ai.set(before);
144                 assertEquals(before, ai.getAndSet(after));
145                 assertEquals(after, ai.get());
146             }
147     }
148 
149     /**
150      * a deserialized/reserialized atomic holds same value
151      */
testSerialization()152     public void testSerialization() throws Exception {
153         AtomicBoolean x = new AtomicBoolean();
154         AtomicBoolean y = serialClone(x);
155         x.set(true);
156         AtomicBoolean z = serialClone(x);
157         assertTrue(x.get());
158         assertFalse(y.get());
159         assertTrue(z.get());
160     }
161 
162     /**
163      * toString returns current value.
164      */
testToString()165     public void testToString() {
166         AtomicBoolean ai = new AtomicBoolean();
167         assertEquals(Boolean.toString(false), ai.toString());
168         ai.set(true);
169         assertEquals(Boolean.toString(true), ai.toString());
170     }
171 
172 }
173