/* * Written by members of JCP JSR-166 Expert Group and released to the * public domain. Use, modify, and redistribute this code in any way * without acknowledgement. Other contributors include Andrew Wright, * Jeffrey Hayes, Pat Fischer, 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); } 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){ threadFail("unexpected exception"); } } }); 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){ threadFail("unexpected exception"); } } }); try { t1.start(); t2.start(); t1.join(); t2.join(); } catch(InterruptedException ex) { fail("unexpected exception"); } } 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){ threadFail("unexpected exception"); } catch(TimeoutException toe) { threadFail("unexpected exception"); } } }); 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){ threadFail("unexpected exception"); } catch(TimeoutException toe) { threadFail("unexpected exception"); } } }); try { t1.start(); t2.start(); t1.join(); t2.join(); } catch(InterruptedException ex) { fail("unexpected exception"); } } public void testExchange_InterruptedException(){ final Exchanger e = new Exchanger(); Thread t = new Thread(new Runnable() { public void run(){ try { e.exchange(one); threadFail("should throw"); } catch(InterruptedException success){ } } }); try { t.start(); Thread.sleep(SHORT_DELAY_MS); t.interrupt(); t.join(); } catch(InterruptedException ex) { fail("unexpected exception"); } } 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); threadFail("should throw"); } catch(InterruptedException success){ } catch(Exception e2){ threadFail("should throw IE"); } } }); try { t.start(); t.interrupt(); t.join(); } catch(InterruptedException ex){ fail("unexpected exception"); } } 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); threadFail("should throw"); } catch(TimeoutException success){ } catch(InterruptedException e2){ threadFail("should throw TOE"); } } }); try { t.start(); t.join(); } catch(InterruptedException ex){ fail("unexpected exception"); } } }