Skip to content

Commit 8f48de0

Browse files
jscheidioquatix
authored andcommitted
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 b4a7536 commit 8f48de0

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
@@ -97,11 +97,122 @@
9797

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

0 commit comments

Comments
 (0)