ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ExchangerTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ExchangerTest.java (file contents):
Revision 1.13 by jsr166, Tue Dec 1 07:23:09 2009 UTC vs.
Revision 1.21 by jsr166, Tue May 31 16:16:23 2011 UTC

# Line 1 | Line 1
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/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
8  
9   import junit.framework.*;
10   import java.util.*;
11 < import java.util.concurrent.*;
11 > import java.util.concurrent.CountDownLatch;
12 > import java.util.concurrent.Exchanger;
13 > import java.util.concurrent.TimeoutException;
14   import static java.util.concurrent.TimeUnit.MILLISECONDS;
15  
16   public class ExchangerTest extends JSR166TestCase {
17  
18      public static void main(String[] args) {
19 <        junit.textui.TestRunner.run (suite());
19 >        junit.textui.TestRunner.run(suite());
20      }
21      public static Test suite() {
22          return new TestSuite(ExchangerTest.class);
# Line 23 | Line 25 | public class ExchangerTest extends JSR16
25      /**
26       * exchange exchanges objects across two threads
27       */
28 <    public void testExchange() throws InterruptedException {
28 >    public void testExchange() {
29          final Exchanger e = new Exchanger();
30 <        Thread t1 = new Thread(new CheckedRunnable() {
30 >        Thread t1 = newStartedThread(new CheckedRunnable() {
31              public void realRun() throws InterruptedException {
32                  assertSame(one, e.exchange(two));
33                  assertSame(two, e.exchange(one));
34              }});
35 <        Thread t2 = new Thread(new CheckedRunnable() {
35 >        Thread t2 = newStartedThread(new CheckedRunnable() {
36              public void realRun() throws InterruptedException {
37                  assertSame(two, e.exchange(one));
38                  assertSame(one, e.exchange(two));
39              }});
40  
41 <        t1.start();
42 <        t2.start();
41 <        t1.join();
42 <        t2.join();
41 >        awaitTermination(t1);
42 >        awaitTermination(t2);
43      }
44  
45      /**
46       * timed exchange exchanges objects across two threads
47       */
48 <    public void testTimedExchange() throws InterruptedException {
48 >    public void testTimedExchange() {
49          final Exchanger e = new Exchanger();
50 <        Thread t1 = new Thread(new CheckedRunnable() {
50 >        Thread t1 = newStartedThread(new CheckedRunnable() {
51              public void realRun() throws Exception {
52 <                assertSame(one, e.exchange(two, SHORT_DELAY_MS, MILLISECONDS));
53 <                assertSame(two, e.exchange(one, SHORT_DELAY_MS, MILLISECONDS));
52 >                assertSame(one, e.exchange(two, LONG_DELAY_MS, MILLISECONDS));
53 >                assertSame(two, e.exchange(one, LONG_DELAY_MS, MILLISECONDS));
54              }});
55 <        Thread t2 = new Thread(new CheckedRunnable() {
55 >        Thread t2 = newStartedThread(new CheckedRunnable() {
56              public void realRun() throws Exception {
57 <                assertSame(two, e.exchange(one, SHORT_DELAY_MS, MILLISECONDS));
58 <                assertSame(one, e.exchange(two, SHORT_DELAY_MS, MILLISECONDS));
57 >                assertSame(two, e.exchange(one, LONG_DELAY_MS, MILLISECONDS));
58 >                assertSame(one, e.exchange(two, LONG_DELAY_MS, MILLISECONDS));
59              }});
60  
61 <        t1.start();
62 <        t2.start();
63 <        t1.join();
64 <        t2.join();
61 >        awaitTermination(t1);
62 >        awaitTermination(t2);
63      }
64  
65      /**
66       * interrupt during wait for exchange throws IE
67       */
68 <    public void testExchange_InterruptedException() throws InterruptedException {
68 >    public void testExchange_InterruptedException() {
69          final Exchanger e = new Exchanger();
70 <        Thread t = new Thread(new CheckedInterruptedRunnable() {
70 >        final CountDownLatch threadStarted = new CountDownLatch(1);
71 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
72              public void realRun() throws InterruptedException {
73 +                threadStarted.countDown();
74                  e.exchange(one);
75              }});
76  
77 <        t.start();
78 <        Thread.sleep(SHORT_DELAY_MS);
77 >        await(threadStarted);
78          t.interrupt();
79 <        t.join();
79 >        awaitTermination(t);
80      }
81  
82      /**
83       * interrupt during wait for timed exchange throws IE
84       */
85 <    public void testTimedExchange_InterruptedException() throws InterruptedException {
85 >    public void testTimedExchange_InterruptedException() {
86          final Exchanger e = new Exchanger();
87 <        Thread t = new Thread(new CheckedInterruptedRunnable() {
87 >        final CountDownLatch threadStarted = new CountDownLatch(1);
88 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
89              public void realRun() throws Exception {
90 <                e.exchange(null, SMALL_DELAY_MS, MILLISECONDS);
90 >                threadStarted.countDown();
91 >                e.exchange(null, LONG_DELAY_MS, MILLISECONDS);
92              }});
93  
94 <        t.start();
94 <        Thread.sleep(SHORT_DELAY_MS);
94 >        await(threadStarted);
95          t.interrupt();
96 <        t.join();
96 >        awaitTermination(t);
97      }
98  
99      /**
100 <     * timeout during wait for timed exchange throws TOE
100 >     * timeout during wait for timed exchange throws TimeoutException
101       */
102 <    public void testExchange_TimeOutException() throws InterruptedException {
102 >    public void testExchange_TimeoutException() {
103          final Exchanger e = new Exchanger();
104 <        Thread t = new ThreadShouldThrow(TimeoutException.class) {
104 >        Thread t = newStartedThread(new CheckedRunnable() {
105              public void realRun() throws Exception {
106 <                e.exchange(null, SHORT_DELAY_MS, MILLISECONDS);
107 <            }};
106 >                long startTime = System.nanoTime();
107 >                try {
108 >                    e.exchange(null, timeoutMillis(), MILLISECONDS);
109 >                    shouldThrow();
110 >                } catch (TimeoutException success) {}
111 >                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
112 >            }});
113  
114 <        t.start();
110 <        t.join();
114 >        awaitTermination(t);
115      }
116  
117      /**
118       * If one exchanging thread is interrupted, another succeeds.
119       */
120 <    public void testReplacementAfterExchange() throws InterruptedException {
120 >    public void testReplacementAfterExchange() {
121          final Exchanger e = new Exchanger();
122 <        Thread t1 = new Thread(new CheckedInterruptedRunnable() {
122 >        final CountDownLatch exchanged = new CountDownLatch(2);
123 >        final CountDownLatch interrupted = new CountDownLatch(1);
124 >        Thread t1 = newStartedThread(new CheckedInterruptedRunnable() {
125              public void realRun() throws InterruptedException {
126                  assertSame(two, e.exchange(one));
127 +                exchanged.countDown();
128                  e.exchange(two);
129              }});
130 <        Thread t2 = new Thread(new CheckedRunnable() {
130 >        Thread t2 = newStartedThread(new CheckedRunnable() {
131              public void realRun() throws InterruptedException {
132                  assertSame(one, e.exchange(two));
133 <                Thread.sleep(SMALL_DELAY_MS);
133 >                exchanged.countDown();
134 >                interrupted.await();
135                  assertSame(three, e.exchange(one));
136              }});
137 <        Thread t3 = new Thread(new CheckedRunnable() {
137 >        Thread t3 = newStartedThread(new CheckedRunnable() {
138              public void realRun() throws InterruptedException {
139 <                Thread.sleep(SMALL_DELAY_MS);
139 >                interrupted.await();
140                  assertSame(one, e.exchange(three));
141              }});
142  
143 <        t1.start();
136 <        t2.start();
137 <        t3.start();
138 <        Thread.sleep(SHORT_DELAY_MS);
143 >        await(exchanged);
144          t1.interrupt();
145 <        t1.join();
146 <        t2.join();
147 <        t3.join();
145 >        awaitTermination(t1);
146 >        interrupted.countDown();
147 >        awaitTermination(t2);
148 >        awaitTermination(t3);
149      }
150  
151   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines