Skip to content

Commit d7b87fe

Browse files
committed
Add more tests for close cross-thread/fiber
Also, catch exceptions inside thread/fiber so that stderr is clean and so that we can ensure we've caught the right IOError.
1 parent 4e0b9f6 commit d7b87fe

File tree

1 file changed

+114
-3
lines changed

1 file changed

+114
-3
lines changed

test/io.rb

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,122 @@
9595

9696
read_task = Async do
9797
r.read(5)
98+
nil
99+
rescue IOError => e
100+
e.to_s
98101
end
99-
102+
100103
r.close
101-
102-
expect{read_task.wait}.to raise_exception(IOError)
104+
105+
expect(read_task.wait).to be == 'closed stream'
106+
end
107+
108+
it "can interrupt reading fiber when closing from another fiber" do
109+
r, w = IO.pipe
110+
111+
read_task = Async do
112+
r.read(5)
113+
nil
114+
rescue IOError => e
115+
e.to_s
116+
end
117+
118+
close_task = Async do
119+
r.close
120+
end
121+
122+
close_task.wait
123+
expect(read_task.wait).to be == 'closed stream'
124+
end
125+
126+
it "can interrupt reading fiber when closing from a new thread" do
127+
r, w = IO.pipe
128+
129+
read_task = Async do
130+
r.read(5)
131+
nil
132+
rescue IOError => e
133+
e.to_s
134+
end
135+
136+
close_thread = Thread.new do
137+
r.close
138+
end
139+
140+
close_thread.value
141+
expect(read_task.wait).to be == 'closed stream'
142+
end
143+
144+
it "can interrupt reading fiber when closing from a fiber in a new thread" do
145+
r, w = IO.pipe
146+
147+
read_task = Async do
148+
r.read(5)
149+
nil
150+
rescue IOError => e
151+
e.to_s
152+
end
153+
154+
close_thread = Thread.new do
155+
close_task = Async do
156+
r.close
157+
end
158+
close_task.wait
159+
end
160+
161+
close_thread.value
162+
expect(read_task.wait).to be == 'closed stream'
163+
end
164+
165+
it "can interrupt reading thread when closing from a fiber" do
166+
r, w = IO.pipe
167+
168+
read_thread = Thread.new do
169+
Thread.current.report_on_exception = false
170+
r.read(5)
171+
nil
172+
rescue IOError => e
173+
e.to_s
174+
end
175+
176+
# Wait until read_thread blocks on I/O
177+
while read_thread.status != 'sleep'
178+
sleep(0.001)
179+
end
180+
181+
close_task = Async do
182+
r.close
183+
end
184+
185+
close_task.wait
186+
expect(read_thread.value).to be == 'closed stream'
187+
end
188+
189+
it "can interrupt reading fiber in a new thread when closing from a fiber" do
190+
r, w = IO.pipe
191+
192+
read_thread = Thread.new do
193+
Thread.current.report_on_exception = false
194+
read_task = Async do
195+
r.read(5)
196+
nil
197+
rescue IOError => e
198+
e.to_s
199+
end
200+
read_task.wait
201+
end
202+
203+
# Wait until read_thread blocks on I/O
204+
while read_thread.status != 'sleep'
205+
sleep(0.001)
206+
end
207+
208+
close_task = Async do
209+
r.close
210+
end
211+
close_task.wait
212+
213+
expect(read_thread.value).to be == 'closed stream'
103214
end
104215
end
105216
end

0 commit comments

Comments
 (0)