blob: a508d6c3fd0586d6e2dde7c5fa8636007207b0f8 [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 ExchangerTest extends JSR166TestCase {
public static void main(String[] args) {
junit.textui.TestRunner.run (suite());
}
public static Test suite() {
return new TestSuite(ExchangerTest.class);
}
/**
* exchange exchanges objects across two threads
*/
public void testExchange() {
final Exchanger e = new Exchanger();
Thread t1 = new Thread(new Runnable(){
public void run(){
try {
Object v = e.exchange(one);
threadAssertEquals(v, two);
Object w = e.exchange(v);
threadAssertEquals(w, one);
} catch(InterruptedException e){
threadUnexpectedException();
}
}
});
Thread t2 = new Thread(new Runnable(){
public void run(){
try {
Object v = e.exchange(two);
threadAssertEquals(v, one);
Object w = e.exchange(v);
threadAssertEquals(w, two);
} catch(InterruptedException e){
threadUnexpectedException();
}
}
});
try {
t1.start();
t2.start();
t1.join();
t2.join();
} catch(InterruptedException ex) {
unexpectedException();
}
}
/**
* timed exchange exchanges objects across two threads
*/
public void testTimedExchange() {
final Exchanger e = new Exchanger();
Thread t1 = new Thread(new Runnable(){
public void run(){
try {
Object v = e.exchange(one, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
threadAssertEquals(v, two);
Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
threadAssertEquals(w, one);
} catch(InterruptedException e){
threadUnexpectedException();
} catch(TimeoutException toe) {
threadUnexpectedException();
}
}
});
Thread t2 = new Thread(new Runnable(){
public void run(){
try {
Object v = e.exchange(two, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
threadAssertEquals(v, one);
Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
threadAssertEquals(w, two);
} catch(InterruptedException e){
threadUnexpectedException();
} catch(TimeoutException toe) {
threadUnexpectedException();
}
}
});
try {
t1.start();
t2.start();
t1.join();
t2.join();
} catch(InterruptedException ex) {
unexpectedException();
}
}
/**
* interrupt during wait for exchange throws IE
*/
public void testExchange_InterruptedException(){
final Exchanger e = new Exchanger();
Thread t = new Thread(new Runnable() {
public void run(){
try {
e.exchange(one);
threadShouldThrow();
} catch(InterruptedException success){
}
}
});
try {
t.start();
Thread.sleep(SHORT_DELAY_MS);
t.interrupt();
t.join();
} catch(InterruptedException ex) {
unexpectedException();
}
}
/**
* interrupt during wait for timed exchange throws IE
*/
public void testTimedExchange_InterruptedException(){
final Exchanger e = new Exchanger();
Thread t = new Thread(new Runnable() {
public void run(){
try {
e.exchange(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
threadShouldThrow();
} catch(InterruptedException success){
} catch(Exception e2){
threadFail("should throw IE");
}
}
});
try {
t.start();
t.interrupt();
t.join();
} catch(InterruptedException ex){
unexpectedException();
}
}
/**
* timeout during wait for timed exchange throws TOE
*/
public void testExchange_TimeOutException(){
final Exchanger e = new Exchanger();
Thread t = new Thread(new Runnable() {
public void run(){
try {
e.exchange(null, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
threadShouldThrow();
} catch(TimeoutException success){
} catch(InterruptedException e2){
threadFail("should throw TOE");
}
}
});
try {
t.start();
t.join();
} catch(InterruptedException ex){
unexpectedException();
}
}
/**
* If one exchanging thread is interrupted, another succeeds.
*/
public void testReplacementAfterExchange() {
final Exchanger e = new Exchanger();
Thread t1 = new Thread(new Runnable(){
public void run(){
try {
Object v = e.exchange(one);
threadAssertEquals(v, two);
Object w = e.exchange(v);
threadShouldThrow();
} catch(InterruptedException success){
}
}
});
Thread t2 = new Thread(new Runnable(){
public void run(){
try {
Object v = e.exchange(two);
threadAssertEquals(v, one);
Thread.sleep(SMALL_DELAY_MS);
Object w = e.exchange(v);
threadAssertEquals(w, three);
} catch(InterruptedException e){
threadUnexpectedException();
}
}
});
Thread t3 = new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(SMALL_DELAY_MS);
Object w = e.exchange(three);
threadAssertEquals(w, one);
} catch(InterruptedException e){
threadUnexpectedException();
}
}
});
try {
t1.start();
t2.start();
t3.start();
Thread.sleep(SHORT_DELAY_MS);
t1.interrupt();
t1.join();
t2.join();
t3.join();
} catch(InterruptedException ex) {
unexpectedException();
}
}
}