|
93 | 93 |
|
94 | 94 | with "#close" do
|
95 | 95 | it "can interrupt reading fiber when closing" do
|
| 96 | + skip_unless_minimum_ruby_version("3.5") |
| 97 | + |
96 | 98 | r, w = IO.pipe
|
97 | 99 |
|
98 | 100 | read_task = Async do
|
99 |
| - r.read(5) |
100 |
| - nil |
101 |
| - rescue IOError => e |
102 |
| - e.to_s |
| 101 | + expect do |
| 102 | + r.read(5) |
| 103 | + end.to raise_exception(IOError, message: be =~ /stream closed/) |
103 | 104 | end
|
104 |
| - |
| 105 | + |
105 | 106 | r.close
|
106 |
| - |
107 |
| - expect(read_task.wait).to be == "closed stream" |
| 107 | + read_task.wait |
108 | 108 | end
|
109 |
| - |
| 109 | + |
110 | 110 | it "can interrupt reading fiber when closing from another fiber" do
|
| 111 | + skip_unless_minimum_ruby_version("3.5") |
| 112 | + |
111 | 113 | r, w = IO.pipe
|
112 |
| - |
| 114 | + |
113 | 115 | read_task = Async do
|
114 |
| - r.read(5) |
115 |
| - nil |
116 |
| - rescue IOError => e |
117 |
| - e.to_s |
| 116 | + expect do |
| 117 | + r.read(5) |
| 118 | + end.to raise_exception(IOError, message: be =~ /stream closed/) |
118 | 119 | end
|
119 |
| - |
| 120 | + |
120 | 121 | close_task = Async do
|
121 | 122 | r.close
|
122 | 123 | end
|
123 |
| - |
| 124 | + |
124 | 125 | close_task.wait
|
125 |
| - expect(read_task.wait).to be == "closed stream" |
| 126 | + read_task.wait |
126 | 127 | end
|
127 |
| - |
| 128 | + |
128 | 129 | it "can interrupt reading fiber when closing from a new thread" do
|
| 130 | + skip_unless_minimum_ruby_version("3.5") |
| 131 | + |
129 | 132 | r, w = IO.pipe
|
130 |
| - |
| 133 | + |
131 | 134 | read_task = Async do
|
132 |
| - r.read(5) |
133 |
| - nil |
134 |
| - rescue IOError => e |
135 |
| - e.to_s |
| 135 | + expect do |
| 136 | + r.read(5) |
| 137 | + end.to raise_exception(IOError, message: be =~ /stream closed/) |
136 | 138 | end
|
137 |
| - |
| 139 | + |
138 | 140 | close_thread = Thread.new do
|
139 | 141 | r.close
|
140 | 142 | end
|
141 |
| - |
| 143 | + |
142 | 144 | close_thread.value
|
143 |
| - expect(read_task.wait).to be == "closed stream" |
| 145 | + read_task.wait |
144 | 146 | end
|
145 |
| - |
| 147 | + |
146 | 148 | it "can interrupt reading fiber when closing from a fiber in a new thread" do
|
| 149 | + skip_unless_minimum_ruby_version("3.5") |
| 150 | + |
147 | 151 | r, w = IO.pipe
|
148 |
| - |
| 152 | + |
149 | 153 | read_task = Async do
|
150 |
| - r.read(5) |
151 |
| - nil |
152 |
| - rescue IOError => e |
153 |
| - e.to_s |
| 154 | + expect do |
| 155 | + r.read(5) |
| 156 | + end.to raise_exception(IOError, message: be =~ /stream closed/) |
154 | 157 | end
|
155 |
| - |
| 158 | + |
156 | 159 | close_thread = Thread.new do
|
157 | 160 | close_task = Async do
|
158 | 161 | r.close
|
159 | 162 | end
|
160 | 163 | close_task.wait
|
161 | 164 | end
|
162 |
| - |
| 165 | + |
163 | 166 | close_thread.value
|
164 |
| - expect(read_task.wait).to be == "closed stream" |
| 167 | + read_task.wait |
165 | 168 | end
|
166 |
| - |
| 169 | + |
167 | 170 | it "can interrupt reading thread when closing from a fiber" do
|
| 171 | + skip_unless_minimum_ruby_version("3.5") |
| 172 | + |
| 173 | + $stderr.puts "---------------------------------" |
168 | 174 | r, w = IO.pipe
|
169 |
| - |
| 175 | + |
170 | 176 | read_thread = Thread.new do
|
171 | 177 | Thread.current.report_on_exception = false
|
| 178 | + puts "Reading in thread #{Thread.current}" |
172 | 179 | r.read(5)
|
173 |
| - nil |
174 |
| - rescue IOError => e |
175 |
| - e.to_s |
| 180 | + ensure |
| 181 | + puts "Thread #{Thread.current} finished reading" |
176 | 182 | end
|
177 |
| - |
| 183 | + |
178 | 184 | # Wait until read_thread blocks on I/O
|
179 |
| - while read_thread.status != "sleep" |
180 |
| - sleep(0.001) |
181 |
| - end |
182 |
| - |
| 185 | + Thread.pass until read_thread.status == "sleep" |
| 186 | + |
183 | 187 | close_task = Async do
|
| 188 | + puts "Closing in fiber #{Thread.current}" |
184 | 189 | r.close
|
| 190 | + ensure |
| 191 | + puts "Closed in fiber #{Thread.current}" |
185 | 192 | end
|
186 |
| - |
| 193 | + |
187 | 194 | close_task.wait
|
188 |
| - expect(read_thread.value).to be == "closed stream" |
| 195 | + |
| 196 | + expect do |
| 197 | + read_thread.join |
| 198 | + end.to raise_exception(IOError, message: be =~ /stream closed/) |
189 | 199 | end
|
190 |
| - |
| 200 | + |
191 | 201 | it "can interrupt reading fiber in a new thread when closing from a fiber" do
|
| 202 | + skip_unless_minimum_ruby_version("3.5") |
| 203 | + |
192 | 204 | r, w = IO.pipe
|
193 |
| - |
| 205 | + |
194 | 206 | read_thread = Thread.new do
|
195 | 207 | Thread.current.report_on_exception = false
|
196 | 208 | read_task = Async do
|
197 |
| - r.read(5) |
198 |
| - nil |
199 |
| - rescue IOError => e |
200 |
| - e.to_s |
| 209 | + expect do |
| 210 | + r.read(5) |
| 211 | + end.to raise_exception(IOError, message: be =~ /stream closed/) |
201 | 212 | end
|
202 | 213 | read_task.wait
|
203 | 214 | end
|
204 |
| - |
| 215 | + |
205 | 216 | # Wait until read_thread blocks on I/O
|
206 |
| - while read_thread.status != "sleep" |
207 |
| - sleep(0.001) |
208 |
| - end |
209 |
| - |
| 217 | + Thread.pass until read_thread.status == "sleep" |
| 218 | + |
210 | 219 | close_task = Async do
|
211 | 220 | r.close
|
212 | 221 | end
|
213 | 222 | close_task.wait
|
214 |
| - |
215 |
| - expect(read_thread.value).to be == "closed stream" |
| 223 | + |
| 224 | + read_thread.value |
216 | 225 | end
|
217 | 226 | end
|
218 | 227 | end
|
0 commit comments