summaryrefslogtreecommitdiff
path: root/spec/ruby/core/fiber/shared/scheduler.rb
blob: 19bfb75e3e13130f5ea3de28d4675ce4eef984d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
describe :scheduler, shared: true do
  it "validates the scheduler for required methods" do
    required_methods = [:block, :unblock, :kernel_sleep, :io_wait]
    required_methods.each do |missing_method|
      scheduler = Object.new
      required_methods.difference([missing_method]).each do |method|
        scheduler.define_singleton_method(method) {}
      end
      -> {
        suppress_warning { Fiber.set_scheduler(scheduler) }
      }.should raise_error(ArgumentError, /Scheduler must implement ##{missing_method}/)
    end
  end

  it "can set and get the scheduler" do
    required_methods = [:block, :unblock, :kernel_sleep, :io_wait]
    scheduler = Object.new
    required_methods.each do |method|
      scheduler.define_singleton_method(method) {}
    end
    suppress_warning { Fiber.set_scheduler(scheduler) }
    Fiber.scheduler.should == scheduler
  end

  it "returns the scheduler after setting it" do
    required_methods = [:block, :unblock, :kernel_sleep, :io_wait]
    scheduler = Object.new
    required_methods.each do |method|
      scheduler.define_singleton_method(method) {}
    end
    result = suppress_warning { Fiber.set_scheduler(scheduler) }
    result.should == scheduler
  end

  it "can remove the scheduler" do
    required_methods = [:block, :unblock, :kernel_sleep, :io_wait]
    scheduler = Object.new
    required_methods.each do |method|
      scheduler.define_singleton_method(method) {}
    end
    suppress_warning { Fiber.set_scheduler(scheduler) }
    Fiber.set_scheduler(nil)
    Fiber.scheduler.should be_nil
  end

  it "can assign a nil scheduler multiple times" do
    Fiber.set_scheduler(nil)
    Fiber.set_scheduler(nil)
    Fiber.scheduler.should be_nil
  end
end