blob: bc2aecf034194f1f944bbd627e704747d27b73e1 [file] [log] [blame]
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001/*
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
9package jsr166;
10
11import junit.framework.*;
12import java.util.*;
13import java.util.concurrent.CountDownLatch;
14import static java.util.concurrent.TimeUnit.MILLISECONDS;
15
16public class CountDownLatchTest extends JSR166TestCase {
17
18 /**
19 * negative constructor argument throws IAE
20 */
21 public void testConstructor() {
22 try {
23 new CountDownLatch(-1);
24 shouldThrow();
25 } catch (IllegalArgumentException success) {}
26 }
27
28 /**
29 * getCount returns initial count and decreases after countDown
30 */
31 public void testGetCount() {
32 final CountDownLatch l = new CountDownLatch(2);
33 assertEquals(2, l.getCount());
34 l.countDown();
35 assertEquals(1, l.getCount());
36 }
37
38 /**
39 * countDown decrements count when positive and has no effect when zero
40 */
41 public void testCountDown() {
42 final CountDownLatch l = new CountDownLatch(1);
43 assertEquals(1, l.getCount());
44 l.countDown();
45 assertEquals(0, l.getCount());
46 l.countDown();
47 assertEquals(0, l.getCount());
48 }
49
50 /**
51 * await returns after countDown to zero, but not before
52 */
53 public void testAwait() {
54 final CountDownLatch l = new CountDownLatch(2);
55 final CountDownLatch pleaseCountDown = new CountDownLatch(1);
56
57 Thread t = newStartedThread(new CheckedRunnable() {
58 public void realRun() throws InterruptedException {
59 assertEquals(2, l.getCount());
60 pleaseCountDown.countDown();
61 l.await();
62 assertEquals(0, l.getCount());
63 }});
64
65 await(pleaseCountDown);
66 assertEquals(2, l.getCount());
67 l.countDown();
68 assertEquals(1, l.getCount());
69 assertThreadStaysAlive(t);
70 l.countDown();
71 assertEquals(0, l.getCount());
72 awaitTermination(t);
73 }
74
75 /**
76 * timed await returns after countDown to zero
77 */
78 public void testTimedAwait() {
79 final CountDownLatch l = new CountDownLatch(2);
80 final CountDownLatch pleaseCountDown = new CountDownLatch(1);
81
82 Thread t = newStartedThread(new CheckedRunnable() {
83 public void realRun() throws InterruptedException {
84 assertEquals(2, l.getCount());
85 pleaseCountDown.countDown();
86 assertTrue(l.await(LONG_DELAY_MS, MILLISECONDS));
87 assertEquals(0, l.getCount());
88 }});
89
90 await(pleaseCountDown);
91 assertEquals(2, l.getCount());
92 l.countDown();
93 assertEquals(1, l.getCount());
94 assertThreadStaysAlive(t);
95 l.countDown();
96 assertEquals(0, l.getCount());
97 awaitTermination(t);
98 }
99
100 /**
101 * await throws IE if interrupted before counted down
102 */
103 public void testAwait_Interruptible() {
104 final CountDownLatch l = new CountDownLatch(1);
105 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
106 Thread t = newStartedThread(new CheckedRunnable() {
107 public void realRun() throws InterruptedException {
108 Thread.currentThread().interrupt();
109 try {
110 l.await();
111 shouldThrow();
112 } catch (InterruptedException success) {}
113 assertFalse(Thread.interrupted());
114
115 pleaseInterrupt.countDown();
116 try {
117 l.await();
118 shouldThrow();
119 } catch (InterruptedException success) {}
120 assertFalse(Thread.interrupted());
121
122 assertEquals(1, l.getCount());
123 }});
124
125 await(pleaseInterrupt);
126 assertThreadStaysAlive(t);
127 t.interrupt();
128 awaitTermination(t);
129 }
130
131 /**
132 * timed await throws IE if interrupted before counted down
133 */
134 public void testTimedAwait_Interruptible() {
135 final CountDownLatch l = new CountDownLatch(1);
136 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
137 Thread t = newStartedThread(new CheckedRunnable() {
138 public void realRun() throws InterruptedException {
139 Thread.currentThread().interrupt();
140 try {
141 l.await(LONG_DELAY_MS, MILLISECONDS);
142 shouldThrow();
143 } catch (InterruptedException success) {}
144 assertFalse(Thread.interrupted());
145
146 pleaseInterrupt.countDown();
147 try {
148 l.await(LONG_DELAY_MS, MILLISECONDS);
149 shouldThrow();
150 } catch (InterruptedException success) {}
151 assertFalse(Thread.interrupted());
152
153 assertEquals(1, l.getCount());
154 }});
155
156 await(pleaseInterrupt);
157 assertThreadStaysAlive(t);
158 t.interrupt();
159 awaitTermination(t);
160 }
161
162 /**
163 * timed await times out if not counted down before timeout
164 */
165 public void testAwaitTimeout() throws InterruptedException {
166 final CountDownLatch l = new CountDownLatch(1);
167 Thread t = newStartedThread(new CheckedRunnable() {
168 public void realRun() throws InterruptedException {
169 assertEquals(1, l.getCount());
170 assertFalse(l.await(timeoutMillis(), MILLISECONDS));
171 assertEquals(1, l.getCount());
172 }});
173
174 awaitTermination(t);
175 assertEquals(1, l.getCount());
176 }
177
178 /**
179 * toString indicates current count
180 */
181 public void testToString() {
182 CountDownLatch s = new CountDownLatch(2);
183 assertTrue(s.toString().contains("Count = 2"));
184 s.countDown();
185 assertTrue(s.toString().contains("Count = 1"));
186 s.countDown();
187 assertTrue(s.toString().contains("Count = 0"));
188 }
189
190}