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/licenses/publicdomain 5 * Other contributors include Andrew Wright, Jeffrey Hayes, 6 * Pat Fisher, Mike Judd. 7 */ 8 9 package tests.api.java.util.concurrent; // android-added 10 11 import junit.framework.*; 12 import java.util.concurrent.atomic.*; 13 import java.io.*; 14 15 public class AtomicIntegerTest extends JSR166TestCase { 16 public static Test suite() { 17 return new TestSuite(AtomicIntegerTest.class); 18 } 19 20 final int[] VALUES = { 21 Integer.MIN_VALUE, -1, 0, 1, 42, Integer.MAX_VALUE, 22 }; 23 24 /** 25 * constructor initializes to given value 26 */ 27 public void testConstructor() { 28 AtomicInteger ai = new AtomicInteger(1); 29 assertEquals(1,ai.get()); 30 } 31 32 /** 33 * default constructed initializes to zero 34 */ 35 public void testConstructor2() { 36 AtomicInteger ai = new AtomicInteger(); 37 assertEquals(0,ai.get()); 38 } 39 40 /** 41 * get returns the last value set 42 */ 43 public void testGetSet() { 44 AtomicInteger ai = new AtomicInteger(1); 45 assertEquals(1,ai.get()); 46 ai.set(2); 47 assertEquals(2,ai.get()); 48 ai.set(-3); 49 assertEquals(-3,ai.get()); 50 } 51 52 /** 53 * get returns the last value lazySet in same thread 54 */ 55 public void testGetLazySet() { 56 AtomicInteger ai = new AtomicInteger(1); 57 assertEquals(1,ai.get()); 58 ai.lazySet(2); 59 assertEquals(2,ai.get()); 60 ai.lazySet(-3); 61 assertEquals(-3,ai.get()); 62 } 63 64 /** 65 * compareAndSet succeeds in changing value if equal to expected else fails 66 */ 67 public void testCompareAndSet() { 68 AtomicInteger ai = new AtomicInteger(1); 69 assertTrue(ai.compareAndSet(1,2)); 70 assertTrue(ai.compareAndSet(2,-4)); 71 assertEquals(-4,ai.get()); 72 assertFalse(ai.compareAndSet(-5,7)); 73 assertEquals(-4,ai.get()); 74 assertTrue(ai.compareAndSet(-4,7)); 75 assertEquals(7,ai.get()); 76 } 77 78 /** 79 * compareAndSet in one thread enables another waiting for value 80 * to succeed 81 */ 82 public void testCompareAndSetInMultipleThreads() throws Exception { 83 final AtomicInteger ai = new AtomicInteger(1); 84 Thread t = new Thread(new CheckedRunnable() { 85 public void realRun() { 86 while (!ai.compareAndSet(2, 3)) 87 Thread.yield(); 88 }}); 89 90 t.start(); 91 assertTrue(ai.compareAndSet(1, 2)); 92 t.join(LONG_DELAY_MS); 93 assertFalse(t.isAlive()); 94 assertEquals(ai.get(), 3); 95 } 96 97 /** 98 * repeated weakCompareAndSet succeeds in changing value when equal 99 * to expected 100 */ 101 public void testWeakCompareAndSet() { 102 AtomicInteger ai = new AtomicInteger(1); 103 while (!ai.weakCompareAndSet(1,2)); 104 while (!ai.weakCompareAndSet(2,-4)); 105 assertEquals(-4,ai.get()); 106 while (!ai.weakCompareAndSet(-4,7)); 107 assertEquals(7,ai.get()); 108 } 109 110 /** 111 * getAndSet returns previous value and sets to given value 112 */ 113 public void testGetAndSet() { 114 AtomicInteger ai = new AtomicInteger(1); 115 assertEquals(1,ai.getAndSet(0)); 116 assertEquals(0,ai.getAndSet(-10)); 117 assertEquals(-10,ai.getAndSet(1)); 118 } 119 120 /** 121 * getAndAdd returns previous value and adds given value 122 */ 123 public void testGetAndAdd() { 124 AtomicInteger ai = new AtomicInteger(1); 125 assertEquals(1,ai.getAndAdd(2)); 126 assertEquals(3,ai.get()); 127 assertEquals(3,ai.getAndAdd(-4)); 128 assertEquals(-1,ai.get()); 129 } 130 131 /** 132 * getAndDecrement returns previous value and decrements 133 */ 134 public void testGetAndDecrement() { 135 AtomicInteger ai = new AtomicInteger(1); 136 assertEquals(1,ai.getAndDecrement()); 137 assertEquals(0,ai.getAndDecrement()); 138 assertEquals(-1,ai.getAndDecrement()); 139 } 140 141 /** 142 * getAndIncrement returns previous value and increments 143 */ 144 public void testGetAndIncrement() { 145 AtomicInteger ai = new AtomicInteger(1); 146 assertEquals(1,ai.getAndIncrement()); 147 assertEquals(2,ai.get()); 148 ai.set(-2); 149 assertEquals(-2,ai.getAndIncrement()); 150 assertEquals(-1,ai.getAndIncrement()); 151 assertEquals(0,ai.getAndIncrement()); 152 assertEquals(1,ai.get()); 153 } 154 155 /** 156 * addAndGet adds given value to current, and returns current value 157 */ 158 public void testAddAndGet() { 159 AtomicInteger ai = new AtomicInteger(1); 160 assertEquals(3,ai.addAndGet(2)); 161 assertEquals(3,ai.get()); 162 assertEquals(-1,ai.addAndGet(-4)); 163 assertEquals(-1,ai.get()); 164 } 165 166 /** 167 * decrementAndGet decrements and returns current value 168 */ 169 public void testDecrementAndGet() { 170 AtomicInteger ai = new AtomicInteger(1); 171 assertEquals(0,ai.decrementAndGet()); 172 assertEquals(-1,ai.decrementAndGet()); 173 assertEquals(-2,ai.decrementAndGet()); 174 assertEquals(-2,ai.get()); 175 } 176 177 /** 178 * incrementAndGet increments and returns current value 179 */ 180 public void testIncrementAndGet() { 181 AtomicInteger ai = new AtomicInteger(1); 182 assertEquals(2,ai.incrementAndGet()); 183 assertEquals(2,ai.get()); 184 ai.set(-2); 185 assertEquals(-1,ai.incrementAndGet()); 186 assertEquals(0,ai.incrementAndGet()); 187 assertEquals(1,ai.incrementAndGet()); 188 assertEquals(1,ai.get()); 189 } 190 191 /** 192 * a deserialized serialized atomic holds same value 193 */ 194 public void testSerialization() throws Exception { 195 AtomicInteger l = new AtomicInteger(); 196 197 l.set(22); 198 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000); 199 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout)); 200 out.writeObject(l); 201 out.close(); 202 203 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); 204 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin)); 205 AtomicInteger r = (AtomicInteger) in.readObject(); 206 assertEquals(l.get(), r.get()); 207 } 208 209 /** 210 * toString returns current value. 211 */ 212 public void testToString() { 213 AtomicInteger ai = new AtomicInteger(); 214 assertEquals("0", ai.toString()); 215 for (int x : VALUES) { 216 ai.set(x); 217 assertEquals(ai.toString(), Integer.toString(x)); 218 } 219 } 220 221 /** 222 * intValue returns current value. 223 */ 224 public void testIntValue() { 225 AtomicInteger ai = new AtomicInteger(); 226 assertEquals(0, ai.intValue()); 227 for (int x : VALUES) { 228 ai.set(x); 229 assertEquals(x, ai.intValue()); 230 } 231 } 232 233 /** 234 * longValue returns current value. 235 */ 236 public void testLongValue() { 237 AtomicInteger ai = new AtomicInteger(); 238 assertEquals(0L, ai.longValue()); 239 for (int x : VALUES) { 240 ai.set(x); 241 assertEquals((long)x, ai.longValue()); 242 } 243 } 244 245 /** 246 * floatValue returns current value. 247 */ 248 public void testFloatValue() { 249 AtomicInteger ai = new AtomicInteger(); 250 assertEquals(0.0f, ai.floatValue()); 251 for (int x : VALUES) { 252 ai.set(x); 253 assertEquals((float)x, ai.floatValue()); 254 } 255 } 256 257 /** 258 * doubleValue returns current value. 259 */ 260 public void testDoubleValue() { 261 AtomicInteger ai = new AtomicInteger(); 262 assertEquals(0.0d, ai.doubleValue()); 263 for (int x : VALUES) { 264 ai.set(x); 265 assertEquals((double)x, ai.doubleValue()); 266 } 267 } 268 269 } 270