Skip to content

Commit 9dc8dc6

Browse files
sampokuokkanenandrykonchin
authored andcommitted
Import the new ruby/spec examples for IO#wait
The three IO#wait spec files were identical to ruby/spec's, so this is only what is proposed upstream: the "with a Fiber scheduler" contexts from #1395 and the events mask example from #1396. They sit here until the next full sync picks them up. Upstream: #1395 Upstream: #1396
1 parent f5c48f5 commit 9dc8dc6

3 files changed

Lines changed: 138 additions & 0 deletions

File tree

‎library/io-wait/wait_readable_spec.rb‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require_relative '../../spec_helper'
2+
require_relative '../../core/fiber/fixtures/scheduler'
23

34
describe "IO#wait_readable" do
45
before :each do
@@ -39,4 +40,45 @@
3940
rd.close
4041
wr.close
4142
end
43+
44+
context "with a Fiber scheduler" do
45+
before :each do
46+
@read, @write = IO.pipe
47+
Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new)
48+
end
49+
50+
# An IO cannot be closed while a fiber is waiting on it, and the scheduler
51+
# leaves the fiber parked inside #io_wait, so run it out before closing.
52+
after :each do
53+
@fiber.resume while @fiber&.alive?
54+
Fiber.set_scheduler(nil)
55+
@read.close unless @read.closed?
56+
@write.close unless @write.closed?
57+
end
58+
59+
it "calls the scheduler's #io_wait with IO::READABLE and no timeout" do
60+
@fiber = Fiber.new(blocking: false) { @read.wait_readable }
61+
@fiber.resume
62+
63+
Fiber.scheduler.events.should == [
64+
{ event: :io_wait, fiber: @fiber, args: [@read, IO::READABLE, nil] }
65+
]
66+
end
67+
68+
it "passes the given timeout to the scheduler" do
69+
@fiber = Fiber.new(blocking: false) { @read.wait_readable(1) }
70+
@fiber.resume
71+
72+
Fiber.scheduler.events.should == [
73+
{ event: :io_wait, fiber: @fiber, args: [@read, IO::READABLE, 1] }
74+
]
75+
end
76+
77+
it "does not call the scheduler if the fiber is blocking" do
78+
@fiber = Fiber.new(blocking: true) { @read.wait_readable(0) }
79+
@fiber.resume
80+
81+
Fiber.scheduler.events.should == []
82+
end
83+
end
4284
end

‎library/io-wait/wait_spec.rb‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require_relative '../../spec_helper'
22
require_relative '../../fixtures/io'
3+
require_relative '../../core/fiber/fixtures/scheduler'
34

45
describe "IO#wait" do
56
before :each do
@@ -45,6 +46,11 @@
4546
@w.wait(IO::WRITABLE, 0).should_not == nil
4647
end
4748

49+
it "does not report READABLE when there is nothing to read" do
50+
events = @r.wait(IO::READABLE | IO::WRITABLE, 0) || 0
51+
(events & IO::READABLE).should == 0
52+
end
53+
4854
it "returns nil when the READABLE event is not ready during the timeout" do
4955
@w.wait(IO::READABLE, 0).should == nil
5056
end
@@ -159,4 +165,52 @@
159165
-> { @io.wait(0, :r) }.should.raise(IOError, "closed stream")
160166
end
161167
end
168+
169+
context "with a Fiber scheduler" do
170+
before :each do
171+
Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new)
172+
end
173+
174+
# An IO cannot be closed while a fiber is waiting on it, and the scheduler
175+
# leaves the fiber parked inside #io_wait, so run it out before the outer
176+
# after hook closes the pipe.
177+
after :each do
178+
@fiber.resume while @fiber&.alive?
179+
Fiber.set_scheduler(nil)
180+
end
181+
182+
it "calls the scheduler's #io_wait with the events and timeout given" do
183+
@fiber = Fiber.new(blocking: false) { @r.wait(IO::READABLE, 2) }
184+
@fiber.resume
185+
186+
Fiber.scheduler.events.should == [
187+
{ event: :io_wait, fiber: @fiber, args: [@r, IO::READABLE, 2] }
188+
]
189+
end
190+
191+
it "calls the scheduler's #io_wait with IO::READABLE when no events are given" do
192+
@fiber = Fiber.new(blocking: false) { @r.wait }
193+
@fiber.resume
194+
195+
Fiber.scheduler.events.should == [
196+
{ event: :io_wait, fiber: @fiber, args: [@r, IO::READABLE, nil] }
197+
]
198+
end
199+
200+
it "translates a mode Symbol into the matching events mask" do
201+
@fiber = Fiber.new(blocking: false) { @r.wait(0.5, :readable_writable) }
202+
@fiber.resume
203+
204+
Fiber.scheduler.events.should == [
205+
{ event: :io_wait, fiber: @fiber, args: [@r, IO::READABLE | IO::WRITABLE, 0.5] }
206+
]
207+
end
208+
209+
it "does not call the scheduler if the fiber is blocking" do
210+
@fiber = Fiber.new(blocking: true) { @r.wait(IO::READABLE, 0) }
211+
@fiber.resume
212+
213+
Fiber.scheduler.events.should == []
214+
end
215+
end
162216
end

‎library/io-wait/wait_writable_spec.rb‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require_relative '../../spec_helper'
22
require_relative '../../fixtures/io'
3+
require_relative '../../core/fiber/fixtures/scheduler'
34

45
describe "IO#wait_writable" do
56
it "waits for the IO to become writable with no timeout" do
@@ -34,4 +35,45 @@
3435
rd.close unless rd.closed?
3536
wr.close unless wr.closed?
3637
end
38+
39+
context "with a Fiber scheduler" do
40+
before :each do
41+
@read, @write = IO.pipe
42+
Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new)
43+
end
44+
45+
# An IO cannot be closed while a fiber is waiting on it, and the scheduler
46+
# leaves the fiber parked inside #io_wait, so run it out before closing.
47+
after :each do
48+
@fiber.resume while @fiber&.alive?
49+
Fiber.set_scheduler(nil)
50+
@read.close unless @read.closed?
51+
@write.close unless @write.closed?
52+
end
53+
54+
it "calls the scheduler's #io_wait with IO::WRITABLE and no timeout" do
55+
@fiber = Fiber.new(blocking: false) { @write.wait_writable }
56+
@fiber.resume
57+
58+
Fiber.scheduler.events.should == [
59+
{ event: :io_wait, fiber: @fiber, args: [@write, IO::WRITABLE, nil] }
60+
]
61+
end
62+
63+
it "passes the given timeout to the scheduler" do
64+
@fiber = Fiber.new(blocking: false) { @write.wait_writable(1) }
65+
@fiber.resume
66+
67+
Fiber.scheduler.events.should == [
68+
{ event: :io_wait, fiber: @fiber, args: [@write, IO::WRITABLE, 1] }
69+
]
70+
end
71+
72+
it "does not call the scheduler if the fiber is blocking" do
73+
@fiber = Fiber.new(blocking: true) { @write.wait_writable(0) }
74+
@fiber.resume
75+
76+
Fiber.scheduler.events.should == []
77+
end
78+
end
3779
end

0 commit comments

Comments
 (0)