Skip to content

Commit 3ab4773

Browse files
committed
Add tests for Kernel.sleep calling the Fiber scheduler hook
1 parent 09d73f4 commit 3ab4773

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

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
@@ -73,6 +75,40 @@ def o.divmod(*); [0, 0.001]; end
7375
t.value.should == 5
7476
end
7577
end
78+
79+
context "Kernel.sleep with Fiber scheduler" do
80+
before :each do
81+
Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new)
82+
end
83+
84+
after :each do
85+
Fiber.set_scheduler(nil)
86+
end
87+
88+
it "calls the scheduler without arguments when no duration is given" do
89+
sleeper = Fiber.new(blocking: false) do
90+
sleep
91+
end
92+
sleeper.resume
93+
Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [] }]
94+
end
95+
96+
it "calls the scheduler with the given duration" do
97+
sleeper = Fiber.new(blocking: false) do
98+
sleep(0.01)
99+
end
100+
sleeper.resume
101+
Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [0.01] }]
102+
end
103+
104+
it "does not call the scheduler if the fiber is blocking" do
105+
sleeper = Fiber.new(blocking: true) do
106+
sleep(0.01)
107+
end
108+
sleeper.resume
109+
Fiber.scheduler.events.should == []
110+
end
111+
end
76112
end
77113

78114
describe "Kernel.sleep" do

0 commit comments

Comments
 (0)