ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LongAdderTest.java
Revision: 1.1
Committed: Wed Mar 20 20:29:02 2013 UTC (11 years, 1 month ago) by dl
Branch: MAIN
Log Message:
Basic coverage for LongAdder and friends

File Contents

# Content
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 */
6
7 import junit.framework.*;
8 import java.util.concurrent.*;
9 import java.util.concurrent.atomic.LongAdder;
10
11 public class LongAdderTest extends JSR166TestCase {
12 public static void main(String[] args) {
13 junit.textui.TestRunner.run(suite());
14 }
15 public static Test suite() {
16 return new TestSuite(LongAdderTest.class);
17 }
18
19 /**
20 * default constructed initializes to zero
21 */
22 public void testConstructor() {
23 LongAdder ai = new LongAdder();
24 assertEquals(0, ai.sum());
25 }
26
27 /**
28 * add adds given value to current, and sum returns current value
29 */
30 public void testAddAndSum() {
31 LongAdder ai = new LongAdder();
32 ai.add(2);
33 assertEquals(2, ai.sum());
34 ai.add(-4);
35 assertEquals(-2, ai.sum());
36 }
37
38 /**
39 * decrement decrements and sum returns current value
40 */
41 public void testDecrementAndsum() {
42 LongAdder ai = new LongAdder();
43 ai.decrement();
44 assertEquals(-1, ai.sum());
45 ai.decrement();
46 assertEquals(-2, ai.sum());
47 }
48
49 /**
50 * incrementAndGet increments and returns current value
51 */
52 public void testIncrementAndsum() {
53 LongAdder ai = new LongAdder();
54 ai.increment();
55 assertEquals(1, ai.sum());
56 ai.increment();
57 assertEquals(2, ai.sum());
58 }
59
60 /**
61 * reset zeroes sum
62 */
63 public void testReset() {
64 LongAdder ai = new LongAdder();
65 ai.add(2);
66 assertEquals(2, ai.sum());
67 ai.reset();
68 assertEquals(0, ai.sum());
69 }
70
71 /**
72 * sumThenReset returns sum then zeros
73 */
74 public void testSumThenReset() {
75 LongAdder ai = new LongAdder();
76 ai.add(2);
77 assertEquals(2, ai.sum());
78 assertEquals(2, ai.sumThenReset());
79 assertEquals(0, ai.sum());
80 }
81
82 /**
83 * a deserialized serialized adder holds same value
84 */
85 public void testSerialization() throws Exception {
86 LongAdder x = new LongAdder();
87 LongAdder y = serialClone(x);
88 assertTrue(x != y);
89 x.add(-22);
90 LongAdder z = serialClone(x);
91 assertEquals(-22, x.sum());
92 assertEquals(0, y.sum());
93 assertEquals(-22, z.sum());
94 }
95
96 /**
97 * toString returns current value.
98 */
99 public void testToString() {
100 LongAdder ai = new LongAdder();
101 assertEquals("0", ai.toString());
102 ai.increment();
103 assertEquals(Long.toString(1), ai.toString());
104 }
105
106 /**
107 * intValue returns current value.
108 */
109 public void testIntValue() {
110 LongAdder ai = new LongAdder();
111 assertEquals(0, ai.intValue());
112 ai.increment();
113 assertEquals(1, ai.intValue());
114 }
115
116 /**
117 * longValue returns current value.
118 */
119 public void testLongValue() {
120 LongAdder ai = new LongAdder();
121 assertEquals(0, ai.longValue());
122 ai.increment();
123 assertEquals(1, ai.longValue());
124 }
125
126 /**
127 * floatValue returns current value.
128 */
129 public void testFloatValue() {
130 LongAdder ai = new LongAdder();
131 assertEquals(0.0f, ai.floatValue());
132 ai.increment();
133 assertEquals(1.0f, ai.floatValue());
134 }
135
136 /**
137 * doubleValue returns current value.
138 */
139 public void testDoubleValue() {
140 LongAdder ai = new LongAdder();
141 assertEquals(0.0, ai.doubleValue());
142 ai.increment();
143 assertEquals(1.0, ai.doubleValue());
144 }
145
146 /**
147 * adds by multiple threads produce correct sum
148 */
149 public void testAddAndSumMT() {
150 final int incs = 1000000;
151 final int nthreads = 4;
152 final ExecutorService pool = Executors.newCachedThreadPool();
153 LongAdder a = new LongAdder();
154 Phaser phaser = new Phaser(nthreads + 1);
155 for (int i = 0; i < nthreads; ++i)
156 pool.execute(new AdderTask(a, phaser, incs));
157 phaser.arriveAndAwaitAdvance();
158 phaser.arriveAndAwaitAdvance();
159 long total = (long)nthreads * incs;
160 long sum = a.sum();
161 assertEquals(sum, total);
162 pool.shutdown();
163 }
164
165 static final class AdderTask implements Runnable {
166 final LongAdder adder;
167 final Phaser phaser;
168 final int incs;
169 volatile long result;
170 AdderTask(LongAdder adder, Phaser phaser, int incs) {
171 this.adder = adder;
172 this.phaser = phaser;
173 this.incs = incs;
174 }
175
176 public void run() {
177 phaser.arriveAndAwaitAdvance();
178 LongAdder a = adder;
179 for (int i = 0; i < incs; ++i)
180 a.add(1L);
181 result = a.sum();
182 phaser.arrive();
183 }
184 }
185
186 }