Skip to content

Commit a7f0aac

Browse files
herwinweregon
authored andcommitted
Add tests for Kernel.sleep calling the Fiber scheduler hook
1 parent af113ae commit a7f0aac

2 files changed

Lines changed: 66 additions & 0 deletions

File tree

core/fiber/fixtures/scheduler.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
module FiberSpecs
2+
3+
class LoggingScheduler
4+
attr_reader :events
5+
def initialize
6+
@events = []
7+
end
8+
9+
def block(*args)
10+
@events << { event: :block, fiber: Fiber.current, args: args }
11+
Fiber.yield
12+
end
13+
14+
def io_wait(*args)
15+
@events << { event: :io_wait, fiber: Fiber.current, args: args }
16+
Fiber.yield
17+
end
18+
19+
def kernel_sleep(*args)
20+
@events << { event: :kernel_sleep, fiber: Fiber.current, args: args }
21+
Fiber.yield
22+
end
23+
24+
def unblock(*args)
25+
@events << { event: :unblock, fiber: Fiber.current, args: args }
26+
Fiber.yield
27+
end
28+
end
29+
30+
end

core/kernel/sleep_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
require_relative '../../spec_helper'
2+
require_relative '../fiber/fixtures/scheduler'
3+
require 'fiber'
24

35
describe "Kernel#sleep" do
46
it "is a private method" do
@@ -84,6 +86,40 @@ def o.divmod(*); [0, 0.001]; end
8486
t.value.should == 5
8587
end
8688
end
89+
90+
context "Kernel.sleep with Fiber scheduler" do
91+
before :each do
92+
Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new)
93+
end
94+
95+
after :each do
96+
Fiber.set_scheduler(nil)
97+
end
98+
99+
it "calls the scheduler without arguments when no duration is given" do
100+
sleeper = Fiber.new(blocking: false) do
101+
sleep
102+
end
103+
sleeper.resume
104+
Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [] }]
105+
end
106+
107+
it "calls the scheduler with the given duration" do
108+
sleeper = Fiber.new(blocking: false) do
109+
sleep(0.01)
110+
end
111+
sleeper.resume
112+
Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [0.01] }]
113+
end
114+
115+
it "does not call the scheduler if the fiber is blocking" do
116+
sleeper = Fiber.new(blocking: true) do
117+
sleep(0.01)
118+
end
119+
sleeper.resume
120+
Fiber.scheduler.events.should == []
121+
end
122+
end
87123
end
88124

89125
describe "Kernel.sleep" do

0 commit comments

Comments
 (0)