blob: 04b0bf161d06351cf4edb0cd4f99f960ee2ca876 [file] [log] [blame]
/*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/licenses/publicdomain
* Other contributors include Andrew Wright, Jeffrey Hayes,
* Pat Fisher, Mike Judd.
*/
import junit.framework.*;
import java.util.*;
import java.util.concurrent.*;
public class CountDownLatchTest extends JSR166TestCase {
public static void main(String[] args) {
junit.textui.TestRunner.run (suite());
}
public static Test suite() {
return new TestSuite(CountDownLatchTest.class);
}
/**
* negative constructor argument throws IAE
*/
public void testConstructor() {
try {
new CountDownLatch(-1);
shouldThrow();
} catch(IllegalArgumentException success){}
}
/**
* getCount returns initial count and decreases after countDown
*/
public void testGetCount() {
final CountDownLatch l = new CountDownLatch(2);
assertEquals(2, l.getCount());
l.countDown();
assertEquals(1, l.getCount());
}
/**
* countDown decrements count when positive and has no effect when zero
*/
public void testCountDown() {
final CountDownLatch l = new CountDownLatch(1);
assertEquals(1, l.getCount());
l.countDown();
assertEquals(0, l.getCount());
l.countDown();
assertEquals(0, l.getCount());
}
/**
* await returns after countDown to zero, but not before
*/
public void testAwait() {
final CountDownLatch l = new CountDownLatch(2);
Thread t = new Thread(new Runnable() {
public void run() {
try {
threadAssertTrue(l.getCount() > 0);
l.await();
threadAssertTrue(l.getCount() == 0);
} catch(InterruptedException e){
threadUnexpectedException();
}
}
});
t.start();
try {
assertEquals(l.getCount(), 2);
Thread.sleep(SHORT_DELAY_MS);
l.countDown();
assertEquals(l.getCount(), 1);
l.countDown();
assertEquals(l.getCount(), 0);
t.join();
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* timed await returns after countDown to zero
*/
public void testTimedAwait() {
final CountDownLatch l = new CountDownLatch(2);
Thread t = new Thread(new Runnable() {
public void run() {
try {
threadAssertTrue(l.getCount() > 0);
threadAssertTrue(l.await(SMALL_DELAY_MS, TimeUnit.MILLISECONDS));
} catch(InterruptedException e){
threadUnexpectedException();
}
}
});
t.start();
try {
assertEquals(l.getCount(), 2);
Thread.sleep(SHORT_DELAY_MS);
l.countDown();
assertEquals(l.getCount(), 1);
l.countDown();
assertEquals(l.getCount(), 0);
t.join();
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* await throws IE if interrupted before counted down
*/
public void testAwait_InterruptedException() {
final CountDownLatch l = new CountDownLatch(1);
Thread t = new Thread(new Runnable() {
public void run() {
try {
threadAssertTrue(l.getCount() > 0);
l.await();
threadShouldThrow();
} catch(InterruptedException success){}
}
});
t.start();
try {
assertEquals(l.getCount(), 1);
t.interrupt();
t.join();
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* timed await throws IE if interrupted before counted down
*/
public void testTimedAwait_InterruptedException() {
final CountDownLatch l = new CountDownLatch(1);
Thread t = new Thread(new Runnable() {
public void run() {
try {
threadAssertTrue(l.getCount() > 0);
l.await(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
threadShouldThrow();
} catch(InterruptedException success){}
}
});
t.start();
try {
Thread.sleep(SHORT_DELAY_MS);
assertEquals(l.getCount(), 1);
t.interrupt();
t.join();
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* timed await times out if not counted down before timeout
*/
public void testAwaitTimeout() {
final CountDownLatch l = new CountDownLatch(1);
Thread t = new Thread(new Runnable() {
public void run() {
try {
threadAssertTrue(l.getCount() > 0);
threadAssertFalse(l.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
threadAssertTrue(l.getCount() > 0);
} catch(InterruptedException ie){
threadUnexpectedException();
}
}
});
t.start();
try {
assertEquals(l.getCount(), 1);
t.join();
} catch (InterruptedException e){
unexpectedException();
}
}
/**
* toString indicates current count
*/
public void testToString() {
CountDownLatch s = new CountDownLatch(2);
String us = s.toString();
assertTrue(us.indexOf("Count = 2") >= 0);
s.countDown();
String s1 = s.toString();
assertTrue(s1.indexOf("Count = 1") >= 0);
s.countDown();
String s2 = s.toString();
assertTrue(s2.indexOf("Count = 0") >= 0);
}
}