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.1 by dl, Sun Aug 31 19:24:54 2003 UTC vs.
Revision 1.10 by jsr166, Sat Nov 21 02:07:26 2009 UTC

# Line 1 | Line 1
1   /*
2 < * Written by members of JCP JSR-166 Expert Group and released to the
3 < * public domain. Use, modify, and redistribute this code in any way
4 < * without acknowledgement. Other contributors include Andrew Wright,
5 < * Jeffrey Hayes, Pat Fischer, Mike Judd.
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
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.*;
12  
13 < public class ExchangerTest extends TestCase{
14 <  
13 > public class ExchangerTest extends JSR166TestCase {
14 >
15      public static void main(String[] args) {
16 <        junit.textui.TestRunner.run (suite());  
16 >        junit.textui.TestRunner.run (suite());
17      }
18      public static Test suite() {
19 <        return new TestSuite(ExchangerTest.class);
19 >        return new TestSuite(ExchangerTest.class);
20 >    }
21 >
22 >    /**
23 >     * exchange exchanges objects across two threads
24 >     */
25 >    public void testExchange() throws InterruptedException {
26 >        final Exchanger e = new Exchanger();
27 >        Thread t1 = new Thread(new CheckedRunnable() {
28 >            public void realRun() throws InterruptedException {
29 >                Object v = e.exchange(one);
30 >                threadAssertEquals(v, two);
31 >                Object w = e.exchange(v);
32 >                threadAssertEquals(w, one);
33 >            }});
34 >        Thread t2 = new Thread(new CheckedRunnable() {
35 >            public void realRun() throws InterruptedException {
36 >                Object v = e.exchange(two);
37 >                threadAssertEquals(v, one);
38 >                Object w = e.exchange(v);
39 >                threadAssertEquals(w, two);
40 >            }});
41 >
42 >        t1.start();
43 >        t2.start();
44 >        t1.join();
45 >        t2.join();
46 >    }
47 >
48 >    /**
49 >     * timed exchange exchanges objects across two threads
50 >     */
51 >    public void testTimedExchange() throws InterruptedException {
52 >        final Exchanger e = new Exchanger();
53 >        Thread t1 = new Thread(new CheckedRunnable() {
54 >            public void realRun() throws Exception {
55 >                Object v = e.exchange(one, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
56 >                threadAssertEquals(v, two);
57 >                Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
58 >                threadAssertEquals(w, one);
59 >            }});
60 >        Thread t2 = new Thread(new CheckedRunnable() {
61 >            public void realRun() throws Exception {
62 >                Object v = e.exchange(two, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
63 >                threadAssertEquals(v, one);
64 >                Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
65 >                threadAssertEquals(w, two);
66 >            }});
67 >
68 >        t1.start();
69 >        t2.start();
70 >        t1.join();
71 >        t2.join();
72 >    }
73 >
74 >    /**
75 >     * interrupt during wait for exchange throws IE
76 >     */
77 >    public void testExchange_InterruptedException() throws InterruptedException {
78 >        final Exchanger e = new Exchanger();
79 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
80 >            public void realRun() throws InterruptedException {
81 >                e.exchange(one);
82 >            }});
83 >
84 >        t.start();
85 >        Thread.sleep(SHORT_DELAY_MS);
86 >        t.interrupt();
87 >        t.join();
88      }
89  
90 <    private static long SHORT_DELAY_MS = 100;
91 <    private static long MEDIUM_DELAY_MS = 1000;
92 <    private static long LONG_DELAY_MS = 10000;
93 <    
94 <    private final static Integer one = new Integer(1);
95 <    private final static Integer two = new Integer(2);
96 <
97 <    public void testExchange(){
98 <        final Exchanger e = new Exchanger();
99 <        Thread t1 = new Thread(new Runnable(){
100 <                public void run(){
101 <                    try{
102 <                        Object v = e.exchange(one);
103 <                        assertEquals(v, two);
104 <                        Object w = e.exchange(v);
105 <                        assertEquals(w, one);
106 <                    }catch(InterruptedException e){
107 <                        fail("unexpected exception");
108 <                    }
109 <                }
110 <            });
111 <        Thread t2 = new Thread(new Runnable(){
112 <                public void run(){
113 <                    try{
114 <                        Object v = e.exchange(two);
115 <                        assertEquals(v, one);
116 <                        Object w = e.exchange(v);
117 <                        assertEquals(w, two);
118 <                    }catch(InterruptedException e){
119 <                        fail("unexpected exception");
120 <                    }
121 <                }
122 <            });
123 <        try {
124 <            t1.start();
125 <            t2.start();
126 <            t1.join();
127 <            t2.join();
128 <        } catch(InterruptedException ex) {
129 <            fail("unexpected exception");
130 <        }
131 <    }
132 <
133 <    public void testExchange1_InterruptedException(){
134 <        final Exchanger e = new Exchanger();
135 <        Thread t = new Thread(new Runnable() {
136 <                public void run(){
137 <                    try{
138 <                        e.exchange(one);
139 <                        fail("should throw");
140 <                    }catch(InterruptedException success){
141 <                    }
142 <                }
143 <            });
144 <        try{
145 <            t.start();
146 <            Thread.sleep(SHORT_DELAY_MS);
147 <            t.interrupt();
148 <            t.join();
149 <        } catch(InterruptedException ex) {
150 <            fail("unexpected exception");
151 <        }
152 <    }
153 <
154 <    public void testExchange2_InterruptedException(){
155 <        final Exchanger e = new Exchanger();
87 <        Thread t = new Thread(new Runnable() {
88 <                public void run(){
89 <                    try{
90 <                        e.exchange(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
91 <                        fail("should throw");
92 <                    } catch(InterruptedException success){
93 <                    } catch(Exception e2){
94 <                        fail("should throw IE");
95 <                    }
96 <                }
97 <            });
98 <        try{
99 <            t.start();
100 <            t.interrupt();
101 <            t.join();
102 <        } catch(InterruptedException ex){
103 <            fail("unexpected exception");
104 <        }
105 <    }
106 <
107 <    public void testExchange3_TimeOutException(){
108 <        final Exchanger e = new Exchanger();
109 <        Thread t = new Thread(new Runnable() {
110 <                public void run(){
111 <                    try{
112 <                        e.exchange(null, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
113 <                        fail("should throw");
114 <                    }catch(TimeoutException success){}
115 <                    catch(InterruptedException e2){
116 <                        fail("should throw TOE");
117 <                    }
118 <                }
119 <            });
120 <        try{
121 <            t.start();
122 <            t.join();
123 <        } catch(InterruptedException ex){
124 <            fail("unexpected exception");
125 <        }
90 >    /**
91 >     * interrupt during wait for timed exchange throws IE
92 >     */
93 >    public void testTimedExchange_InterruptedException() throws InterruptedException {
94 >        final Exchanger e = new Exchanger();
95 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
96 >            public void realRun() throws Exception {
97 >                e.exchange(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
98 >            }});
99 >
100 >        t.start();
101 >        t.interrupt();
102 >        t.join();
103 >    }
104 >
105 >    /**
106 >     * timeout during wait for timed exchange throws TOE
107 >     */
108 >    public void testExchange_TimeOutException() throws InterruptedException {
109 >        final Exchanger e = new Exchanger();
110 >        Thread t = new Thread(new CheckedRunnable() {
111 >            public void realRun() throws Exception {
112 >                try {
113 >                    e.exchange(null, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
114 >                    threadShouldThrow();
115 >                } catch (TimeoutException success) {}
116 >            }});
117 >
118 >        t.start();
119 >        t.join();
120 >    }
121 >
122 >    /**
123 >     * If one exchanging thread is interrupted, another succeeds.
124 >     */
125 >    public void testReplacementAfterExchange() throws InterruptedException {
126 >        final Exchanger e = new Exchanger();
127 >        Thread t1 = new Thread(new CheckedInterruptedRunnable() {
128 >            public void realRun() throws InterruptedException {
129 >                Object v = e.exchange(one);
130 >                threadAssertEquals(v, two);
131 >                Object w = e.exchange(v);
132 >            }});
133 >        Thread t2 = new Thread(new CheckedRunnable() {
134 >            public void realRun() throws InterruptedException {
135 >                Object v = e.exchange(two);
136 >                threadAssertEquals(v, one);
137 >                Thread.sleep(SMALL_DELAY_MS);
138 >                Object w = e.exchange(v);
139 >                threadAssertEquals(w, three);
140 >            }});
141 >        Thread t3 = new Thread(new CheckedRunnable() {
142 >            public void realRun() throws InterruptedException {
143 >                Thread.sleep(SMALL_DELAY_MS);
144 >                Object w = e.exchange(three);
145 >                threadAssertEquals(w, one);
146 >            }});
147 >
148 >        t1.start();
149 >        t2.start();
150 >        t3.start();
151 >        Thread.sleep(SHORT_DELAY_MS);
152 >        t1.interrupt();
153 >        t1.join();
154 >        t2.join();
155 >        t3.join();
156      }
157 +
158   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines